• Java课程设计—拿火柴小游戏


    这是我的Java课程设计,做的是拿火柴小游戏。要求是人机互拿火柴,拿到最后一根火柴者赢。最主要的就是处理好多线程,其他的就是添加组件啥的,那个不难,我就给出以下多线程的代码吧。

      1 import java.awt.event.*;
      2 import javax.swing.*;
      3 import java.util.Timer;
      4 import java.util.Random;
      5 /**
      6  * 动作监视器类
      7  * @author zhangyubo
      8  */
      9 public class Dispose implements ActionListener {
     10     private JLabel operator1_message; //电脑或玩家1提示框
     11     private JLabel operator2_message; //玩家或玩家2提示框
     12     private JLabel leftMatch; //剩余火柴数
     13     private JLabel hard_message; //末日难度提示框
     14     private JLabel comob_message; //电脑发动连击提示框
     15     private JButton start; //开始按钮
     16     private JButton choose1; //玩家1端拿1根火柴按钮
     17     private JButton choose2; //玩家1端拿2根火柴按钮
     18     private JButton choose3; //玩家1端拿3根火柴按钮
     19     private JButton choose4; //玩家2端拿1根火柴按钮
     20     private JButton choose5; //玩家2端拿2根火柴按钮
     21     private JButton choose6; //玩家2端拿3根火柴按钮
     22     int flag; //游戏模式标志
     23     static int  game_level; //类变量游戏难度
     24     Random random; //随机值变量
     25     Timer timer; //计时器变量
     26     static int number; //随机值
     27     static int randomNumber; //随机火柴数
     28     
     29     /**
     30      * 获取WindowActionEvent类的提示框标签
     31      * @param t 标签
     32      */
     33     public void setMessage(JLabel...t){
     34         operator2_message=t[0];
     35         operator1_message=t[1];
     36         leftMatch=t[2];
     37         hard_message=t[3];
     38         comob_message=t[4];
     39     }
     40     
     41     /**
     42      * 获取WindowActionEvent类的开始按钮
     43      * @param s 按钮
     44      */
     45     public void setButton(JButton s){ 
     46         start=s;
     47     }
     48     
     49     /**
     50      * 获取WindowActionEvent类的6个拿火柴按钮
     51      * @param t 按钮
     52      */
     53     public void setChoose(JButton...t){ 
     54         choose1=t[0];
     55         choose2=t[1];
     56         choose3=t[2];
     57         choose4=t[3];
     58         choose5=t[4];
     59         choose6=t[5];
     60     }
     61     
     62     public void actionPerformed(ActionEvent e){ //重写监视器事件
     63         if(e.getActionCommand()=="开始"){ //当点击开始按钮时
     64             start.setText("重新开始"); //start按钮输出重新开始
     65             init(); //调用init()重置方法
     66         }
     67         if(flag==0&&e.getSource()==choose4) //在人机模式下点击choose4按钮
     68             playerTake(1); //调用人机模式下玩家拿火柴方法
     69         if(flag==0&&e.getSource()==choose5) //在人机模式下点击choose5按钮
     70             playerTake(2); //调用人机模式玩家拿火柴方法
     71         if(flag==0&&e.getSource()==choose6) //在人机模式下点击choose6按钮
     72             playerTake(3); //调用人机模式下玩家拿火柴方法
     73         if(flag==1&&e.getSource()==choose1) //在玩家模式下点击choose1按钮
     74             player1Take(1); //调用玩家模式下玩家1拿火柴方法
     75         if(flag==1&&e.getSource()==choose2) //在玩家模式下点击choose2按钮
     76             player1Take(2); //调用玩家模式下玩家1拿火柴方法
     77         if(flag==1&&e.getSource()==choose3) //在玩家模式下点击choose3按钮
     78             player1Take(3); //调用玩家模式下玩家1拿火柴方法
     79         if(flag==1&&e.getSource()==choose4) //在玩家模式下点击choose4按钮
     80             player2Take(1); //调用玩家模式下玩家2拿火柴方法
     81         if(flag==1&&e.getSource()==choose5) //在玩家模式下点击choose5按钮
     82             player2Take(2); //调用玩家模式下玩家2拿火柴方法
     83         if(flag==1&&e.getSource()==choose6) //在玩家模式下点击choose6按钮
     84             player2Take(3); //调用玩家模式下玩家2拿火柴方法
     85         if(e.getActionCommand()=="重新开始"){ //点击重新开始按钮时
     86             init(); //调用init()重置方法
     87         }
     88     }
     89     
     90     /**
     91      * 重置游戏方法
     92      */
     93     public void init(){
     94         timer=new Timer(); //实例化一个计时器的对象
     95         random=new Random(); //创建随机值变量
     96         comob_message.setText("");
     97         if(flag==0) operator2_message.setText("请选择你要取走的火柴数");
     98         //如果为人机对战模式,输出请选择你要取走的火柴数
     99         else        operator2_message.setText("请玩家2选择要取走的火柴数");
    100         //如果为玩家对战模式,输出请玩家2选择要取走的火柴数
    101         if(flag==0) operator1_message.setText("");
    102         //如果为人机对战模式,清空operator1_message标签
    103         else        operator1_message.setText("请玩家1选择要取走的火柴数");
    104         //如果为玩家对战模式,输出请玩家1选择要取走的火柴数
    105         if(flag==1){ //如果为玩家对战模式
    106             choose1.setVisible(true); //设置choose1按钮可见
    107             choose2.setVisible(true); //设置choose2按钮可见
    108             choose3.setVisible(true); //设置choose3按钮可见
    109             choose1.setEnabled(true); //设置choose1按钮可用
    110             choose2.setEnabled(true); //设置choose2按钮可用
    111             choose3.setEnabled(true); //设置choose3按钮可用
    112         }
    113         choose4.setEnabled(true); //设置choose4按钮可用
    114         choose5.setEnabled(true); //设置choose5按钮可用
    115         choose6.setEnabled(true); //设置choose6按钮可用
    116         choose4.setVisible(true); //设置choose4按钮可见
    117         choose5.setVisible(true); //设置choose5按钮可见
    118         choose6.setVisible(true); //设置choose6按钮可见
    119         randomNumber=(int)(20+Math.random()*(50-20+1)); //随机生成20-50根火柴数
    120         leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
    121         if(flag==0){ //如果为人机对战模式
    122             double d=Math.random(); //随机产生0-1的数
    123             if(d>=0.5)  computerTake(); //如果d>=0.5,则电脑先拿火柴
    124         }
    125         if(flag==1){ //如果为玩家对战模式
    126             double d=Math.random(); //随机产生0-1的数
    127             if(d>=0.5){ //如果d>=0.5,玩家1先拿火柴
    128                 choose4.setEnabled(false); //设置choose4不可用
    129                 choose5.setEnabled(false); //设置choose5不可用
    130                 choose6.setEnabled(false); //设置choose6不可用
    131             }
    132             else{ //如果d<0.5,玩家2先拿火柴
    133                 choose1.setEnabled(false); //设置choose1不可用
    134                 choose2.setEnabled(false); //设置choose2不可用
    135                 choose3.setEnabled(false); //设置choose3不可用
    136             }
    137         }
    138     }
    139     
    140     /**
    141      * 电脑拿火柴方法
    142      */
    143     private void computerTake(){
    144         choose4.setEnabled(false); //设置choose4不可用
    145         choose5.setEnabled(false); //设置choose5不可用
    146         choose6.setEnabled(false); //设置choose6不可用
    147         operator1_message.setText("电脑正在取火柴:"); //输出电脑正在取火柴:
    148         ComputerTake computertake=new ComputerTake(choose4,choose5,choose6); //创建一个ComputerTake的对象
    149         computertake.setMessage(operator1_message,leftMatch,hard_message,comob_message); //传递标签
    150         timer.schedule(computertake, 1000);  //设定一秒后执行线程
    151     }
    152     
    153     /**
    154      * 人机对战模式下玩家拿火柴方法
    155      * @param number 拿火柴数
    156      */
    157     private void playerTake(int number){ //定义人机模式下的玩家拿火柴方法
    158         hard_message.setText(""); //清空标签
    159         comob_message.setText(""); //清空标签
    160         operator2_message.setText("请选择你要取走的火柴数"); //输出请选择你要取走的火柴数
    161         randomNumber=randomNumber-number; //计算出剩余火柴数
    162         if(randomNumber<=0) { //如果当前剩余火柴数已为0
    163             leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
    164             JOptionPane.showMessageDialog(null, "You are the winner"); //弹出消息框
    165             choose4.setEnabled(false); //设置choose4不可用
    166             choose5.setEnabled(false); //设置choose5不可用
    167             choose6.setEnabled(false); //设置choose6不可用
    168         }
    169         else{ //如果当前剩余火柴数不为0
    170             leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
    171             computerTake(); //调用电脑拿火柴方法
    172         }
    173     }
    174     
    175     /**
    176      * 玩家对战模式下玩家1拿火柴方法
    177      * @param number 拿火柴数
    178      */
    179     private void player1Take(int number){ //定义玩家对战下的玩家1拿火柴方法
    180         randomNumber=randomNumber-number; //计算剩余火柴数
    181         if(randomNumber<=0) { //如果当前火柴数已为0
    182             leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
    183             JOptionPane.showMessageDialog(null, "Player1 is the winner"); //弹出消息框
    184             choose1.setEnabled(false); //设置choose1按钮不可用
    185             choose2.setEnabled(false); //设置choose2按钮不可用
    186             choose3.setEnabled(false); //设置choose3按钮不可用
    187         }
    188         else{ //如果当前火柴数不为0
    189             leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
    190             choose1.setEnabled(false); //设置choose1按钮不可用
    191             choose2.setEnabled(false); //设置choose2按钮不可用
    192             choose3.setEnabled(false); //设置choose3按钮不可用
    193             try{Thread.sleep(500);} //设定程序睡眠500毫秒
    194             catch(InterruptedException e){}
    195             choose4.setEnabled(true); //设置choose4按钮可用
    196             choose5.setEnabled(true); //设置choose5按钮可用
    197             choose6.setEnabled(true); //设置choose6按钮可用
    198         }
    199     }
    200     
    201     /**
    202      * 玩家对战模式下玩家2拿火柴方法
    203      * @param number 拿火柴数
    204      */
    205     private void player2Take(int number){ //定义玩家对战下的玩家2拿火柴方法
    206         randomNumber=randomNumber-number; //计算出剩余火柴数
    207         if(randomNumber<=0) { //如果当前剩余火柴数已为0
    208             leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
    209             JOptionPane.showMessageDialog(null, "Player2 is the winner"); //弹出消息框
    210             choose4.setEnabled(false); //设置choose4按钮不可用
    211             choose5.setEnabled(false); //设置choose5按钮不可用
    212             choose6.setEnabled(false); //设置choose6按钮不可用
    213         }
    214         else{ //如果当前剩余火柴数不为0
    215             leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
    216             choose4.setEnabled(false); //设置choose4按钮不可用
    217             choose5.setEnabled(false); //设置choose5按钮不可用
    218             choose6.setEnabled(false); //设置choose6按钮不可用
    219             try{Thread.sleep(500);} //设定程序睡眠500毫秒
    220             catch(InterruptedException e){}
    221             choose1.setEnabled(true); //设置choose1按钮可用
    222             choose2.setEnabled(true); //设置choose2按钮可用
    223             choose3.setEnabled(true); //设置choose3按钮可用
    224         }
    225     }
    226 }
    Dispose
     1 import java.util.*;
     2 import java.util.Random;
     3 import javax.swing.*;
     4 
     5 /**
     6  * 实现线程功能的类
     7  * @author zhangyubo
     8  *
     9  */
    10 public class ComputerTake extends TimerTask{ //继承TimeTask类使自己也具有线程功能
    11     private JLabel operator1_message; //电脑或玩家1提示框
    12     private JLabel leftMatch; //剩余火柴数
    13     private JLabel hard_message; //末日难度提示框
    14     private JLabel comob_message; //电脑发动连击提示框
    15     private JButton choose4; //玩家2端拿1根火柴按钮
    16     private JButton choose5; //玩家2端拿2根火柴按钮
    17     private JButton choose6; //玩家2端拿3根火柴按钮
    18     private Random random; //随机值变量
    19     private int number; //随机值
    20     private int probability; //电脑发动连击时的概率
    21     
    22     /**
    23      * 获取WindowActionEvent中的按钮 
    24      * @param t 按钮
    25      */
    26     ComputerTake(JButton...t){ 
    27             choose4=t[0];
    28             choose5=t[1];
    29             choose6=t[2];
    30     }
    31     
    32     /**
    33      * 获取WindowActionEvent中的标签
    34      * @param t 标签
    35      */
    36     public void setMessage(JLabel...t){
    37         operator1_message=t[0];
    38         leftMatch=t[1];
    39         hard_message=t[2];
    40         comob_message=t[3];
    41     }
    42     
    43     public void run(){
    44         random=new Random(); //创建随机值
    45         Dispose.number=random.nextInt(3)+1; //随机得到1-3的值并赋给Dispose的类变量number
    46         operator1_message.setText("电脑取走了"+Dispose.number+"根火柴"); //输出电脑拿走的火柴数
    47         Dispose.randomNumber=Dispose.randomNumber-Dispose.number; //计算剩余火柴数
    48         if(Dispose.randomNumber<=3&&Dispose.game_level==1)//如果火柴数小于4并且在末日人机游戏难度下
    49         {
    50             probability=random.nextInt(6)+1; //产生1-6的随机数
    51             if(probability>=3) //如果随机数大于2,电脑发动连击
    52             {
    53                 Dispose.number=random.nextInt(3)+1; //产生1-3的随机数
    54                 comob_message.setText("电脑发动了连击并多拿了"+Dispose.number+"根火柴!"); //输出电脑发动了连击
    55                 Dispose.randomNumber=Dispose.randomNumber-Dispose.number; //计算出剩余火柴数
    56             }
    57         }
    58         if(Dispose.randomNumber<=0){ //如果当前火柴数已为0
    59             leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
    60             JOptionPane.showMessageDialog(null, "Computer is the winner"); //弹出消息框
    61             choose4.setEnabled(false); //设置choose4不可用
    62             choose5.setEnabled(false); //设置choose5不可用
    63             choose6.setEnabled(false); //设置choose6不可用
    64         }
    65         else{ //如果当前火柴数不为0
    66             leftMatch.setText("当前还剩下"+Dispose.randomNumber+"根火柴"); //输出剩余火柴数
    67             choose4.setEnabled(true); //设置choose4可用
    68             choose5.setEnabled(true); //设置choose5可用
    69             choose6.setEnabled(true); //设置choose6可用
    70             if(Dispose.game_level==1) //如果为末日人机难度
    71             {
    72                 number=random.nextInt(3)+1; //随机产生1-3的随机数
    73                 if(number==1)   choose4.setEnabled(false); //如果为1,按钮1不可用
    74                 if(number==2)   choose5.setEnabled(false); //如果为2,按钮2不可用
    75                 if(number==3)   choose6.setEnabled(false); //如果为3,按钮3不可用
    76                 if(number==1) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
    77                         + "吗?此次<br>您不可以选择拿走 1<br>根火柴!</body></html>");
    78                 if(number==2) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
    79                         + "吗?此次<br>您不可以选择拿走 2<br>根火柴!</body></html>");
    80                 if(number==3) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
    81                         + "吗?此次<br>您不可以选择拿走 3<br>根火柴!</body></html>");
    82                 //使用html输出文本
    83             }
    84         }
    85     }
    86 }
    ComputerTake

    这个就是我运行时的界面。

  • 相关阅读:
    java:编写jar包加密工具,防止反编译
    Linux:CentOS-7常用命令
    MyBatis:MyBatis-Plus条件构造器EntityWrapper
    SpringBoot:SpringBoot项目的配置文件放在Jar包外加载
    机械学习导
    如何選擇最佳的 Wi-Fi 無線網路頻道,獲得最佳的傳輸速度(转载)
    解决ubuntu下filezilla登录ftp看不到中文目录和文件的问题 (转载)
    输入前几个字母,用箭头就能找出开头字母相同的历史命史
    Linux系统下使用split命令分割大文件 (转载)
    删除文件时排除特定文件 (转载)
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6518954.html
Copyright © 2020-2023  润新知