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;
  }//
}

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

(0)

相关推荐

  • Java编写掷骰子游戏

    废话不多说了,直接奔主题. **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱. 分析:这个题目要求灵活运用多线程的相关知识,达到点击开始按钮时,有3个线程启动,分别控制3颗骰子的转动,在3颗骰子全部转完以后,回到主线程计算游戏结果. //个

  • Java实现的简单掷骰子游戏示例

    本文实例讲述了Java实现的简单掷骰子游戏.分享给大家供大家参考,具体如下: 要求: 掷两个骰子,每个骰子有六面, 分别为1.2.3.4.5.6.检查这两个骰子的和. 如果为2.3或12你就输了:如果和是7或者11你就赢了. 但如果和是其他数字(例如4.5.6.8.9或者10), 就确定了一个点.继续掷骰子直至抛出一个7或者 掷出和刚才相同的点数.如果掷出的是7,你就输了. 如果掷出的点数和你前一次掷出的点数相同, 你就赢了. java实现代码: enum Status { Win, Lose,

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

    本文实例为大家分享了Java控制台和窗体实现掷骰子的具体代码,供大家参考,具体内容如下 程序目标:同时3掷骰子,让骰子转动若干次后停下来的正面朝上的数字之和大于9 则为大,小于等于9则为小 用于需要提前选择押大还是小,程序结束返回是否押中的结果. 1.掷骰子控制台实现 本程序分为三层: 表示层 :用类Player2 实现 业务逻辑层:类DiceGame2 实现 数据/技术服务层:类Dice2 实现 Dice2 类 实现Runnable接口,重新run()方法来设置每个骰子转动10次 ,并在停下来

  • 使用Java构造和解析Json数据的两种方法(详解二)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法

  • 使用Java构造和解析Json数据的两种方法(详解一)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法

  • Java 在PDF中添加条形码的两种方法

    条形码,是由宽度不等的多个黑条和空白所组成,用以表达一组信息的图形标识符.通过给文档添加条形码,可以直观,快捷地访问和分享一些重要的信息.本文就将通过使用Java程序来演示如何在PDF文档中添加Codebar.Code128A和Code39条形码.除此之外,还可支持创建Code11.Code128B.Code32.Code39 Extended .Code93和Code93 Extended条形码. 使用工具:Free Spire.PDF for Java(免费版) Jar文件获取及导入: 方法

  • Java 在PDF中绘制形状的两种方法

    在我们编辑PDF文档的过程中,有时候需要在文档中添加一些如多边形.矩形.椭圆形之类的图形,而Free Spire PDF for Java 则正好可以帮助我们在Java程序中通过代码在PDF文档中绘制形状,以及设置形状边线颜色和填充色. Jar包导入 方法一:下载Free Spire.PDF for Java包并解压缩,然后将lib文件夹下的Spire.Pdf.jar包作为依赖项导入到Java应用程序中 方法二:直接通过Maven仓库安装JAR包,配置pom.xml文件的代码如下: <repos

  • Java字符串的压缩与解压缩的两种方法

    应用场景 当字符串太长, 需要将字符串值存入数据库时,如果字段长度不够,则会出现插入失败: 或者需要进行Http传输时,由于参数长度过长造成http传输失败等. 字符串压缩与解压方法 方法一:用 Java8中的gzip /** * 使用gzip压缩字符串 * @param str 要压缩的字符串 * @return */ public static String compress(String str) { if (str == null || str.length() == 0) { retu

  • Java多线程实战之交叉打印的两种方法

    要求效果:先打印5次"printA-",再打印5次"printB-",每次打印间隔1秒,重复循环20次 方式一:使用wait()和notifyAll()方法 public class MyService { private volatile boolean flag = false; public synchronized void printA() { try { while (flag) { wait(); } for (int i = 0; i < 5;

  • 总结Java对象被序列化的两种方法

    Java对象为什么需要被序列化 序列化能够将对象转为二进制流,对象就可以方便的在网络中被传输和保存. 实现序列化的方式 实现Serializable接口 实现Externalizable接口 **这两个接口的区别是:**Serializable接口会自动给对象的所有属性标记为可被序列化.而Externalizable接口默认不给任何属性标记可被序列化,如果需要序列化,需要重写两个方法,分别是writeExternal()和readExternal(),然后在这两个方法中标记需要被序列化的对象属性

  • 使用java获取md5值的两种方法

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,是一种比较常用的哈希算法. java中可以用两种方法实现,我们先说麻烦一点的,代码: 复制代码 代码如下: public class md5_test { //MD5的字符串常量 private final static String[] hexDigits = { "0", "1", "2", "3"

随机推荐