资源预览内容
第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
第9页 / 共22页
第10页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
湖南涉外经济学院 程序设计实训(一)课程设计报告学 院:信息科学与工程学院专业名称:计算机科学与技术课程名称:程序设计实训设计题目: 扫雷游戏开发学生姓名:指导教师:时 间: 2012年12月摘 要 随着时代的发展,电脑进入了普通老百姓的生活,越来越多的人使用电脑办公、娱乐、上网,游戏行业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。 扫雷游戏是Windows操作系统自带的一款小游戏, 本系统要是模仿WINDOWS系统的扫雷,对于实现过程中出现的bug进行调试解决。我这里用的是C#编写了与它功能相似的扫雷游戏。程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。当鼠标左键单击到地雷时提示游戏失败。报告首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。清除未靠近地雷区的方块较为复杂。关键词:扫雷游戏;算法设计;事件;c#目 录摘 要II第一章 课程设计目的与要求11.1目的11.2要求1第二章 需求分析22.1功能描述22.2功能需求32.3 功能模块4第三章 设计方案53.1总体设计53.2 具体功能模块设计73.3详细设计12第四章 程序测试及分析154.1 程序的调试及查错154.2 错误解决方法15总 结16参考文献17湖南涉外经济学院信息科学与工程学院第一章 课程设计目的与要求1.1目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是对本课程学习后进行的一次全面而综合的练习。本次课程设计的目的主要有:1. 培养综合运用所学知识独立完成课题的能力。2. 更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 3. 提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。 4. 培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。5. 培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6. 对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核7. 巩固和加深学生对C#的基本知识的理解与掌握。8. 掌握C#语言编程和调试的基本技能9. 运用C#语言对程序的简单设计10. 掌握程序设计说明文档的能力与技巧11. 让学生掌握较为简单的算法分析能力1.2要求(1)需要为Windows操作系统的用户设计完成一款扫雷游戏,这是一个根据某种算法自动布雷,有用户扫雷的小软件;(2)本游戏由每个学生单独完成,完成时间大概7周时间,开发成本低,易于完成;(3)设计过程中,前两周,对整个游戏所实现的功能进行详细的设计以及对存在的问题及解决办法进行最终确定;3-5周完成游戏的程序编写,并优化;最后两周,写出设计本游戏的详细文档说明,并作课程设计汇报。第二章 需求分析需求分析的主要任务即详细的找出程序所需要的各种功能实现,是对系统功能进一步分析和抽象,以确定系统应当做什么的问题,从而完成系统的逻辑设计。本程序为扫雷游戏的实现,首先是要实现扫雷游戏的基本功能,根据扫雷游戏的玩法,设计程序,实现程序功能。本系统需求分析分为四个部分:功能描述、功能需求、功能模块和系统需求分析报告。2.1功能描述按功能将游戏区域分成两个区域:雷区和提示区。提示区包括计雷器、计时器和一个笑脸的按键操作。游戏过程中,当用户用鼠标点击相应的方块,程序就会作出相应的鼠标事件,而鼠标事件的处理都是由扫雷程序实现的。游戏开始时,系统会在雷区的某些小方块中随机布下若干个地雷。安放地雷的方块称为雷方块,其他的称为非雷方块。布完雷后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中有多少个雷。用户可以根据这些数字判断是否可以打开某些方块,并把认为有地雷的方块标识地图。如果某个数字方块周围的地雷全都标记完,可以单击鼠标左键,将其周围剩下的方块挖开。如果数字周围地雷没有全部标记,在同时单击鼠标左右键时,其他隐藏或未标记的方块将被按下一次。当用户将所有地雷挖出后,其余的非雷方块区域都已打开,此时游戏胜利。在游戏过程中,一旦错误地打开了雷方块则游戏失败,游戏结束;当用户标识的地雷数超过程序设定,虽然打开了全部其余方块,游戏仍然不会结束。2.2功能需求(1)提示区左侧显示总雷数,并减去被标明有雷区域的数目;(2)提示区中间位置显示笑脸按钮用于开局和显示鼠标动作的结果;(3)提示区右侧显示扫雷所用的时间;(4)单击鼠标左键于未知区域,如果未知区域有雷,游戏结束,显示所有的地雷;如果没有雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止,并显示周围雷的数目; (5)单击鼠标右键于未知区域,则显示小红旗,将其标识有雷。在该位置再次单击右键则取消;(6)如果该数字方块周围地雷已经完全标识出,双击该数字所在方块,将快速翻开所有周围不是地雷的方块,并显示,直到有雷为止;(7)将雷全部扫完后,会出现一个提示框,显示游戏胜利2.3 功能模块(1)游戏界面(2)布雷(3)鼠标事件(4)地雷判断(5)游戏胜利(结束)(6)游戏失败(结束)扫雷游戏系统基本功能如图3-3所示扫雷游戏游戏开始游戏选关游戏计雷游戏计时图3-3扫雷基本功能第三章 设计方案3.1总体设计3.1.1 功能设计实现功能包括:布局格子,布雷,判断游戏完成或失败,鼠标事件(左键单击、右键单击)(1)如果单击了鼠标左键则判断: 如果鼠标单击了笑脸则游戏重新开始。 如果单击了方格,判断该格子里有红旗,则按键无效。如果单击的格子没有显示过数字或空白,则判断;如果是地雷,游戏结束,显示地雷分布;如果不是地雷,则统计该格子周围(8 个方向)的地雷数,如果周围地雷数为0, 调用递归函数处理周围格子的情况,显示周围地雷数或空白。如果单击的格子周围地雷数不为0, 则显示周围地雷数,将处理过的格子作标记。如果所有格子处理完毕,游戏胜利,显示胜利信息。 (2) 如果单击了鼠标右键,该格子没有红旗,则显示红旗。如果有红旗,再击右键,则红旗消失。3.1.2 界面思路 本程序是用C#的控件设计的,首先在程序初始化时界面全部置为空,在按了扫雷的笑脸键之后开始给界面布局,用数组画出扫雷的格子。3.1.3程序思路 扫雷程序主要用了一个8 行9 列的二维数组表示,数组的每一个元素是结构体类型,结构体中的num 成员代表格内当前处于什么状态,值为1 表示有雷,值为0 表示已经变成空白格或者显示过数字,roundnum 成员统计每个格子周围有多少地雷,flag 变量主要是鼠标右键测试的标志,如果flag 为1 则表示格子显示红旗,这样鼠标左键点在这个格子中将无效。 算法的重点是一开始统计好每个格子周围有多少地雷,然后当鼠标左键点在没地雷的格子上时进行两种判断,如果格子周围没地,雷就先在原来的格子位置显示空白格,然后用递归的方法同样判断周围的8 个格子;如果格子周围有地雷,就在该格子上显示具体的雷数。 在递归判断8 个格子时,如果格子上有雷或者格子已经显示过雷数或者空白格,以及格子上有红旗标志的话,就不再对格子进行任何判断。3.1.4 游戏流程设计游戏详细运行流程如图3-1-1所示图3-1-4整体流程图3.1.5 鼠标事件流程图如图3-1-5等待事件左 击右 击同时按下3.2 具体功能模块设计3.2.1 布雷在给程序布雷时思路是这样的,首先给出界面全部为无雷的状态然后获取鼠标的坐标,把坐标传到LayMines(int a,int b)函数中,然后写一个随机函数,给最开始无雷状态中随机布雷其代码如下: private void LayMines( int a,int b )/a,b 是第一次点的坐标,不放雷 int x, y; Random s = new Random(); /取随机数 for (int i = 0; i MineNum;) /取随机数 x = s.Next(XNum); y = s.Next(YNum); if (Convert.ToInt16(Minesx, y.Tag) != 1 & !(x=a&y=b) ) /=1时,代表这个位置是地雷 Minesx, y.Tag = 1; /修改属性为雷 /Minesx, y.Text = u; i+; 3.2.2 获取小方块区域相邻8个区域的雷的个数其主要思路通过GetAroundNum(int row, int col)函数,传入鼠标的坐标,通过around 变量统计雷数, 通过minRow与maxCol变量获取坐标的范围然后通过IsInMineArea函数判断是否在雷的区域通过around累加。其具体代码如下:private int GetAroundNum(int row, int col) /当前坐标 int i, j; int around = 0; int minRow = (row = 0) ? 0 : row - 1; /坐标最小范围 int maxRow = row + 2; int minCol = (col = 0) ? 0 : col - 1; int maxCol = col + 2; for (i = minRow; i maxRow; i+) for
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号