Java实现掷骰子控制台和窗体两种方法

本文实例为大家分享了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.掷骰子窗体实现
【Java实现掷骰子控制台和窗体两种方法】窗体程序思路和控制台一样,只是把显示界面由控制台改为窗体。
类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 cmb; private JButton btn; private JLabel labResult; private static List imgs = new ArrayList(); 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(); 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("\n你本次押的"+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)); } }// publicint 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; }//}

Java实现掷骰子控制台和窗体两种方法
文章图片

Java实现掷骰子控制台和窗体两种方法
文章图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读