java火柴游戏课程设计报告文档格式.docx
《java火柴游戏课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《java火柴游戏课程设计报告文档格式.docx(24页珍藏版)》请在冰点文库上搜索。
![java火柴游戏课程设计报告文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/7cb9e50a-21ee-437e-b266-0fa2e8d95487/7cb9e50a-21ee-437e-b266-0fa2e8d954871.gif)
1.2技术原理1
二、概要设计1
三、详细设计
3.1程序类2
3.2主要代码2
四、测试10
五、收获和体会12
六、参考文献12
需求分析
1.1设计要求程序随机产生20—50根火柴,由人与计算机轮流拿,每次拿的数量不超过3根,拿到最后一根为胜。
(使用图形界面)
1.2技术原理
该游戏程序设计的主要内容是使用java中的各种组件与容器互相搭配来完成的一个小游戏。
游戏设计中的主要的知识要点包括java的awt包中的颜色类,图形类,图像类,事件监听器类,和util包中的stack类,timer类,和timertask类的使用方法,以及swing包中的窗口类,按钮类,标签类,面板类,复选框类等一些常用组件的用法。
通过这些组件来掌握事件监听器的用法,java中栈的用法,以及实现了Runnable类的TimerTask类的用法,通过这个类实现线程技术,还有Graphics类中的主要方法的使用,学会运用这些方法来来绘制火柴,绘制图片的目的。
概要设计
1.设置随机数的范围
2.获取随机数
3.设计出人性化的图形界面
4.给予不同的提示完成游戏
三、详细设计
3.1程序类
'
..±
PackageEnplorer或
-j_r(.defaultpackage.)
dmJRESystemLibraryJc-iSE-17'
-<
■>
»
resourcesjar-D:
\Pro^ramFile£
\Java^jre#
>
园rtjar-D:
\Pragrafn
0辰已jn「-D:
\PrQgr3mFifC5\Java\jfe7\Jibo畐j-csjar-D:
\Programfiles\Java\jre7\lib
p@thar^tsjar-D;
\P「t?
gymFiles\Java\jrcA
D邑jfrjar-D:
\ProgramFile&
\Java\jre7\Jlb
©
wacce^-bridge.jflrD:
-,Frcg「日=1匚ikf后阳l>
邑dnsnsjar-D:
\ProgramFiles\Java^re7\lib
Oiojsrce^s.j^r-P:
P「cig「力mF:
leClx..于jr「7\l「
4星localedatajar-D^ProgramFltes\Java\jr<
jB邑^unecjar-D:
\ProgramRtfre\Iava\jre7\libT
■oiaeunjce_provid^r.jar-■-”二:
织:
爲sunmstapijsrC;
[:
了ug『mTi刁鬥皿乩]丘oh-suripkcslljar-L.-,-f.:
c:
lp.?
<
i三三.j?
de
■eiiziph.j^r?
:
^-ogrf!
nFijre?
Jib\t
图3.1程序类
3.2主要代码
importjava.awt.Color;
//引入颜色类
importjava.awt.Component;
importjava.awt.Dimension;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
//引入组件类
//弓I入封装单个对象中组件的宽度和高度(精确到整数)的类
//引入图形类
//引入二维图形类
importjava.awt.event.ActionEvent;
//引入事件类
importjava.awt.event.ActionListener;
//引入事件监听器类
importjava.awt.image.Bufferedlmage;
//引入缓冲图像类
importjava.util.Stack;
importjava.util.Timer;
importjava.util.TimerTask;
//引入栈类
//引入计时器类
//引入了实现Runnable接口的类,并具有了线程的功能
importjavax.swing.JButton;
//引入按钮类
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
//引入下拉列表框类
//引入主框架主窗口类
//引入标签类
importjavax.swing.JOptionPane;
//引入选项面板类
publicclassha//定义一个公共的主类Test
{
publicstaticvoidmain(String[]args)//定义主方法main
newha();
//调用Test类的构造方法Test()
}
private
static
final
int
MIN_CNT=20;
//定义一个常量,设置为最小火柴棍数量
为20
MAX_CNT=50;
//
定义一个常量,
设置为最大火柴棍数量
为50
MAX_TAKE=3;
设置为最大拿火柴数量
为3
DELAY=1000;
设置为延迟时间为1000
privateJFramemainFrame;
//定义主框架变量
privateMyPaintPanel[]paints;
//定义我自己画的面板数组变量
privateJButtonuserBtn;
//定义我的按钮属性
privateJComboBoxuserNum;
//定义我的下拉列表
privateJButtoncompBtn;
//定义电脑按钮属性
privateJLabelcompTxt;
//定义电脑标签
privateTimertimer;
//定义计时器的变量
privateha()//定义一个私有的构造方法,来完成游戏的初始化动作
mainFrame=newJFrame();
//实例化一个主窗口
mainFrame.setResizable(false);
//设置窗体大小不可调整
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置默认
的关闭操作为关闭窗口
JPanelmainPanel=newJPanel();
//实例化一个主面板对象
mainPanel.setLayout(null);
//设置布局为空,即没有任何布局
mainPanel.setPreferredSize(newDimension(600,400));
//将组件的首选大小
设置为常量值
mainFrame.add(mainPanel);
//将主面板添加到框架(窗口)中
JLabellab11=newJLabel("
电脑”);
//创建并设置标签按钮的内容为电脑lab11.setHorizontalAlignment(JLabel.CENTEFR;
//设置标签内容沿X轴的对
齐方式
lab11.setBounds(0,10,200,20);
//设置该标签显示位置为坐标(0,10),宽
200,高20
mainPanel.add(lab11);
//将标签加入主面板
JButtonbtn11=newJButton("
Reset"
);
//定义一个重新来的按钮
btn11.addActionListener(newActionListener()//为“Reset1添加行为事件监
听器,采用匿名类的方式
@Override
publicvoidactionPerformed(ActionEvente)//实现监听器中的方法
init();
//当单击此按钮时,调用该初始化方法
});
btn11.setBounds(250,10,100,20);
//设置重置按钮的位置,左上角坐标为(250,10),大小为宽100,高20
mainPanel.add(btn11);
//重来标签添加到主面板上
JLabellab12=newJLabel("
用户"
//定义用户标签
lab12.setHorizontalAlignment(JLabel.CENTER);
//设置用户水平方式为居中lab12.setBounds(400,10,200,20);
//设置用户标签的位置,左上角坐标为
(400,10),大小为宽200,高20
mainPanel.add(lab12);
//将用户标签添加到主面板上
compBtn=newJButton("
ComputerFirst"
//定义一个电脑首先拿的按钮compBtn.addActionListener(newActionListener()//为电脑开始按钮定义行为事件监听器
publicvoidactionPerformed(ActionEvente)//行为监听器中的默认方法
compTake();
//当单击电脑按钮时,调用电脑拿方法
compBtn.setBounds(10,40,180,20);
//设置电脑按钮的位置,左上角坐标为(10,40),大小为宽180,高20
mainPanel.add(compBtn);
//按钮添加到主面板上
compTxt=newJLabel();
//定义一个空标签compTxt.setBounds(10,70,400,20);
//设置空标签的位置,左上角坐标为(10,
70),大小为宽400,高20
mainPanel.add(compTxt);
//将空标签加到主面板上
userBtn=newJButton("
Take"
//定义用户拿按钮userBtn.addActionListener(newActionListener()//为用户按钮定义行为事件监听器
publicvoidactionPerformed(ActionEvente)
userTake();
//当单击用户拿按钮时,调用用户拿方法
});
userBtn.setBounds(400,40,90,20);
//设置用户拿按钮的位置,左上角的坐标
为(400,40),大小为宽90,高20
mainPanel.add(userBtn);
//用户按钮添加到主面板上userNum=newJComboBox();
//定义一个下拉列表框
for(inti=0;
i<
MAX_TAKEi++)//定义一个拿最大的循环
userNum.addltem(i+1);
//通过循环给列表框逐个添加选项
userNum.setBounds(495,40,90,20);
//设置下拉列表框中的位置,左上角的坐
标为(495,40),大小为宽90,高20
mainPanel.add(userNum);
//将列表框添加到主面板上
paints=newMyPaintPanel[3];
//定义我画的面板
3;
i++)//用3次循环来画岀三个面板
paints[i]=newMyPaintPanel();
//分别创建3个面板,并调用构造方法初始
化三个面板
paints[i].setBounds(5+200*i,110,190,285);
//设置三个面板的位
置和坐标,间距为5
mainPanel.add(paints[i]);
//将三个面板分别添加到主面板上
mainFrame.pack();
//调整此窗口的大小,以适合其子组件的首选大小和布局。
mainFrame.setVisible(true);
//设置当前主窗口的可见性
//调用初始化方法
privatevoidinit()//定义初始化的方法
if(timer!
=null)//如果计时器不为空的话就执行下面的语句
timer.cancel();
//快速终止计时器的任务执行线程
timer=newTimer();
//实例化一个计时器的对象
compTxt.setText("
"
);
//设置空标签的文本为空
compBtn.setEnabled(true);
//设置是否启用电脑按钮组件,即电脑组件可用userBtn.setEnabled(true);
//设置是否启用用户按钮组件,即用户组件可用paints[0].reset();
//调用重置方法,来重新定义第一块面板
paints[1].reset();
//调用重置方法,来重新定义第二块面板
paints[2].reset();
//调用重置方法,来重新定义第三块面板
intnum=MIN_CNT+(int)((MAX_CNT+1-MIN_CNT)*Math.random());
//随机产生一个大于20小于50的数
num;
i++)//分别用for循环添加面板
paints[1].add(i+1);
//分别将产生的随机数添加到第二块面板
privatevoiduserTake()//定义一个用户拿火柴棒的方法
compBtn.setEnabled(false);
//设置按钮不可用
inttakeCnt=userNum.getSelectedlndex()+1;
//定义用户拿得火柴棍的数
量
intrel=paints[1].getCnt();
//将自定义的第二个面板中的火柴棍的数量赋给
rel
if(takeCnt>
rel)//如果用户拿火柴棍的数量比面板中的数量大的话,执行下面
的语句
JOptionPane.showMessageDialog(mainFrame,"
Thereisonly"
+rel
+"
matches."
//用标准对话框类调用显示”Thereisonlymachines"
的对话框
return;
for(inti=0;
takeCnt;
i++)//定义一个将第二块面板中的火柴棍的数量
移动到用户面板的循环
intindex=paints[1].remove();
//将第二个面板要移除的火柴棍的数量给
index变量
paints[2].add(index);
//将index的值添加到用户拿的面板上
if(takeCnt==rel)//如果用户拿的火柴棍的数量和第二个相等执行下面的语句
Youarethewinner."
//
显示”你胜利的对话框“
//并重新初始化
else//如果不相等的话,执行下面的语句,
//让电脑接着拿火柴棍
privatevoidcompTake()//定义电脑拿的方法
//设置电脑按钮的当前状态为不可用
userBtn.setEnabled(false);
//设置用户按钮的当前状态为不可用
MyTasktask=newMyTask();
//实例化一个MyTask的对象
timer.schedule(task,DELAY);
//执行线程,安排在指定延迟1秒后执行指定的任
务
privateclassMyTaskextendsTimerTask//定义一个继承了实现Runnable接口的
类使自己也具有线程功能
publicvoidrun()//因为TimerTask实现了Runnable接口,重写父类的run方法{
//将火柴棍面板中的火柴的数量赋给rel
inttakeCnt=0;
//设置当前拿火柴棍的数量为0
if(rel<
=MAX_TAKE〃如果当前火柴棍的数量比最大拿火柴的数量小的话,
执行下面的语句
takeCnt=rel;
//将火柴棍的数量赋给电脑要拿的数量
elseif(rel%(MAX_TAKE+1)>
0)//如果面板中的火柴棍的数量对4取余
大于0的话执行下面的语句
takeCnt=rel%(MAX_TAKE+1);
//将面板中的火柴的数量对4取余之
后赋给电脑要拿的火柴的数量
else//否则面板中的火柴棍的数量对4取余小于或等于0的话执行下面的语句
takeCnt=1+(int)(MAX_TAKE*Math.random());
//随机产生一个
小于4的数,给电脑要拿的数量
takeCnt;
i++)
//将火柴面板中的火柴移除并赋给
index
paints[0].add(index);
//将移除的火柴添加到电脑拿的面板上
Computertakes"
+takeCnt+"
matchesthis
time."
//设置电脑显示拿火柴的数量
if(takeCnt==rel)//如果和电脑那的数量和面板中的数量相等执行下面的语句
JOptionPane.showMessageDialog(mainFrame,//显示信息对话框提
示电脑胜利了!
Computeristhewinner."
userBtn.setEnabled(}
@SuppressWarnings("
serial"
privateclassMyPaintPanel
了组件类
privateBufferedImage
privateStackvInteger>
MyPaintPanel()
true);
//设置用户按钮重新可用
)
extendsComponent//定义一个自定义的面板类并继承
bimg;
//仓U建一个BufferedImage的变量bimg
data;
//定义一个私有的栈类型的变量data
//构造我的初始面板的方法
bimg=newBufferedlmage(190,285,
BufferedImage.TYPE_3BYTE_BGR);
//表示一个具有8位RGB颜色分量的图像,
Graphics2Dg2=bimg.createGraphics();
//创建一个Graphics2D,并将
它绘制到此BufferedImage中
g2.setColor(Color.WHITE);
//设置要画的颜色,即面板的颜色
g2.fillRect(0,0,190,285);
//在坐标(0,0)处画一个大小为宽190,高
为285的白色矩形区域
g2.dispose();
//释放此图形的上下文以及它使用的所有系统资源。
调用dispose之后,就不能再使用Graphics对象。
//定义画图形的默认方法
data=newStack<
Integer>
();
//在此面板中实例化一个具体的栈的对象}publicvoidpaint(Graphicsg){
g.drawImage(bimg,0,0,null);
//从坐标(0,0)岀开始画图片
g.dispose();
调用
对象
dispose之后,就不能再使用Graphics
}privatevoidadd(intnum)//添加火柴棍的方法
intloc=data.size();
//将当前栈的大小赋给变量loc
//System.out.println("
当前