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