扫雷的课程设计报告.docx
《扫雷的课程设计报告.docx》由会员分享,可在线阅读,更多相关《扫雷的课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
扫雷的课程设计报告
西安文理学院信息工程学院
课程设计报告
设计名称:
数据结构课程设计
设计题目:
实现一个N*M的扫雷游戏
学生学号:
1402130407
专业班级:
软件13级四班
学生姓名:
樊秀琳
学生成绩:
指导教师(职称):
谢巧玲(讲师)
课题工作时间:
2015.6.22至2015.7.3
说明:
1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生。
2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。
3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。
答辩由指导教师实施。
4、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设计的情况另行规定。
5、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。
信息工程学院课程设计任务书
学生姓名
樊秀琳
学号
1402130407
专业班级
软件工程13级四班
设计题目
实现一个N*M的扫雷游戏
内容概要:
(包含要求采用的设计环境或开发环境(软、硬环境),采用的关键技术等),系统/设计所包含的基本功能等)
程序在eclipse
文献资料:
[1]张跃平.JAVA 2实用教程(第三版)[M].清华大学出版社,2006
[2]张跃平.JAVA课程设计(第二版)[M].清华大学出版社,2009
[3]叶核亚.数据结构(Java)(第二版)[M].电子工业大学出版社,2008
设计要求:
(设计所必须达到的基本功能要求、文档格式要求及其他等)
工作期限:
设计工作自2015年6月22日至201年7月3日止。
指导教师:
院长:
日期:
2015年6月22日
信息工程学院课程设计进度安排表
学生姓名:
樊秀琳学号:
1402130407专业:
软件工程班级:
13级四班
起止日期
内容
备注
6月22日~6月23日
下任务书;收集、阅读、整理相关参考文献,并进行归纳和概括总结,完成项目/任务背景介绍部分文字内容。
6月24日~6月26日
系统功能设计和模块设计、系统体系结构构建。
6月27日~6月30日
各功能模块编码实现,系统各功能模块调试与维护。
7月1日~7月2日
系统功能集成、系统调试与测试,按照模板要求撰写课程设计/项目设计报告。
7月3日
课程设计/项目设计分组答辩,提交课程设计/项目设计报告以及相关文档,进行成绩评定。
指导教师签名:
2014年6月22日
成绩评定表
学生姓名:
樊秀琳学号:
1402130407专业:
软件工程班级:
13级四班
类别
合计
分值
各项分值
评分标准
实际得分
合计得分
平时表现
10
10
按时参加设计指导,无违反纪律情况。
完成情况
30
20
按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。
10
能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。
报告质量
35
10
报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。
5
课题背景介绍清楚,综述分析充分。
5
设计方案合理、可行,论证严谨,逻辑性强,具有说服力。
5
符号统一;图表完备、符合规范要求。
5
能对整个设计过程进行全面的总结,得出有价值的结论或结果。
5
参考文献数量在2篇以上,格式符合要求,在正文中正确引用。
答辩情况
25
10
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
指导教师:
(签字)
日期:
2014年7月3日
摘要
摘 要 :
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法设计和语言实现,如C,C++,VB,JAVA等。
我利用eclipse编写了与它功能相似的扫雷游戏,寓学于乐。
程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。
单击屏幕上的笑脸可以重新开始游戏。
所有地雷标出后胜利,当鼠标左键单击到地雷时提示游戏失败。
其功能类似于Windows操作系统自带的扫雷游戏。
论文首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。
重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。
清除未靠近地雷区的方块较为复杂。
关键词:
算法设计;事件;Eclipse
第一章课题背景(或绪论、概述)
1.1设计目的
1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
1.2基本理论依据和主要工作内容
扫雷游戏主要用了一个10行10列的二维数组,刚开始利用random随机布雷。
每一个程序最主要的是算法。
扫雷游戏算法的重点是一开始统计好每个格子周围有多少雷,当鼠标左键点在格子上时做出判断,如果周围8个格子有雷则显示出雷数,如果没有雷则显示空白格(在四个角的格子显示周围3个格子,其它边缘的格子显示周围5个的状态),我们在主函数中用两个for语句来判断周围雷数。
我们还加了鼠标处理函数。
如果格子上有雷则调用函数actionpeformed(),显示“你踩到地雷了,按确定重来","踩到地雷”,游戏结束。
若所有的雷都标出,且所有的格子都处理过,则调用函数isWin(),显示“您挖完了所有的雷,您胜利了!
","胜利",游戏结束。
游戏结束后,按任意键出去。
第二章设计简介及设计方案论述
2.1功能需求
1.本游戏结构较为简单,可以自行设置设置雷数,以此来控制扫雷的难度系数;
2.提示区下方将显示总雷数,并可以通过点击右键来标明疑似有雷的区域的数目;
3.单击鼠标左键于未知区域,如果未知区域有雷,游戏提示:
“你踩到地雷了,按确定重来”;如果没有雷,当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数,则显示周围雷数,然后判断是否挖完所有的雷;如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止,并显示周围雷的数目;
4.单击鼠标右键于未知区域,则显示F,将其标识有雷。
在该位置再次单击右键则视为不确定,显示Q,单击第三次,取消设置,Q消失;
5.如果该数字方块周围地雷已经完全标识出,双击该数字所在方块,将快速翻开所有周围不是地雷的方块,并显示,直到有雷为止;
6.将雷全部扫完后,会出现一个提示框,显示游戏胜利。
2.2功能模块
(1)游戏界面
(2)布雷
(3)鼠标事件
(4)地雷判断
(5)游戏胜利(结束)
(6)游戏失败(结束)
(7)游戏设置(地雷数量)
第三章详细设计
3.1总体设计
游戏的操作方面主要以鼠标为主,当鼠标左键单击方块时即表示打开方块,当鼠标右键单击方块时即表示标识或疑似地雷,反复单击右键则方块会以“未标识→标识→疑似”三者关系不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若打开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。
当打开的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被打开方块的八个方向将空白方块打开。
系统的总体设计是对整个系统的结构化设计,包括系统基本功能的设计、系统流程的设计和各个功能模块的设计等。
3.1.1总体功能图
3.1主要技术
1.鼠标消息处理函数;
actionPerformed(ActionEvente)
mouseClicked(MouseEvente)
2.分模块实现较复杂的程序设计
设置地雷数
布雷
计算周围雷数
判断是否挖完所有雷
3.扫雷游戏算法
开始统计好每个格子周围有多少雷,当鼠标左键点在格子上时做出判断,如果周围8个格子有雷则显示出雷数,如果没有雷则显示空白格(在四个角的格子显示周围3个格子,其它边缘的格子显示周围5个的状态),我们在主函数中用两个for语句来判断周围雷数。
我们还加了鼠标处理函数。
第四章设计结果及分析
4.1设计结果截图
图4-1
图4-2
总结
主要包括:
正文(小四号字宋体)
(1)对设计工作及所设计的系统特性的概括和总结,所采用的关键技术及算法介绍,运行结果分析评价及效率评价,系统还有待于改进的方面等等;
(2)本次课程设计/项目设计的感悟等。
参考文献
参考文献采用顺序编码制格式著录。
主要责任者,三名以内的,全部列出;超过三名时,后面加“等.”字样。
参考文献类型及标识:
参考文献类型
专著
论文集
报纸文章
期刊文章
学位论文
报告
标准
专利
文献类型标识
M
C
N
J
D
R
S
P
其他未作说明的文献,建议采用单字母“Z”。
参考文献编排格式(注意严格使用格式中的符号,特别注意区分“,”与“.”):
(1)对于专著、论文集、学位论文、报告,格式如下:
[序号]主要责任者.文献题名[X].出版地:
出版者,出版年.起止页码.
其中X代表文献类型标识。
(2)对于期刊文章,格式如下:
[序号]主要责任者.文献题名[J].刊名,年,卷(期):
起止页码.
(3)对于报纸文章,格式如下:
[序号]主要责任者.文献题名[N].报纸名,出版日期(版次).
(4)对于国际、国家标准,格式如下:
[序号]标准编号,标准名称[S].
(5)对于专利,格式如下:
[序号]专利所有者.专利题名[P].专利国别:
专利号,出版日期.
(6)对于未定义类型的文献
[序号]主要责任者.文献题名[Z].出版地:
出版者,出版年.
例:
(1)参考文献为书籍的,格式如下:
[1]胡克.常用不等式[M].武汉:
武汉大学出版社,2003.
(2)参考文献为期刊上的文章的,格式如下:
[1]孟志青.时态数据采掘中的时态型与时间粒度研究,湘潭大学学报(自然科学版)[J].2000,22(3):
1-4.
注:
参考文献中的标点符号一律采用英文格式下的。
源代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassFrame
extendsJFrame{
JTextFieldtext;
JLabelnowBomb,setBomb;
intBombNum,BlockNum;//当前雷数,当前方块数
intrightBomb,restBomb,restBlock;//找到的地雷数,剩余雷数,剩余方块数
JButtonstart=newJButton("开始");
JPanelMenuPamel=newJPanel();
JPanelbombPanel=newJPanel();
Bomb[][]bombButton;
JPanelc;
BorderLayoutborderLayout1=newBorderLayout();//BorderLayout是frame和Jframe的默认布局,是边界布局管理器
GridLayoutgridLayout1=newGridLayout();//表格布局管理器
publicFrame(){
try{
//try代码块中编写可能发生异常的java语句,catch代码块中编写针对异常进行的处理的代码。
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
catch(Exceptionexception){
exception.printStackTrace();
}
}
//设置界面
privatevoidjbInit()throwsException{
c=(JPanel)getContentPane();
setTitle("扫雷");
c.setBackground(Color.WHITE);
MenuPamel.setBackground(Color.GRAY);
c.setLayout(borderLayout1);
setSize(newDimension(600,600));
setResizable(false);
BlockNum=144;
BombNum=10;
text=newJTextField("10",3);
nowBomb=newJLabel("当前雷数"+":
"+BombNum);
setBomb=newJLabel("设置地雷数");
start.addActionListener(newFrame1_start_actionAdapter(this));
MenuPamel.add(setBomb);
MenuPamel.add(text);
MenuPamel.add(start);
MenuPamel.add(nowBomb);
c.add(MenuPamel,java.awt.BorderLayout.SOUTH);
bombPanel.setLayout(gridLayout1);//设置窗体
gridLayout1.setColumns((int)Math.sqrt(BlockNum));
gridLayout1.setRows((int)Math.sqrt(BlockNum));//指定行数
bombButton=newBomb[(int)Math.sqrt(BlockNum)][(int)Math.sqrt(BlockNum)];
for(inti=0;i<(int)Math.sqrt(BlockNum);i++){
for(intj=0;j<(int)Math.sqrt(BlockNum);j++){
bombButton[i][j]=newBomb(i,j);
//bombButton[i][j].setSize(10,10);
bombButton[i][j].setFont(newFont("",Font.PLAIN,14));//设置字体大小
bombButton[i][j].setForeground(Color.white);
bombButton[i][j].addMouseListener(newBomb_mouseAdapter(this));
bombButton[i][j].addActionListener(newBomb_actionAdapter(this));
bombPanel.add(bombButton[i][j]);
}
}
c.add(bombPanel,java.awt.BorderLayout.CENTER);
startBomb();
}
/*开始按钮*/
publicvoidstart_actionPerformed(ActionEvente){
intnum=Integer.parseInt(text.getText().trim());
if(num>=5&&num<50){
BombNum=num;
startBomb();
}
elseif(num<5){
JOptionPane.showMessageDialog(null,"您设置的地雷数太少了,请重设!
","错误",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum=num;
}
else{
JOptionPane.showMessageDialog(null,"您设置的地雷数太多了,请重设!
","错误",
JOptionPane.ERROR_MESSAGE);
num=10;
BombNum=num;
}
}
/*开始,布雷*/
publicvoidstartBomb(){
nowBomb.setText("当前雷数"+":
"+BombNum);
for(inti=0;i<(int)Math.sqrt(BlockNum);i++){
for(intj=0;j<(int)Math.sqrt(BlockNum);j++){
bombButton[i][j].isBomb=false;
bombButton[i][j].isClicked=false;
bombButton[i][j].isRight=false;
bombButton[i][j].BombFlag=0;
bombButton[i][j].BombRoundCount=9;
bombButton[i][j].setEnabled(true);
bombButton[i][j].setText("");
bombButton[i][j].setFont(newFont("",Font.PLAIN,14));//设置字体大小
bombButton[i][j].setForeground(Color.BLUE);
rightBomb=0;
restBomb=BombNum;
restBlock=BlockNum-BombNum;
}
}
for(inti=0;iintx=(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));
inty=(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));
if(bombButton[x][y].isBomb!
=true){
bombButton[x][y].isBomb=true;
i++;
}
}
CountRoundBomb();
}
/*计算方块周围雷数*/
publicvoidCountRoundBomb(){
for(inti=0;i<(int)Math.sqrt(BlockNum);i++){
for(intj=0;j<(int)Math.sqrt(BlockNum);j++){
intcount=0;
//当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
if(bombButton[i][j].isBomb!
=true){
for(intx=i-1;x
for(inty=j-1;yif((x>=0)&&(y>=0)&&(x<((int)Math.sqrt(BlockNum)))&&(y<((int)Math.sqrt(BlockNum)))){
if(bombButton[x][y].isBomb==true){
count++;
}
}
}
}
bombButton[i][j].BombRoundCount=count;
}
}
}
}
/*是否挖完了所有的雷*/
publicvoidisWin(){
restBlock=BlockNum-BombNum;
for(inti=0;i<(int)Math.sqrt(BlockNum);i++){
for(intj=0;j<(int)Math.sqrt(BlockNum);j++){
if(bombButton[i][j].isClicked==true){
restBlock--;
}
}
}
if(rightBomb==BombNum||restBlock==0){
JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!
","胜利",
JOptionPane.INFORMATION_MESSAGE);
startBomb();
}
}
/**当选中的位置为空,则翻开周围的地图**/
publicvoidisNull(BombClickedButton){
inti,j;
i=ClickedButton.num_x;
j=ClickedButton.num_y;
for(intx=i-1;x
for(inty=j-1;yif(((x!
=i)||(y!
=j))&&(x>=0)&&(y>=0)
&&(x<((int)Math.sqrt(BlockNum)))
&&(y<((int)Math.sqrt(BlockNum)))){
if(bombButton[x][y].isBomb==false
&&bombButton[x][y].isClicked==false
&&bombButton[x][y].isRight==false){