Java课程设计—拿火柴小游戏
这是我的Java课程设计,做的是拿火柴小游戏。要求是人机互拿火柴,拿到最后一根火柴者赢。最主要的就是处理好多线程,其他的就是添加组件啥的,那个不难,我就给出以下多线程的代码吧。
import java.awt.event.*;
import javax.swing.*;
import java.util.Timer;
import java.util.Random;
/**
* 动作监视器类
* @author zhangyubo
*/
public class Dispose implements ActionListener {
private JLabel operator1_message; //电脑或玩家1提示框
private JLabel operator2_message; //玩家或玩家2提示框
private JLabel leftMatch; //剩余火柴数
private JLabel hard_message; //末日难度提示框
private JLabel comob_message; //电脑发动连击提示框
private JButton start; //开始按钮
private JButton choose1; //玩家1端拿1根火柴按钮
private JButton choose2; //玩家1端拿2根火柴按钮
private JButton choose3; //玩家1端拿3根火柴按钮
private JButton choose4; //玩家2端拿1根火柴按钮
private JButton choose5; //玩家2端拿2根火柴按钮
private JButton choose6; //玩家2端拿3根火柴按钮
int flag; //游戏模式标志
static int game_level; //类变量游戏难度
Random random; //随机值变量
Timer timer; //计时器变量
static int number; //随机值
static int randomNumber; //随机火柴数 /**
* 获取WindowActionEvent类的提示框标签
* @param t 标签
*/
public void setMessage(JLabel...t){
operator2_message=t[0];
operator1_message=t[1];
leftMatch=t[2];
hard_message=t[3];
comob_message=t[4];
} /**
* 获取WindowActionEvent类的开始按钮
* @param s 按钮
*/
public void setButton(JButton s){
start=s;
} /**
* 获取WindowActionEvent类的6个拿火柴按钮
* @param t 按钮
*/
public void setChoose(JButton...t){
choose1=t[0];
choose2=t[1];
choose3=t[2];
choose4=t[3];
choose5=t[4];
choose6=t[5];
} public void actionPerformed(ActionEvent e){ //重写监视器事件
if(e.getActionCommand()=="开始"){ //当点击开始按钮时
start.setText("重新开始"); //start按钮输出重新开始
init(); //调用init()重置方法
}
if(flag==0&&e.getSource()==choose4) //在人机模式下点击choose4按钮
playerTake(1); //调用人机模式下玩家拿火柴方法
if(flag==0&&e.getSource()==choose5) //在人机模式下点击choose5按钮
playerTake(2); //调用人机模式玩家拿火柴方法
if(flag==0&&e.getSource()==choose6) //在人机模式下点击choose6按钮
playerTake(3); //调用人机模式下玩家拿火柴方法
if(flag==1&&e.getSource()==choose1) //在玩家模式下点击choose1按钮
player1Take(1); //调用玩家模式下玩家1拿火柴方法
if(flag==1&&e.getSource()==choose2) //在玩家模式下点击choose2按钮
player1Take(2); //调用玩家模式下玩家1拿火柴方法
if(flag==1&&e.getSource()==choose3) //在玩家模式下点击choose3按钮
player1Take(3); //调用玩家模式下玩家1拿火柴方法
if(flag==1&&e.getSource()==choose4) //在玩家模式下点击choose4按钮
player2Take(1); //调用玩家模式下玩家2拿火柴方法
if(flag==1&&e.getSource()==choose5) //在玩家模式下点击choose5按钮
player2Take(2); //调用玩家模式下玩家2拿火柴方法
if(flag==1&&e.getSource()==choose6) //在玩家模式下点击choose6按钮
player2Take(3); //调用玩家模式下玩家2拿火柴方法
if(e.getActionCommand()=="重新开始"){ //点击重新开始按钮时
init(); //调用init()重置方法
}
} /**
* 重置游戏方法
*/
public void init(){
timer=new Timer(); //实例化一个计时器的对象
random=new Random(); //创建随机值变量
comob_message.setText("");
if(flag==0) operator2_message.setText("请选择你要取走的火柴数");
//如果为人机对战模式,输出请选择你要取走的火柴数
else operator2_message.setText("请玩家2选择要取走的火柴数");
//如果为玩家对战模式,输出请玩家2选择要取走的火柴数
if(flag==0) operator1_message.setText("");
//如果为人机对战模式,清空operator1_message标签
else operator1_message.setText("请玩家1选择要取走的火柴数");
//如果为玩家对战模式,输出请玩家1选择要取走的火柴数
if(flag==1){ //如果为玩家对战模式
choose1.setVisible(true); //设置choose1按钮可见
choose2.setVisible(true); //设置choose2按钮可见
choose3.setVisible(true); //设置choose3按钮可见
choose1.setEnabled(true); //设置choose1按钮可用
choose2.setEnabled(true); //设置choose2按钮可用
choose3.setEnabled(true); //设置choose3按钮可用
}
choose4.setEnabled(true); //设置choose4按钮可用
choose5.setEnabled(true); //设置choose5按钮可用
choose6.setEnabled(true); //设置choose6按钮可用
choose4.setVisible(true); //设置choose4按钮可见
choose5.setVisible(true); //设置choose5按钮可见
choose6.setVisible(true); //设置choose6按钮可见
randomNumber=(int)(20+Math.random()*(50-20+1)); //随机生成20-50根火柴数
leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
if(flag==0){ //如果为人机对战模式
double d=Math.random(); //随机产生0-1的数
if(d>=0.5) computerTake(); //如果d>=0.5,则电脑先拿火柴
}
if(flag==1){ //如果为玩家对战模式
double d=Math.random(); //随机产生0-1的数
if(d>=0.5){ //如果d>=0.5,玩家1先拿火柴
choose4.setEnabled(false); //设置choose4不可用
choose5.setEnabled(false); //设置choose5不可用
choose6.setEnabled(false); //设置choose6不可用
}
else{ //如果d<0.5,玩家2先拿火柴
choose1.setEnabled(false); //设置choose1不可用
choose2.setEnabled(false); //设置choose2不可用
choose3.setEnabled(false); //设置choose3不可用
}
}
} /**
* 电脑拿火柴方法
*/
private void computerTake(){
choose4.setEnabled(false); //设置choose4不可用
choose5.setEnabled(false); //设置choose5不可用
choose6.setEnabled(false); //设置choose6不可用
operator1_message.setText("电脑正在取火柴:"); //输出电脑正在取火柴:
ComputerTake computertake=new ComputerTake(choose4,choose5,choose6); //创建一个ComputerTake的对象
computertake.setMessage(operator1_message,leftMatch,hard_message,comob_message); //传递标签
timer.schedule(computertake, 1000); //设定一秒后执行线程
} /**
* 人机对战模式下玩家拿火柴方法
* @param number 拿火柴数
*/
private void playerTake(int number){ //定义人机模式下的玩家拿火柴方法
hard_message.setText(""); //清空标签
comob_message.setText(""); //清空标签
operator2_message.setText("请选择你要取走的火柴数"); //输出请选择你要取走的火柴数
randomNumber=randomNumber-number; //计算出剩余火柴数
if(randomNumber<=0) { //如果当前剩余火柴数已为0
leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
JOptionPane.showMessageDialog(null, "You are the winner"); //弹出消息框
choose4.setEnabled(false); //设置choose4不可用
choose5.setEnabled(false); //设置choose5不可用
choose6.setEnabled(false); //设置choose6不可用
}
else{ //如果当前剩余火柴数不为0
leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
computerTake(); //调用电脑拿火柴方法
}
} /**
* 玩家对战模式下玩家1拿火柴方法
* @param number 拿火柴数
*/
private void player1Take(int number){ //定义玩家对战下的玩家1拿火柴方法
randomNumber=randomNumber-number; //计算剩余火柴数
if(randomNumber<=0) { //如果当前火柴数已为0
leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
JOptionPane.showMessageDialog(null, "Player1 is the winner"); //弹出消息框
choose1.setEnabled(false); //设置choose1按钮不可用
choose2.setEnabled(false); //设置choose2按钮不可用
choose3.setEnabled(false); //设置choose3按钮不可用
}
else{ //如果当前火柴数不为0
leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
choose1.setEnabled(false); //设置choose1按钮不可用
choose2.setEnabled(false); //设置choose2按钮不可用
choose3.setEnabled(false); //设置choose3按钮不可用
try{Thread.sleep(500);} //设定程序睡眠500毫秒
catch(InterruptedException e){}
choose4.setEnabled(true); //设置choose4按钮可用
choose5.setEnabled(true); //设置choose5按钮可用
choose6.setEnabled(true); //设置choose6按钮可用
}
} /**
* 玩家对战模式下玩家2拿火柴方法
* @param number 拿火柴数
*/
private void player2Take(int number){ //定义玩家对战下的玩家2拿火柴方法
randomNumber=randomNumber-number; //计算出剩余火柴数
if(randomNumber<=0) { //如果当前剩余火柴数已为0
leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
JOptionPane.showMessageDialog(null, "Player2 is the winner"); //弹出消息框
choose4.setEnabled(false); //设置choose4按钮不可用
choose5.setEnabled(false); //设置choose5按钮不可用
choose6.setEnabled(false); //设置choose6按钮不可用
}
else{ //如果当前剩余火柴数不为0
leftMatch.setText("当前还剩下"+randomNumber+"根火柴"); //输出剩余火柴数
choose4.setEnabled(false); //设置choose4按钮不可用
choose5.setEnabled(false); //设置choose5按钮不可用
choose6.setEnabled(false); //设置choose6按钮不可用
try{Thread.sleep(500);} //设定程序睡眠500毫秒
catch(InterruptedException e){}
choose1.setEnabled(true); //设置choose1按钮可用
choose2.setEnabled(true); //设置choose2按钮可用
choose3.setEnabled(true); //设置choose3按钮可用
}
}
}
Dispose
import java.util.*;
import java.util.Random;
import javax.swing.*; /**
* 实现线程功能的类
* @author zhangyubo
*
*/
public class ComputerTake extends TimerTask{ //继承TimeTask类使自己也具有线程功能
private JLabel operator1_message; //电脑或玩家1提示框
private JLabel leftMatch; //剩余火柴数
private JLabel hard_message; //末日难度提示框
private JLabel comob_message; //电脑发动连击提示框
private JButton choose4; //玩家2端拿1根火柴按钮
private JButton choose5; //玩家2端拿2根火柴按钮
private JButton choose6; //玩家2端拿3根火柴按钮
private Random random; //随机值变量
private int number; //随机值
private int probability; //电脑发动连击时的概率 /**
* 获取WindowActionEvent中的按钮
* @param t 按钮
*/
ComputerTake(JButton...t){
choose4=t[0];
choose5=t[1];
choose6=t[2];
} /**
* 获取WindowActionEvent中的标签
* @param t 标签
*/
public void setMessage(JLabel...t){
operator1_message=t[0];
leftMatch=t[1];
hard_message=t[2];
comob_message=t[3];
} public void run(){
random=new Random(); //创建随机值
Dispose.number=random.nextInt(3)+1; //随机得到1-3的值并赋给Dispose的类变量number
operator1_message.setText("电脑取走了"+Dispose.number+"根火柴"); //输出电脑拿走的火柴数
Dispose.randomNumber=Dispose.randomNumber-Dispose.number; //计算剩余火柴数
if(Dispose.randomNumber<=3&&Dispose.game_level==1)//如果火柴数小于4并且在末日人机游戏难度下
{
probability=random.nextInt(6)+1; //产生1-6的随机数
if(probability>=3) //如果随机数大于2,电脑发动连击
{
Dispose.number=random.nextInt(3)+1; //产生1-3的随机数
comob_message.setText("电脑发动了连击并多拿了"+Dispose.number+"根火柴!"); //输出电脑发动了连击
Dispose.randomNumber=Dispose.randomNumber-Dispose.number; //计算出剩余火柴数
}
}
if(Dispose.randomNumber<=0){ //如果当前火柴数已为0
leftMatch.setText("当前还剩下0根火柴"); //输出当前还剩下0根火柴
JOptionPane.showMessageDialog(null, "Computer is the winner"); //弹出消息框
choose4.setEnabled(false); //设置choose4不可用
choose5.setEnabled(false); //设置choose5不可用
choose6.setEnabled(false); //设置choose6不可用
}
else{ //如果当前火柴数不为0
leftMatch.setText("当前还剩下"+Dispose.randomNumber+"根火柴"); //输出剩余火柴数
choose4.setEnabled(true); //设置choose4可用
choose5.setEnabled(true); //设置choose5可用
choose6.setEnabled(true); //设置choose6可用
if(Dispose.game_level==1) //如果为末日人机难度
{
number=random.nextInt(3)+1; //随机产生1-3的随机数
if(number==1) choose4.setEnabled(false); //如果为1,按钮1不可用
if(number==2) choose5.setEnabled(false); //如果为2,按钮2不可用
if(number==3) choose6.setEnabled(false); //如果为3,按钮3不可用
if(number==1) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
+ "吗?此次<br>您不可以选择拿走 1<br>根火柴!</body></html>");
if(number==2) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
+ "吗?此次<br>您不可以选择拿走 2<br>根火柴!</body></html>");
if(number==3) hard_message.setText("<html><body>感受到被末日人机支<br>配的恐惧了"
+ "吗?此次<br>您不可以选择拿走 3<br>根火柴!</body></html>");
//使用html输出文本
}
}
}
}
ComputerTake
这个就是我运行时的界面。
Java课程设计—拿火柴小游戏的更多相关文章
- JAVA课程设计+五子棋(团队博客)
JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...
- Java 课程设计 "Give it up"小游戏(团队)
JAVA课程设计 "永不言弃"小游戏(From :Niverse) 通过Swing技术创建游戏的登陆注册界面,使用mySQL数据库技术完成用户的各项信息保存和游戏完成后的成绩保存. ...
- JAVA课程设计——“小羊吃蓝莓”小游戏
JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...
- Java课程设计——猜数游戏(201521123111 陈伟泽)
Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...
- JAVA课程设计——团队博客
JAVA课程设计--团队博客 1. 团队名称.团队成员介绍(需要有照片) 团队名称:"小羊吃蓝莓"小游戏 团队成员介绍: 成员 班级 学号 廖怡洁 网络1513 201521123 ...
- Java课程设计(2019版)
参考资料 Java课程设计参考资料(2018-12-26更新) Java课程设计常见问题(程序部署.数据库.JSP) 项目开发参考-阿里巴巴Java开发手册(正式版) 更多参考资料请查看QQ群文件中的 ...
- java课程设计(计算器)
JAVA课程 设 计 报 告 1206401-18 瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...
- java课程设计--猜数字(团队博客)
java课程设计--猜数字(团队博客) 1.团队名称以及团队成员介绍 团队名称:cz 团队成员:陈伟泽,詹昌锦 团队照片: 2.项目git地址 http://git.oschina.net/Devil ...
- Java课程设计—学生成绩管理系统(201521123004-林艺如)
1.团队课程设计博客 团队课程设计博客链接 2.个人负责模块或任务说明 ①.Menu Menu.jsp 在页面中给出提示,用HTML的 MenuTeacher.jsp 利用Menu.jsp进行具体化完 ...
随机推荐
- Python高阶函数(Map、Reduce、Filter)
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明 比如我们有一个函数f(x)=x2,要把这个函数作用 ...
- decltype类型声明- 现代C++新特性总结
decltype类型声明 有时会遇到这样的情况:希望从表达式的类型推断出要定义的变量的类型,但不想用该表达式的值去初始化变量.为了满足这一需求,C++11引入了decltype,它的作用是选择并返回操 ...
- Spark Core(三)Executor上是如何launch task(转载)
1. 启动任务 在前面一篇博客中(Driver 启动.分配.调度Task)介绍了Driver是如何调动.启动任务的,Driver向Executor发送了LaunchTask的消息,Executor接收 ...
- Centos 设置zookeeper开机自启动
把zookeeper做成服务 1.进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本 [root@zookeeper ~]# cd /etc/rc.d/init.d/ [ro ...
- 主成分分析 PCA算法原理
对同一个体进行多项观察时,必定涉及多个随机变量X1,X2,…,Xp,它们都是的相关性, 一时难以综合.这时就需要借助主成分分析 (principal component analysis)来概括诸多信 ...
- 做报表需要知道的基本的SQL语句
为客户做报表需要操作数据库,基本的SQL是必须要掌握的,下面介绍做报表最常用的SQL语句. 方法/步骤 1 查询数据:编号表示查询顺序. (8) select (9) distinct (11 ...
- Integer类之缓存
在开始详细的说明问题之前,我们先看一段代码 1 public static void compare1(){ 2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = ...
- 论文笔记:语音情感识别(三)手工特征+CRNN
一:Emotion Recognition from Human Speech Using Temporal Information and Deep Learning(2018 InterSpeec ...
- Python: attrgetter()函数: 排序不支持原生比较的对象
问题: 想排序类型相同的对象,但是他们不支持原生的比较操作. answer: 内置的sorted()函数有一个关键字参数key,可传入一个callable对象给它 这个callabel对象对每个传入的 ...
- 【前端开发】利用Fiddler抓包工具进行本地调试
解决什么问题: 解决前端在本地联调页面 || 样式 || 脚本时经常修改服务器代码,浪费太多时间. 避免多人同时修改代码产生冲突问题.可以在本地调完代码之后,再贴到服务器上. 其实这个问题老早就开始想 ...