版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java掷骰子实验报告一 设计任务与设计目标描述1创建一个用于模拟掷骰子游戏的应用程序。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;/循环进行的条件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);/跳出线程中的循环,使图片切换终止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("开始");/实现暂停和开始之间的转换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); /* * 实现父类的方法,表示以列为单位设置显示的类型,主要是实现图片的现实 */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);/新建监听器,将需要的对象通过构造函数传过去MyListen lis=new MyListen(lab1, lab2, lab3, ve, but, table,box,field);but.addActionListener(lis);/给按钮添加监听器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;/统计总共运行的次数private int winnum = 0;/计数,记录猜对的次数private double winrate = 0;/计算胜率private JComboBox box;private String sel;/记录jcombox中选择的值private JTextField field;/用于显示胜率的文本区域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);/跳出线程中的循环,使图片切换终止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("开始");/实现暂停和开始之间的转换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); /* * 实现父类的方法,表示以列为单位设置显示的类型,主要是实现图片的现实 */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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新职业服务协议模板(2024年)
- DB11∕T 1705-2019 农业机械作业规范 青饲料收获机
- 2024年企业新员工劳动协议细则
- 2024电子商务平台服务居间协议
- 2024美发沙龙个人聘用协议样本
- 2024挖掘机购销协议范本
- 2024智能家居设备安装服务协议
- 2024年度纪录片后期制作服务协议
- 夫妻双方房产分割自愿离婚协议格式
- 2024物业管理室内装修协议
- 大唐之美通用模板
- ABS装置湿法挤出机系统存在的问题研究及对策的中期报告
- 《肉牛营养需要》教学课件
- 网易云音乐用户满意度调查问卷
- 雪佛兰爱唯欧说明书
- 经营分析报告案例-麦肯锡风格
- 2023春国开会计实务专题形考任务1-4题库及答案汇总
- 可疑值的取舍-Q检验法
- 生物信息学(上海海洋大学)知到章节答案智慧树2023年
- 核磁共振T临床应用
- 文件与文件夹测试题(含参考答案)
评论
0/150
提交评论