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

 更新时间:2021年08月10日 17:07:50   作者:sinadrew  
这篇文章主要为大家详细介绍了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;
  }//      
}

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

相关文章

  • Java基础之堆内存溢出的解决

    Java基础之堆内存溢出的解决

    这篇文章主要介绍了Java基础之堆内存溢出的解决,文中有非常详细的图文示例及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • java 判断两个时间段是否重叠的案例

    java 判断两个时间段是否重叠的案例

    这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java连接SqlServer错误的完美解决方法

    Java连接SqlServer错误的完美解决方法

    我们在做Java或者C#连接数据库的时候,常常遇到连接SqlServer失败的问题,明明检查了好几遍代码没问题了,还是连接不上,下面这篇文章主要给大家介绍了关于Java连接SqlServer错误的完美解决方法,需要的朋友可以参考下
    2023-04-04
  • springboot 正确的在异步线程中使用request的示例代码

    springboot 正确的在异步线程中使用request的示例代码

    这篇文章主要介绍了springboot中如何正确的在异步线程中使用request,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Eclipse操作SVN时中断锁定,文件的解锁方法

    Eclipse操作SVN时中断锁定,文件的解锁方法

    这篇文章主要介绍了Eclipse操作SVN时中断锁定,文件的解锁方法,需要的朋友可以参考下
    2014-08-08
  • Java的包装类特性总结

    Java的包装类特性总结

    这篇文章主要介绍Java的包装类的一些特性,包装类的作用,哪些类属于包装类等,文中有详细的代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • IDEA无法打开Marketplace的三种解决方案(推荐)

    IDEA无法打开Marketplace的三种解决方案(推荐)

    这篇文章主要介绍了IDEA无法打开Marketplace的三种解决方案(推荐),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java中instanceOf关键字的用法及特性详解

    Java中instanceOf关键字的用法及特性详解

    当我们在进行向下转型时,如果两个对象之间没有直接或间接的继承关系,在转换时有可能会产生强制类型转换异常,我们可以使用java中自带的instanceOf关键字来解决这个问题,所以本篇文章,会带大家学习instanceOf的用法及特性,需要的朋友可以参考下
    2023-05-05
  • 详细解读Java编程中面向字符的输入流

    详细解读Java编程中面向字符的输入流

    这篇文章主要介绍了Java中面向字符的输入和输出流,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 一文带你掌握Spring Security框架的使用

    一文带你掌握Spring Security框架的使用

    Spring Security是一款基于Spring框架的认证和授权框架,提供了一系列控制访问和保护应用程序的功能,本文将会对Spring Security框架进行全面详细的讲解,需要的可以参考下
    2023-05-05

最新评论