java火柴游戏课程设计报告.docx
- 文档编号:26742892
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:18
- 大小:230.39KB
java火柴游戏课程设计报告.docx
《java火柴游戏课程设计报告.docx》由会员分享,可在线阅读,更多相关《java火柴游戏课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
java火柴游戏课程设计报告
成绩评定表
学生姓名
盛丽丽
班级学号
1303050208
专业
计算机科学与
技术
课程设计题目
小游戏
评
语
组长签字:
成绩
日期
2015年12月29日
课程设计任务书
学院
信息工程与科学学院
专业
计算机科学与技术
学生姓名
盛丽丽
班级学号
1303050208
课程设计题目
小游戏
实践教学要求与任务:
任务:
程序随机产生20—50根火柴,由人与计算机轮流拿,每次拿的数量不超过3根,拿到最后一根为胜。
(使用图形界面)
要求:
1.在java兼容环境完成上述题目的代码编写与调试;
2.程序运行界面交互性好;
3.软件运行,给出测试数据。
工作计划与进度安排:
课程实训设计
(二)设计时间安排在教学第15周内完成,按上述题目要求完成查阅资料、程序设计、调试、运行等工作。
时间安排如下:
1、查阅资料、与初步设计;1-2天
2、整体功能设计、代码编码与初步调试。
1-3天
3、调试和软件功能的测试和验收。
1-3天
4、答辩与论文撰写。
1-2天
指导教师:
2014年12月12日
专业负责人:
2014年12月12日
学院教学副院长:
2014年12月12日
一、需求分析
1.1设计要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1
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程序类publicclassha//定义一个公共的主类Test
图3.1程序类
{
publicstaticvoidmain(String[]args)//定义主方法main{
newha();//调用Test类的构造方法Test()
}
private
static
final
int
MIN_CNT=20;
//定义一个常量,设置为最小火柴棍数量
为20
private
static
final
int
MAX_CNT=50;
//
定义一个常量,
设置为最大火柴棍数量
为50
private
static
final
int
MAX_TAKE=3;
//
定义一个常量,
设置为最大拿火柴数量
为3
private
static
final
int
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.CENTER);//设置标签内容沿X轴的对齐方式
lab11.setBounds(0,10,200,20);//设置该标签显示位置为坐标(0,10),宽
200,高20
mainPanel.add(lab11);//将标签加入主面板
JButtonbtn11=newJButton("Reset");//定义一个重新来的按钮
btn11.addActionListener(newActionListener()//为“Reset”添加行为事件监听器,采用匿名类的方式
{
@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()//为电脑开始按钮定义行为事件监听器
{
@Override
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()//为用户按钮定义行为事件监听器
{
@Override
publicvoidactionPerformed(ActionEvente)
{
userTake();//当单击用户拿按钮时,调用用户拿方法
});
userBtn.setBounds(400,40,90,20);//设置用户拿按钮的位置,左上角的坐标
为(400,40),大小为宽90,高20
mainPanel.add(userBtn);//用户按钮添加到主面板上
userNum=newJComboBox();//定义一个下拉列表框
for(inti=0;i { userNum.addItem(i+1);//通过循环给列表框逐个添加选项 } userNum.setBounds(495,40,90,20);//设置下拉列表框中的位置,左上角的坐 标为(495,40),大小为宽90,高20 mainPanel.add(userNum);//将列表框添加到主面板上 paints=newMyPaintPanel[3];//定义我画的面板 for(inti=0;i<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);//设置当前主窗口的可见性init();//调用初始化方法 } 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的数 for(inti=0;i { paints[1].add(i+1);//分别将产生的随机数添加到第二块面板 } } privatevoiduserTake()//定义一个用户拿火柴棒的方法 { compBtn.setEnabled(false);//设置按钮不可用 inttakeCnt=userNum.getSelectedIndex()+1;//定义用户拿得火柴棍的数 量 intrel=paints[1].getCnt();//将自定义的第二个面板中的火柴棍的数量赋给rel if(takeCnt>rel)//如果用户拿火柴棍的数量比面板中的数量大的话,执行下面的语句 { JOptionPane.showMessageDialog(mainFrame,"Thereisonly"+rel +"matches.");//用标准对话框类调用显示”Thereisonlymachines“的对话框 return; } for(inti=0;i 移动到用户面板的循环 { intindex=paints[1].remove();//将第二个面板要移除的火柴棍的数量给index变量 paints[2].add(index);//将index的值添加到用户拿的面板上 } if(takeCnt==rel)//如果用户拿的火柴棍的数量和第二个相等执行下面的语句 { JOptionPane.showMessageDialog(mainFrame,"Youarethewinner.");//显示”你胜利的对话框“ init();//并重新初始化 } else//如果不相等的话,执行下面的语句, { compTake();//让电脑接着拿火柴棍 } } privatevoidcompTake()//定义电脑拿的方法 { compBtn.setEnabled(false);//设置电脑按钮的当前状态为不可用userBtn.setEnabled(false);//设置用户按钮的当前状态为不可用 MyTasktask=newMyTask();//实例化一个MyTask的对象 timer.schedule(task,DELAY);//执行线程,安排在指定延迟1秒后执行指定的任务 } privateclassMyTaskextendsTimerTask//定义一个继承了实现Runnable接口的类使自己也具有线程功能 { @Override publicvoidrun()//因为TimerTask实现了Runnable接口,重写父类的run方法{ intrel=paints[1].getCnt();//将火柴棍面板中的火柴的数量赋给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的数,给电脑要拿的数量 } for(inti=0;i { intindex=paints[1].remove();//将火柴面板中的火柴移除并赋给index paints[0].add(index);//将移除的火柴添加到电脑拿的面板上 } compTxt.setText("Computertakes"+takeCnt+"matchesthis time.");//设置电脑显示拿火柴的数量 if(takeCnt==rel)//如果和电脑那的数量和面板中的数量相等执行下面的语句 { JOptionPane.showMessageDialog(mainFrame,//显示信息对话框提示电脑胜利了! ); "Computeristhewinner." init();//并重新初始化 bimg=newBufferedImage(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 publicvoidpaint(Graphicsg) { g.drawImage(bimg,0,0,null);//从坐标(0,0)出开始画图片 g.dispose();//释放此图形的上下文以及它使用的所有系统资源。 调用 对象 dispose之后,就不能再使用Graphics} privatevoidadd(intnum)//添加火柴棍的方法 { Graphics2Dg2=bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此BufferedImage中 intloc=data.size();//将当前栈的大小赋给变量loc g2.fillArc(offX+50,offY+3,10,10,0,360);//设置火柴棒头的坐 标,大小为宽和高为10的360度的弧 g2.setColor(Color.BLACK);//设置当前火柴棒的根数的颜色g2.drawString(String.valueOf(num),offX,offY +g2.getFont().getSize());//画出数字data.push(num);//把数字1压入堆栈顶部repaint();//重画 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。 调用dispose之后,就不能再使用Graphics对象 } privateintremove()//定义一个移除火柴棍的方法 { Graphics2Dg2=bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此BufferedImage中 intloc=data.size()-1; //将当前栈的大小即火柴棍的数量减 1 //System.out.println(" 当前栈为"+data.size()); intoffX=loc%3*65; //动态的获取坐标 intoffY=loc/3*15; //动态的获取坐标 g2.setColor(Color.WHITE);//设置移除填充颜色为白色 g2.fillRect(offX,offY,60,15); //画出移除火柴棍的位置 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。 调用 dispose之后,就不能再使用Graphics对象 repaint();//调用重新画的方法 returndata.pop();//移除堆栈顶部的对象,并作为此函数的值返回该对象。 } privatevoidreset()//定义一个重置的方法 { data.clear();//清楚该面板栈中的内容 Graphics2Dg2=bimg.createGraphics();//创建一个Graphics2D,并将 它绘制到此BufferedImage中 g2.setColor(Color.WHITE);//设置颜色为白色 g2.fillRect(0,0,190,285);//在坐标为(0,0)处填充大小为190,285的矩形区域 g2.dispose();//释放此图形的上下文以及它使用的所有系统资源。 调用dispose之后,就不能再使用Graphics对象。 repaint();//重绘此组件。 } privateintgetCnt()//定义一个返回第二个面板火柴棍的数量 { returndata.size();//返回当前栈中的火柴棍数量 四、测试 图4.1运行界面 具体步骤 1.如果是电脑先拿先单击ComputerFirst按钮,电脑随机拿走几根火柴,并在电脑按钮下方显示“Computertakes*matchesthistime”提示信息,单击之后 电脑拿走的按钮被禁用,直到用户单击自己的按钮之后才能再拿。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 火柴 游戏 课程设计 报告