这是我的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

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

转载于:https://www.cnblogs.com/zyb993963526/p/6518954.html

Java课程设计—拿火柴小游戏相关推荐

  1. java火柴游戏_Java课程设计—拿火柴小游戏

    1 import java.awt.event.*;2 import javax.swing.*;3 importjava.util.Timer;4 importjava.util.Random;5 ...

  2. C++课程设计——猜成语小游戏

    问题描述 题目描述:成语是中国汉字语言词汇中一部分定型的词组或短句,是中国传统文化的一大特色,有固定的结构形式和固定的说法,表示一定的意义,在语句中是作为一个整体来应用的,承担主语.宾语.定语等成分. ...

  3. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc

    C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...

  4. 课程设计报告linux小游戏,嵌入式课程设计报告---贪吃蛇游戏.doc

    嵌入式课程设计报告---贪吃蛇游戏 嵌入式系统课程设计报告书 课题题目:贪吃蛇游戏 学 院:核自院 班 级:测控三班 学 号:9 姓 名: 马文铂 第一章 引言- 2 - 1.1关于题目- 2 - 1 ...

  5. 2048java课程设计报告_2048小游戏-Java-课程设计报告书

    <2048小游戏-Java-课程设计报告书>由会员分享,可在线阅读,更多相关<2048小游戏-Java-课程设计报告书(31页珍藏版)>请在金锄头文库上搜索. 1.JAVA 语 ...

  6. java课程设计拼图_java拼图游戏课程设计报告

    java拼图游戏课程设计报告 砾寸椒涩藕矾糯陋捕炬洁困喘港划舟逃豺涌锤芳喜胺递龚乏埔跺摩实阿信颊立蹲稿船纽臃瘪自康嘱脖究绢术拱虑犹犀棉宜炙转鸦半甘哨疗墓暑蛊渤幽峭咀豺虫拘召饭莽畜穗篷姿钟逻捞跨瀑拿丈土 ...

  7. Maltab GUI课程设计——贪吃蛇小游戏

    文章目录 课程设计 平台:Matlab App designer 功能实现:贪吃蛇游戏的创建与运行 目的: 演示: 代码示例: 欢迎交流 课程设计 平台:Matlab App designer 功能实 ...

  8. C++课程设计——猜谜语小游戏

    一.问题描述 二.项目流程图  三.解题思路与源码 题目可以分为三部分,根据自己的想法又增添了增加了主页面,设有开始游戏.退出游戏和游戏规则供用户选择. void menu(); //主菜单函数 vo ...

  9. JAVA课程设计——“小羊吃蓝莓”小游戏

    JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...

最新文章

  1. 编译工具 之 ant
  2. 正确的 Git 提交记录和分支模型
  3. MySQL高级 - SQL优化 - group by 优化
  4. Activity的常用方法和生命周期
  5. Java注解Annotation 完成验证
  6. Android Studio 使用教程(2)----新建工程
  7. 分库分表学习总结(3)——深入理解分布式事务
  8. bat shell 命令行中 21 的含义
  9. fastjson取某个key_JAVA学习:怎么给函数取一个“合理”的名字
  10. 论文阅读笔记(五)——FD-MOBILENET
  11. oracle必须配置哪个参数,oracle – 此操作必须将ORA-02069 global_names参数设置为TRUE...
  12. Centos7系统安装riscv-spike
  13. axis2 wsdl2java 工具_Axis2中的工具wsdl2Java
  14. 最大值减最小值等于区间长度_一文帮你弄清楚电压和电流的有效值、瞬时值、平均值、最大值及其关系...
  15. Confluence 插入符号和特殊字符
  16. Android烧录镜像文件介绍
  17. 台式计算机性能与种类,最新台式机处理器性能排行榜
  18. 中央C-高低音谱号里的中央C和其它音节
  19. Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC - apoc.periodic.iterate()过程在4.0版本中的重大变化
  20. 红灯停绿灯行c语言编程,C语言 实验三C语 实验三.doc

热门文章

  1. JAVA多线程并发Demo
  2. 应急响应典型案例分析
  3. X射线衍射特点有什么?
  4. Office 2007初体验
  5. js 弹出一个页面 html页面刷新,原生js刷新当前页面与跳转页面的几种方法及区别总结...
  6. oracle外键--详解
  7. Unity使用性能分析器
  8. 谈谈为什么需要服务治理(Dubbo)
  9. CAD下载完成之后想更大限度提高效率?这七个工具组合大有用处
  10. 第3章 为Jenkins添加静态agent节点