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.掷骰子窗体实现
窗体程序思路和控制台一样,只是把显示界面由控制台改为窗体。类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('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));} }// 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; }// }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章:
