Java實(shí)驗(yàn)報(bào)告-扔骰子_第1頁
Java實(shí)驗(yàn)報(bào)告-扔骰子_第2頁
Java實(shí)驗(yàn)報(bào)告-扔骰子_第3頁
Java實(shí)驗(yàn)報(bào)告-扔骰子_第4頁
Java實(shí)驗(yàn)報(bào)告-扔骰子_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Java擲骰子實(shí)驗(yàn)報(bào)告一 設(shè)計(jì)任務(wù)與設(shè)計(jì)目標(biāo)描述1創(chuàng)建一個(gè)用于模擬擲骰子游戲的應(yīng)用程序。2游戲者滾動3個(gè)骰子,每個(gè)骰子有6個(gè)面,分別代表1,2,3,4,5,6六個(gè)點(diǎn)。3當(dāng)骰子停下后,計(jì)算這3個(gè)骰子上表面的點(diǎn)數(shù)和。如果擲出的點(diǎn)數(shù)和大于或等于11,則為大;如果點(diǎn)數(shù)和為小于等于10,則為小。4.玩游戲時(shí)需要先押大小,押中則勝利,否則失敗。程序模塊分析:1. 界面設(shè)計(jì)2. 圖形顯示3. 產(chǎn)生三個(gè)隨機(jī)數(shù)4. 輸贏的條件判斷5. 使用表格記錄輸贏二主要對象/數(shù)據(jù)結(jié)構(gòu) 界面設(shè)計(jì) 設(shè)計(jì)思想要求界面上可以顯示三個(gè)骰子,有開始按鈕,下注按鈕,有一表格記錄輸贏數(shù)據(jù)。要求布局合理,美觀,便于游戲者使用。 具體代碼如下

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() / 構(gòu)造函數(shù)lab1 = new JLabel();lab2

3、= new JLabel();lab3 = new JLabel();field=new JTextField(10);field.setEditable(false);labwin=new JLabel("勝率");三 主要算法1. 產(chǎn)生隨機(jī)數(shù)的算法產(chǎn)生隨機(jī)數(shù)主要使用java.util.Random類,如下面所示,ran = new Random()實(shí)例化一個(gè)Random對象來分別產(chǎn)生三個(gè)隨機(jī)數(shù)。并使用while來不停地切換骰子點(diǎn)數(shù),直至點(diǎn)擊暫停按鈕具體代碼如下: public class MyThread extends Thread private int a;/a,

