




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java擲骰子實驗報告一 設計任務與設計目標描述1創(chuàng)建一個用于模擬擲骰子游戲的應用程序。2游戲者滾動3個骰子,每個骰子有6個面,分別代表1,2,3,4,5,6六個點。3當骰子停下后,計算這3個骰子上表面的點數和。如果擲出的點數和大于或等于11,則為大;如果點數和為小于等于10,則為小。4.玩游戲時需要先押大小,押中則勝利,否則失敗。程序模塊分析:1. 界面設計2. 圖形顯示3. 產生三個隨機數4. 輸贏的條件判斷5. 使用表格記錄輸贏二主要對象/數據結構 界面設計 設計思想要求界面上可以顯示三個骰子,有開始按鈕,下注按鈕,有一表格記錄輸贏數據。要求布局合理,美觀,便于游戲者使用。 具體代碼如下
2、:public class MainFrame extends JFrame private JLabel lab1;private JLabel lab2;private JLabel lab3;private JLabel labwin;private JComboBox box;private JTextField field;public static void main(String args) MainFrame main=new MainFrame();main.ShowUI();public MainFrame() / 構造函數lab1 = new JLabel();lab2
3、= new JLabel();lab3 = new JLabel();field=new JTextField(10);field.setEditable(false);labwin=new JLabel("勝率");三 主要算法1. 產生隨機數的算法產生隨機數主要使用java.util.Random類,如下面所示,ran = new Random()實例化一個Random對象來分別產生三個隨機數。并使用while來不停地切換骰子點數,直至點擊暫停按鈕具體代碼如下: public class MyThread extends Thread private int a;/a,
4、b,c分別記錄圖片的索引,1就表示骰子1.private int b;private int c;private Random ran;/ 用于隨機產生數字private boolean flag = true;/循環(huán)進行的條件private JLabel lab1;private JLabel lab2;private JLabel lab3;public MyThread(JLabel lab1, JLabel lab2, JLabel lab3) / TODO Auto-generated constructor stubran = new Random();/ 實例化random對象t
5、his.lab1=lab1;this.lab2=lab2;this.lab3=lab3;/this表示這個類中的lab;public void diceRun() throws InterruptedException a = ran.nextInt(6) + 1;b = ran.nextInt(6) + 1;c = ran.nextInt(6) + 1;/產生0-6之間的隨機整數while (flag) lab1.setIcon(new ImageIcon("img/" + a + ".gif");/給lab設置iconlab2.setIcon(new
6、 ImageIcon("img/" + b + ".gif");lab3.setIcon(new ImageIcon("img/" + c + ".gif");Thread.sleep(100);/讓線程睡眠100ms,用于控制圖片切換的速度a = ran.nextInt(6) + 1;b = ran.nextInt(6) + 1;c = ran.nextInt(6) + 1; Override/* * 從父類繼承下來的方法,線程啟動就調用這個方法 */public void run() try diceRun()
7、; catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();2. 輸贏的條件判斷 首先,點擊下注按鈕,選擇大或小,然后點擊開始,骰子就開始不停地切換,直至點擊暫停按鈕,1-9為小,11-18為大。 具體代碼如下:public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getActionCommand().equals("暫停") num+;/按下暫停表示進行
8、了一次th.setFlag(false);/跳出線程中的循環(huán),使圖片切換終止ImageIcon x = new ImageIcon("img/ans" + th.getA() + ".gif");ImageIcon y = new ImageIcon("img/ans" + th.getB() + ".gif");ImageIcon z = new ImageIcon("img/ans" + th.getC() + ".gif");String ans = "失敗&
9、quot;if (th.getA() + th.getB() + th.getC() > 11 && sel.equals("押大")| (th.getA() + th.getB() + th.getC() <= 11 && sel.equals("押小") /判斷大小的標準ans = "勝利"winnum+;/成功次數+1JOptionPane.showMessageDialog(null, "恭喜,你贏了");/彈出對話框elseJOptionPane.showMes
10、sageDialog(null, "你輸了,請再接再厲"); winrate=(double)winnum/num)*100;Vector em = new Vector();/將這次擲的三張圖片加入vector,并在table中以一行顯示em.add(x);em.add(y);em.add(z);em.add(ans);ve.add(em);SwingUtilities.updateComponentTreeUI(jt);/刷新表格field.setText(""+fomat.format(winrate)+"%");but.set
11、ActionCommand("開始");/實現(xiàn)暫停和開始之間的轉換but.setText("開始");else if (e.getActionCommand().equals("開始") sel = (String) box.getSelectedItem();th = new MyThread(lab1, lab2, lab3);th.start();/線程開始but.setActionCommand("暫停");but.setText("暫停");3使用表格記錄輸贏數據 MytableMod
12、el 來繼承DefaultTableMode類,來設計table模式。具體代碼如下: public class MyTableModel extends DefaultTableModel /* * 自定義構造函數 * param cells:單元格元素 * param columnNames:列名 */public MyTableModel(Vector cells, Vector<String> columnNames) super(cells, columnNames); /* * * param columnNames:列名 * param col:列數 */public
13、MyTableModel(Object columnNames, int col) / TODO Auto-generated constructor stubsuper(columnNames, col); /* * 實現(xiàn)父類的方法,表示以列為單位設置顯示的類型,主要是實現(xiàn)圖片的現(xiàn)實 */public Class<?> getColumnClass(int col) Vector<Object> v = (Vector<Object>) super.dataVector.elementAt(0);/調用父類成員變量中的第一行if (v.elementAt(
14、col) != null) return v.elementAt(col).getClass();else return "".getClass();Overridepublic int getColumnCount() / TODO Auto-generated method stubreturn 4;/表示顯示4行Overridepublic boolean isCellEditable(int rowIndex, int columnIndex) / TODO Auto-generated method stubreturn false;/表示不可編輯四 運行結果六五
15、 源代碼清單 package guo;import java.awt.CheckboxGroup;import java.awt.Font;import java.util.Vector;import javax.swing.GroupLayout.Group;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;imp
16、ort javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextField;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;public class MainFrame extends JFrame private JLabel lab1;private JLabel lab2;private JLabel lab3;private JLabel labwin;private JComboBo
17、x box;private JTextField field;public static void main(String args) MainFrame main=new MainFrame();main.ShowUI();public MainFrame() / 構造函數lab1 = new JLabel();lab2 = new JLabel();lab3 = new JLabel();field=new JTextField(10);field.setEditable(false);labwin=new JLabel("勝率");public void ShowUI
18、() try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (UnsupportedLookAndFeelException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (InstantiationException e) / TODO Au
19、to-generated catch blocke.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch blocke.printStackTrace();box=new JComboBox(new String"押大","押小");/設置下拉菜單;box.setFocusable(false);Font font=new Font("楷體", 0, 20);/設置字體格式box.setFont(font);box.setAlig
20、nmentX(CENTER_ALIGNMENT);this.setTitle("我的骰子");this.setLayout(null);/ 使用setbounds來控制位置this.setDefaultCloseOperation(3);/ 設置關閉窗口退出程序this.setSize(300, 400);lab1.setIcon(new ImageIcon("img/1.gif");lab1.setBounds(20, 20, 40, 40);this.add(lab1);lab2.setIcon(new ImageIcon("img/1.g
21、if");lab2.setBounds(120, 20, 40, 40);this.add(lab2);lab3.setIcon(new ImageIcon("img/1.gif");lab3.setBounds(220, 20, 40, 40);labwin.setBounds(20, 70, 30, 30);labwin.setFont(new Font("宋體", 0, 15);field.setBounds(60, 75, 50, 20);field.setHorizontalAlignment(JTextField.RIGHT);/設
22、置右對齊field.setText("%");this.add(lab3);Vector<String> names=new Vector<String>();/表頭數組names.add("1號");names.add("2號");names.add("3號");names.add("結果");Vector<Vector> ve=new Vector<Vector>();/向量,長度可變的數組JTable table=new JTable(new
23、 MyTableModel(ve,names);/新建一個表格,采用自己的Tablemodeltable.setRowHeight(30);JScrollPane pane=new JScrollPane(table);/滾動條JButton but=new JButton("開始");but.setActionCommand("開始");pane.setBounds(20,110,240,150);/設置坐標but.setBounds(170, 300,80,40);but.setFocusable(false);box.setBounds(30, 3
24、00, 80, 40);this.add(but);this.add(pane);this.add(box);this.setLocationRelativeTo(null);this.add(field);this.add(labwin);/新建監(jiān)聽器,將需要的對象通過構造函數傳過去MyListen lis=new MyListen(lab1, lab2, lab3, ve, but, table,box,field);but.addActionListener(lis);/給按鈕添加監(jiān)聽器this.setVisible(true);package guo;import java.awt.I
25、mage;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.DecimalFormat;import java.text.NumberFormat;import java.util.Random;import java.util.Vector;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JLabel;impo
26、rt javax.swing.JOptionPane;import javax.swing.JTable;import javax.swing.JTextField;import javax.swing.SwingUtilities;public class MyListen implements ActionListener private JLabel lab1;private JLabel lab2;private JLabel lab3;private Random ran;private Vector ve;/用于設置表格內容的容器private JButton but;privat
27、e JTable jt;private MyThread th;private int num = 0;/統(tǒng)計總共運行的次數private int winnum = 0;/計數,記錄猜對的次數private double winrate = 0;/計算勝率private JComboBox box;private String sel;/記錄jcombox中選擇的值private JTextField field;/用于顯示勝率的文本區(qū)域private NumberFormat fomat;/用于格式化勝率的顯示方式public MyListen(JLabel lab1, JLabel lab
28、2, JLabel lab3, Vector ve,JButton but, JTable jt, JComboBox box,JTextField field) / TODO Auto-generated constructor stubthis.lab1 = lab1;this.lab2 = lab2;this.lab3 = lab3;this.box = box;this.ve = ve;ran = new Random();this.but = but;this.jt = jt;this.field=field;fomat=new DecimalFormat();/實例化fomat.s
29、etMaximumFractionDigits(2);/表示小數部分最多兩位Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getActionCommand().equals("暫停") num+;/按下暫停表示進行了一次th.setFlag(false);/跳出線程中的循環(huán),使圖片切換終止ImageIcon x = new ImageIcon("img/ans" + th.getA() + ".gif"
30、);ImageIcon y = new ImageIcon("img/ans" + th.getB() + ".gif");ImageIcon z = new ImageIcon("img/ans" + th.getC() + ".gif");String ans = "失敗"if (th.getA() + th.getB() + th.getC() > 11 && sel.equals("押大")| (th.getA() + th.getB() + t
31、h.getC() <= 11 && sel.equals("押小") /判斷大小的標準ans = "勝利"winnum+;/成功次數+1JOptionPane.showMessageDialog(null, "恭喜,你贏了");/彈出對話框elseJOptionPane.showMessageDialog(null, "你輸了,請再接再厲"); winrate=(double)winnum/num)*100;Vector em = new Vector();/將這次擲的三張圖片加入vector
32、,并在table中以一行顯示em.add(x);em.add(y);em.add(z);em.add(ans);ve.add(em);SwingUtilities.updateComponentTreeUI(jt);/刷新表格field.setText(""+fomat.format(winrate)+"%");but.setActionCommand("開始");/實現(xiàn)暫停和開始之間的轉換but.setText("開始");else if (e.getActionCommand().equals("開始
33、") sel = (String) box.getSelectedItem();th = new MyThread(lab1, lab2, lab3);th.start();/線程開始but.setActionCommand("暫停");but.setText("暫停");package guo;import java.util.Vector;import javax.swing.table.DefaultTableModel;/* * table model繼承DefaultTableModel,用來設計table的模式 * author z
34、rq * */public class MyTableModel extends DefaultTableModel /* * 自定義構造函數 * param cells:單元格元素 * param columnNames:列名 */public MyTableModel(Vector cells, Vector<String> columnNames) super(cells, columnNames); /* * * param columnNames:列名 * param col:列數 */public MyTableModel(Object columnNames, int
35、 col) / TODO Auto-generated constructor stubsuper(columnNames, col); /* * 實現(xiàn)父類的方法,表示以列為單位設置顯示的類型,主要是實現(xiàn)圖片的現(xiàn)實 */public Class<?> getColumnClass(int col) Vector<Object> v = (Vector<Object>) super.dataVector.elementAt(0);/調用父類成員變量中的第一行if (v.elementAt(col) != null) return v.elementAt(col
36、).getClass();else return "".getClass();Overridepublic int getColumnCount() / TODO Auto-generated method stubreturn 4;/表示顯示4行Overridepublic boolean isCellEditable(int rowIndex, int columnIndex) / TODO Auto-generated method stubreturn false;/表示不可編輯package guo;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JLabel;public class MyThread extends Thread private int a;/a,b,c分別記錄圖片的索引,1就表示骰子1.private int b;private int c;private Random ran;/ 用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主體水電合同范本
- 參數設計合同范本
- 租賃會議室合同范本
- 冬儲保價合同范本
- 轉讓精裝修房產合同范本
- 合同范本與格式合同區(qū)別
- 鋁合金分銷合同范本
- 吧臺轉讓合同范本
- 廠內工程裝修合同范本
- 倉庫燈具回收合同范例
- 2023年山東化工職業(yè)學院單招綜合素質考試筆試題庫及答案解析
- 廣東省廣州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細及行政區(qū)劃代碼
- 綠化移植施工方案及技術措施
- 江蘇省三級綜合醫(yī)院評審標準實施細則2017版
- 貴州區(qū)域地質地史概述
- 監(jiān)理大綱維修改造項目
- 中國著名的塔課件
- 邢臺市區(qū)土地級別及基準地價表
- 李小建《經濟地理學》(電子版)
- 中央空調安裝施工組織設計方案(水、多聯(lián)機)
- 2022年最新蘇教版五年級下冊科學全冊教案
評論
0/150
提交評論