本文实例为大家分享了Java控制台和窗体实现掷骰子的具体代码,供大家参考,具体内容如下
程序目标:同时3掷骰子,让骰子转动若干次后停下来的正面朝上的数字之和大于9 则为大,小于等于9则为小
用于需要提前选择押大还是小,程序结束返回是否押中的结果。
1.掷骰子控制台实现
本程序分为三层:
- 表示层 :用类Player2 实现
- 业务逻辑层:类DiceGame2 实现
- 数据/技术服务层:类Dice2 实现
Dice2 类 实现Runnable接口,重新run()方法来设置每个骰子转动10次 ,并在停下来后获取正面朝上的值。
DiceGame2 类中创建三个线程来模拟同时掷3个骰子,并能在在骰子转动结束后得到总点数和每个骰子的点数。
其中roll()方法开启线程, result()计算点数
Player2 类 主函数创建菜单,提示用户输入操作。并在控制台显示结果。
代码如下:
public class Player2 { //表示层 public static void main(String[] args) throws InterruptedException { Scanner sc = new Scanner(System.in); while (true) { System.out.println("**************掷 骰 子 游 戏***************"); System.out.println("请输入0表示押小,输入1表示押大,输入2表示退出"); int i = sc.nextInt(); if(i == 2) System.exit(0); DiceGame2 d = new DiceGame2(); d.roll(); Thread.sleep(500);// 主线程等待 int n = d.result(); if (i == 0 && n <= 9) System.out.println("恭喜你,押小赢了"); else if (i == 0 && n > 9) System.out.println("很遗憾,押小输了"); else if (i == 1 && n > 9) System.out.println("恭喜你,押大赢了"); else if (i == 1 && n <= 9) System.out.println("很遗憾,押大输了"); System.out.println(); } } } class DiceGame2 { //业务逻辑层 Dice2 d1, d2, d3; public DiceGame2() { } public void roll() { // 同时三个掷骰子 d1 = new Dice2(); d2 = new Dice2(); d3 = new Dice2(); Thread t1 = new Thread(d1); Thread t2 = new Thread(d2); Thread t3 = new Thread(d3); t1.start(); t2.start(); t3.start(); } public int result() { // 计算点数 int sum = 0; int i = d1.getUpNum(); int j = d2.getUpNum(); int k = d3.getUpNum(); sum = i + j + k; System.out.println("掷得点数和为:" + sum + " [" + i + " - " + j + " - " + k + " ]"); return sum; }// } class Dice2 implements Runnable { // 骰子类 数据/技术服务层 private int upnum; public Dice2() { this.upnum = 1; } @Override public void run() { int count = 10;// 设置每颗骰子转动10次 while (count > 0) { upnum = new Random().nextInt(6) + 1; System.out.println(Thread.currentThread().getName() + " " + upnum); count--; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } public int getUpNum() { return upnum; } }
2.掷骰子窗体实现
窗体程序思路和控制台一样,只是把显示界面由控制台改为窗体。
类SiziGame extends JFrame implements ActionListener
类IconThread implements Runnable
首先,SiziGame类通过构造器初始化设置窗体和里面控件,并且把代表6种点数的图片加载到imgs集合里面,还要给开始按钮绑定监听事件函数。
其次,重写actionPerformed()函数,来实现按钮触发3个骰子转动。在这个函数里开始3个线程让骰子图片转动起来,并在转动结束后计算机每个骰子显示图片对应的点数和总点数。再根据用户之前选择的押大或押小返回输赢结果。
然后,IconThread 类重写run()方法,来实现图片的动态效果。通过随机生成[0-6)的随机整数作为imgs集合的index,再根据索引从imgs里取对应的图片显示在窗体上,由于线程运行速度较快,且设置了多次取图片的动作从而形成了动态效果。注意的是集合下标为[0-5],所以在SiziGame类中的result()方法计算点数时要+1。
public class SiziGame extends JFrame implements ActionListener{ private JLabel lb1; private JLabel lb2; private JLabel lb3; private JLabel lbNote; private JComboBox<String> cmb; private JButton btn; private JLabel labResult; private static List<Icon> imgs = new ArrayList<Icon>(); IconThread it1,it2,it3; Thread t1,t2,t3; public static void main(String[] args) { new SiziGame(); } public SiziGame(){ this.setLocationRelativeTo(null); this.setBounds(200, 50, 380, 297); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); getContentPane().setLayout(null); this.setResizable(false); lb1 = new JLabel(""); lb1.setIcon(new ImageIcon( getClass().getResource("img/a.jpg"))); lb1.setBounds(30, 30, 96, 96); getContentPane().add(lb1); lb2 = new JLabel(""); lb2.setIcon(new ImageIcon( getClass().getResource("img/a.jpg"))); lb2.setBounds(136, 30, 96, 96); getContentPane().add(lb2); lb3 = new JLabel(""); lb3.setIcon(new ImageIcon( getClass().getResource("img/a.jpg"))); lb3.setBounds(242, 30, 96, 96); getContentPane().add(lb3); lbNote = new JLabel("押"); lbNote.setBounds(40, 200, 30, 30); getContentPane().add(lbNote); cmb = new JComboBox<String>(); cmb.setBounds(80, 200, 60, 30); getContentPane().add(cmb); cmb.addItem("大"); cmb.addItem("小"); btn = new JButton("START"); btn.setBounds(220, 190, 100, 50); btn.addActionListener(this); getContentPane().add(btn); labResult = new JLabel("结果"); //结果 labResult.setBounds(136, 156, 126, 27); getContentPane().add(labResult); this.setVisible(true); imgs.add(new ImageIcon(getClass().getResource("img/1.gif"))); imgs.add(new ImageIcon(getClass().getResource("img/2.gif"))); imgs.add(new ImageIcon(getClass().getResource("img/3.gif"))); imgs.add(new ImageIcon(getClass().getResource("img/4.gif"))); imgs.add(new ImageIcon(getClass().getResource("img/5.gif"))); imgs.add(new ImageIcon(getClass().getResource("img/6.gif"))); it1 = new IconThread(lb1, imgs); it2 = new IconThread(lb2, imgs); it3 = new IconThread(lb3, imgs); t1 = new Thread(it1); t2 = new Thread(it2); t3 = new Thread(it3); }// public void thread(){ /*IconThread it1 = new IconThread(lb1, imgs); IconThread it2 = new IconThread(lb2, imgs); IconThread it3 = new IconThread(lb3, imgs); Thread t1 = new Thread(it1); Thread t2 = new Thread(it2); Thread t3 = new Thread(it3);*/ it1 = new IconThread(lb1, imgs); it2 = new IconThread(lb2, imgs); it3 = new IconThread(lb3, imgs); t1 = new Thread(it1); t2 = new Thread(it2); t3 = new Thread(it3); /* t1.start(); t2.start(); t3.start(); try { t1.join(); t2.join(); t3.join(); } catch (InterruptedException e) {}*/ } @Override public void actionPerformed(ActionEvent args) { String ya = cmb.getSelectedItem().toString(); System.out.println(" 你本次押的"+ya); thread(); t1.start(); t2.start(); t3.start(); try { t1.join(); t2.join(); t3.join(); } catch (InterruptedException e) {} int i = result(lb1); int j = result(lb2); int k = result(lb3); int sum = i + j + k; System.out.println("掷得点数和为:" + sum + " [" + i + " - " + j + " - " + k + " ]"); try { Thread.sleep(1000); } catch (InterruptedException e) {} if (sum > 9 && "大".equals(ya) || sum <= 9 && "小".equals(ya)) { labResult.setText("赢"); labResult.setForeground(Color.GREEN); labResult.setFont(new Font("宋体", Font.BOLD, 30)); } else { labResult.setText("输"); labResult.setForeground(Color.red); labResult.setFont(new Font("宋体", Font.BOLD, 30)); } }// public int result(JLabel lab) { Icon icon = lab.getIcon();// 获取当前骰子图片 int sum = 0; for (int i = 0; i < imgs.size(); i++) { if (icon.equals(imgs.get(i))) { //取出和lab最后图片对应的点数 sum += (i + 1); break; } } return sum; }// }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sinadrew/article/details/52861358