4、b,c分別記錄圖片的索引,1就表示骰子1.private int b;private int c;private Random ran;/ 用于隨機(jī)產(chǎn)生數(shù)字private boolean flag = true;/循環(huán)進(jì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();/ 實(shí)例化random對象t

5、his.lab1=lab1;this.lab2=lab2;this.lab3=lab3;/this表示這個(gè)類中的lab;public void diceRun() throws InterruptedException a = ran.nextInt(6) + 1;b = ran.nextInt(6) + 1;c = ran.nextInt(6) + 1;/產(chǎn)生0-6之間的隨機(jī)整數(shù)while (flag) lab1.setIcon(new ImageIcon("img/" + a + ".gif");/給lab設(shè)置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/* * 從父類繼承下來的方法,線程啟動就調(diào)用這個(gè)方法 */public void run() try diceRun()

7、; catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();2. 輸贏的條件判斷 首先,點(diǎn)擊下注按鈕,選擇大或小,然后點(diǎn)擊開始,骰子就開始不停地切換,直至點(diǎn)擊暫停按鈕,1-9為小,11-18為大。 具體代碼如下:public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getActionCommand().equals("暫停") num+;/按下暫停表示進(jìn)行

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("押小") /判斷大小的標(biāo)準(zhǔn)ans = "勝利"winnum+;/成功次數(shù)+1JOptionPane.showMessageDialog(null, "恭喜,你贏了");/彈出對話框elseJOptionPane.showMes

10、sageDialog(null, "你輸了,請?jiān)俳釉賲?quot;); 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("開始");/實(shí)現(xiàn)暫停和開始之間的轉(zhuǎ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使用表格記錄輸贏數(shù)據(jù) MytableMod

12、el 來繼承DefaultTableMode類,來設(shè)計(jì)table模式。具體代碼如下: public class MyTableModel extends DefaultTableModel /* * 自定義構(gòu)造函數(shù) * param cells:單元格元素 * param columnNames:列名 */public MyTableModel(Vector cells, Vector<String> columnNames) super(cells, columnNames); /* * * param columnNames:列名 * param col:列數(shù) */public

13、MyTableModel(Object columnNames, int col) / TODO Auto-generated constructor stubsuper(columnNames, col); /* * 實(shí)現(xiàn)父類的方法,表示以列為單位設(shè)置顯示的類型,主要是實(shí)現(xiàn)圖片的現(xiàn)實(shí) */public Class<?> getColumnClass(int col) Vector<Object> v = (Vector<Object>) super.dataVector.elementAt(0);/調(diào)用父類成員變量中的第一行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;/表示不可編輯四 運(yùn)行結(jié)果六五

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() / 構(gòu)造函數(shù)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"押大","押小");/設(shè)置下拉菜單;box.setFocusable(false);Font font=new Font("楷體", 0, 20);/設(shè)置字體格式box.setFont(font);box.setAlig

20、nmentX(CENTER_ALIGNMENT);this.setTitle("我的骰子");this.setLayout(null);/ 使用setbounds來控制位置this.setDefaultCloseOperation(3);/ 設(shè)置關(guān)閉窗口退出程序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);/設(shè)

22、置右對齊field.setText("%");this.add(lab3);Vector<String> names=new Vector<String>();/表頭數(shù)組names.add("1號");names.add("2號");names.add("3號");names.add("結(jié)果");Vector<Vector> ve=new Vector<Vector>();/向量,長度可變的數(shù)組JTable table=new JTable(new

23、 MyTableModel(ve,names);/新建一個(gè)表格,采用自己的Tablemodeltable.setRowHeight(30);JScrollPane pane=new JScrollPane(table);/滾動條JButton but=new JButton("開始");but.setActionCommand("開始");pane.setBounds(20,110,240,150);/設(shè)置坐標(biāo)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)聽器,將需要的對象通過構(gòu)造函數(shù)傳過去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;/用于設(shè)置表格內(nèi)容的容器private JButton but;privat

27、e JTable jt;private MyThread th;private int num = 0;/統(tǒng)計(jì)總共運(yùn)行的次數(shù)private int winnum = 0;/計(jì)數(shù),記錄猜對的次數(shù)private double winrate = 0;/計(jì)算勝率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();/實(shí)例化fomat.s

29、etMaximumFractionDigits(2);/表示小數(shù)部分最多兩位Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getActionCommand().equals("暫停") num+;/按下暫停表示進(jìn)行了一次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("押小") /判斷大小的標(biāo)準(zhǔn)ans = "勝利"winnum+;/成功次數(shù)+1JOptionPane.showMessageDialog(null, "恭喜,你贏了");/彈出對話框elseJOptionPane.showMessageDialog(null, "你輸了,請?jiān)俳釉賲?quot;); 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("開始");/實(shí)現(xiàn)暫停和開始之間的轉(zhuǎ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,用來設(shè)計(jì)table的模式 * author z

34、rq * */public class MyTableModel extends DefaultTableModel /* * 自定義構(gòu)造函數(shù) * param cells:單元格元素 * param columnNames:列名 */public MyTableModel(Vector cells, Vector<String> columnNames) super(cells, columnNames); /* * * param columnNames:列名 * param col:列數(shù) */public MyTableModel(Object columnNames, int

35、 col) / TODO Auto-generated constructor stubsuper(columnNames, col); /* * 實(shí)現(xiàn)父類的方法,表示以列為單位設(shè)置顯示的類型,主要是實(shí)現(xiàn)圖片的現(xiàn)實(shí) */public Class<?> getColumnClass(int col) Vector<Object> v = (Vector<Object>) super.dataVector.elementAt(0);/調(diào)用父類成員變量中的第一行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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論