扫雷设计报告(特制内容)

上传人:8** 文档编号:129954931 上传时间:2022-08-03 格式:DOC 页数:17 大小:799.50KB
返回 下载 相关 举报
扫雷设计报告(特制内容)_第1页
第1页 / 共17页
扫雷设计报告(特制内容)_第2页
第2页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Harbin Institute of Technology课程设计报告课程名称: 数据结构与算法课程设计设计题目: 扫雷游戏 院 系: 计算机科学与技术学院 班 级: 10503105 设 计 者: 黄林峰 学 号: 1050310521 指导教师: 李秀坤 设计时间: 2007年9月8日 哈尔滨工业大学哈尔滨工业大学课程设计任务书 姓 名:黄林峰 院 (系): 计算机科学与技术 专 业:计算机科学与技术 班 号: 10503105 任务起至日期: 2007年 8 月 27 日 至 2007年 9 月 9 日 课程设计题目: 扫雷游戏 课程设计要求:1、做一个N x M的扫雷游戏(如下图),每个方格包 含两种状态:关闭(closed)和打开(opened),初始化时每个方格都是关闭的,一个打开的方格也会 包含两种状态:一个数字(clue)和一个雷(bomb)。你可以打开(open)一个方格,如果你打开的是一个bomb,那么就失败;否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有邻居方格(neighboring squares)所包含的雷数,应用该信息可以帮助你扫雷。2、能够给出游戏结果(输、赢、剩余的雷数、用掉的时间按秒计)3、游戏界面最好图形化,否则一定要清楚的字符界面。 4、合理分配各个操作的按键,以及各方格各种状态如何合理显示。 设计任务总述:1、利用二维数组建立一个N x M的区间,初始化每个方格关闭。2、用户能够打开一个方格,一个已打开的方格不能再关闭。 3、能够标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有雷),当一个方格标记后该方格不能被打开,只能执行取消 标记的操作,只能在取消后才能打开一个方格。 4、对打开的方格进行判断,如果打开的是一个bomb,则game over;反之,显示某一数字,即所有邻居方格所包含的雷数 5、在游戏界面上,显示输、赢、剩余的雷数以及用掉的时间。工作计划及安排:1、8月28日8月31日对VC图形化界面的使用进行学习,初步准备在TC3.0编译环境下,利用TC自带的绘图函数做出图形界面。在此期间,参看有关讲解TC函数的书籍,对所需函数灵活运用。 2、9月1日开始进行编程,绘出图形,写出鼠标控制函数。 3、中期检查之前要把主要的图形以及各鼠标控制做出,9月3日之后开始编写完整的程序,调试。 4、9月8日之前完成报告的撰写以及答辩PPT。指导教师签字_ 年 月 日 数据结构与算法课程设计中期检查结果学号:10503105姓名:黄林峰指导老师:李秀坤课程设计题目扫雷游戏系统总任务描述:本题目做一个N x M的扫雷游戏,每个方格包含两种状态:关闭(closed)和打开(opened),初始化时每个方格都是关闭的,一个打开的方格也会 包含两种状态:一个数字(clue)和一个雷(bomb)。你可以打开(open)一个方格,如果你打开的是一个bomb,那么就失败;否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有邻居方格(neighboring squares)所包含的雷数。 能够打开一个方格,一个已打开的方格不能再关闭。 能够标记一个方格,标记方格的含义是 对该方格有雷的预测(并不表示真的一定有雷),当一个方格标记后该方格不能被打开,只能执行取消 标记的操作,只能在取消后才能打开一个方格。 能够给出游戏结果。游戏界面图形化。已完成工作描述:1.确定在Turbo C/C+ 3.0的平台上,利用DOS系统调用函数和graphics.h进行图形化处理。2.查阅相关资料,完成如下模块:InitMouse,Scr,MouseState,Edge,TurnBack,InitArrow,InitCursor,MouseShow,MouseHide,CursorShow,CursorHide,SetRange,GetXY,SetXY,WaitMouse,WaitKey,Prt,Locate。3.程序上,已经完成了利用random(随机数产生函数)在区域里布雷,若重复布雷,则进行一次判断,再随机一次(用while循环实现),code如下:for (i=0;i=0) i+;if (Mineyx+1=MINE)&(x+1)=0) i+;if (Miney+1x=MINE)&(y+1)=0)&(y-1)=0) i+;if (Miney-1x+1=MINE)&(x+1)=0) i+;if (Miney+1x+1=MINE)&(x+1)10)&(y+1)=0)&(y+1)10) i+;Mineyx=i;下一步工作计划及安排:1. 查阅相关资料,进一步处理光标和箭头的函数模块。2. 编写FailExitGame和ExitGame的函数,区分两种不同方式的Exit。3. 编写计时函数。4. 把各模块拼装成一整体,调试程序。5. 完成报告和PPT。 填表时间:2007年9月3日指导教师签字:一、 题目分析 游戏开始时,系统会在雷区的某些小方块中随机布下若干地雷。安排放好的地雷小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体的数字表示与其紧邻的8个方块中有多少雷方块,例如“1”就表示紧邻8个方块中有一个雷方块。玩家可以根据这些信息去判断是否可以打开某些方块,并把认为可能是地雷的方块打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已经打开,此时游戏胜利结束。在游戏过程中,一旦错误地打开了雷方块,即立即失败,游戏结束。 图1Windows下扫雷胜利的情形 图2Windows下扫雷失败情形二、总体设计 基于上面对Windows扫雷游戏的分析,可以总结出游戏的总体结构: 该游戏主要包含如下三个阶段:随机布雷,扫雷过程和结果显示。 布雷: 开始 否 是生成随机的雷方块的坐标 (x,y) 判断(x,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据 判断是否布下所有的雷 结束 扫雷:鼠标左键事件其他区域处理结束显示失败处理胜利处理胜利拓展最大可能显示范围打开区域继续处理开始在雷区雷方块定位游戏结束鼠标右键事件结束鼠标右键雷方块定位判断历史属性以及相关状态修改相关状态显示三、数据结构设计在程序中,我设定了如下几种数据结构来实现功能:1.定义一个二维数组Mine1010存放雷的信息,定义二维数组Turn1010存放右键信息。2.在鼠标函数的编写中,用了一个REGS的共用体类型,该共用体的成员由结构类型的x和h组成,其中x代表16位寄存器变量,它的成员用CPU的相关寄存器名表示。结构类型h代表8位寄存器变量,其成员与相关的CPU的8位寄存器同名。3.中断的调用。在程序中一共使用了两种软中断调用方式,int86()和geninterrupt()。四、算法设计该游戏算法并不复杂,主要集中在布雷和扫雷过程中。一、布雷开始时,利用C语言中随机数的生成函数random在已经初始设空(NULL)的区域内布10个雷。如果重复,重新布一次。二、设置雷区下数值当雷布好后,就进入了其他非雷区域设定阶段。由于雷是随机布放的,没有类的地方被点击后就会显示一个数字,表示它周围有几个雷。因此,可以把整个雷区看成如下所示的一个二维数组11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28ai,j= 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 假若要知道a 3,4周围有几个雷,就必须检测下面8个雷区是否放上了雷。a2,3 a2,4 a2,5a3,3 a3,5a4,3 a4,4 a4,5仔细观察它们存在的数学关系,发现ai,j周围的雷个数是由这样8个雷区决定的(如果超出了边界,应再加以判断):ai-1,j-1 ai-1,j ai-1,j+1ai,j-1 ai,j+1ai+1,j-1 ai+1,j ai+1,j+1三、玩家按键最后就是处理玩家在游戏过程中的按键。玩家有两种鼠标按键选择,左键和右键。此外,玩家还可能键盘按键,而该游戏中主要是提供鼠标按键,所以必须对用户按了什么键首先判断。用户按Esc键时退出游戏;按鼠标左键时,进一步判断是否是雷;按右键时,标记可能是雷的区块,并及时修改Mines剩余值。若在已经标记过的区块再点一次右键,则取消标记。五、物理实现一、鼠标编程由于该游戏的特点,在编游戏的开始阶段我就选择了利用Turbo C调用中断,编写一组鼠标操作函数。鼠标驱动程序提供了一个标准的软件中断接口,在加载了鼠标驱动程序之后,无论鼠标的类型如何,应用程序都可以直接通过该软件接口操作鼠标。该接口的中断号为INT33H,其使用方法和其他BIOS的中断调用完全相同。以下,介绍程序中主要的几个鼠标函数:(1) 初始化鼠标函数InitMouse():该函数用于判断是否安装了鼠标及其驱动程序,如果是,初始化鼠标驱动程序并返回鼠标的按钮数(2或3);否则返回0。该函数调用了INT33H的00H号功能。BYTE InitMouse()union REGS regs;regs.x.ax = 0;int86(MOUSE, ®s, ®s);return (regs.x.ax);(2) 显示鼠标光标函数MouseShow():鼠标光标在文本显示下是个矩形光标,在图形方式下是一个箭头。用户移动鼠标,则光标随之移动。该函数调用了INT33H的01H号功能。 void MouseShow()union REGS regs;regs.x.ax = 1;int86(MOUSE, ®s, ®s);(3) 隐藏鼠标光标函数MouseHide():大体同(2),只是该函数调用了INT33H的02H号功能。(4) 读鼠标状态函数GetXY():该函数调用了INT33H的03H号功能。 void GetXY(int *x,int *y)union REGS ireg,oreg;ireg.x.ax=3;int86(MOUSE,&ireg,&oreg);*x=oreg.x.cx;*y=oreg.x.dx;参数x和y存放的是读出的鼠标坐标。这里值得特别注意的是,如果是在文本方式(80x25)下,此时鼠标所在的文本行、列位置与其坐标之间存在如下关系:鼠标所在的文本列=x/8;鼠标所在的文本行=y/8;(5) 设置鼠标光标位置的函数SetXY():该函数调用了INT33H的04H号功能。 void SetXY(int x,int y)union REGS ireg;ireg.x.ax=4;ireg.x.cx=x;ireg.x.dx=y;int86(MOUSE,&ireg,&ireg);参数x和y存放的是欲设置的鼠标光标坐标。这里值得特别注意的是,如果是在图形方式下,按图形方式的实际坐标设置;如果是在文本方式下,此时鼠标光标坐标与鼠标所在的文本行、列存在如下关系:x=鼠标所在的文本列*8;y=鼠标所在的文本行*8;(6) 设置鼠标活动范围函数SetRange():该函数调用了INT33H的07H号功能将鼠标的移动范围限制在屏幕上的一个矩形区域内。 void SetRange(int start_x,int start_y,int end_x,int end_y)union REGS r;r.x.ax=7;r.x.cx=start_x;r.x.dx=end_x;int86(0x33,&r,&r);r.x.ax=8;r.x.cx=start_y;r.x.dx=end_y;int86(MOUSE,&r,&r);二、随机布雷初始化随机数发生器randomize();利用循环,初始设空:for (y=0;y10;y+)for (x=0;x10;x+)Mineyx=NULL;Turnyx=FALSE;开始布雷,前后布在同一块的话就利用while循环重新布一次:for (i=0;i=0) i+;if (Mineyx+1=MINE)&(x+1)=0) i+;if (Miney+1x=MINE)&(y+1)=0)&(y-1)=0) i+;if (Miney-1x+1=MINE)&(x+1)=0) i+;if (Miney+1x+1=MINE)&(x+1)10)&(y+1)=0)&(y+1)10) i+;Mineyx=i;四、标记雷块建立一个二维数组Turnyx,专门记录用户右键的情况,当用户第一次按右键的时候,修改Turnyx的值,使之为2,并把该模块标记为“*”,同时Total的值自加1;当用户在该模块上第二次点右键的时候,修改Turnyx的值为0,并把该模块重新标记为初始的“?”,同时Total的值自减1。五、游戏结束游戏有四种结束方式:1. 用户按Esc键强行退出;2. 用户点击雷块,游戏失败退出FailExitGame(): for (y=0;y10;y+)for (x=0;x10;x+)if (Mineyx=MINE) Prt(x+SX,y+SY,*,14+128);MouseHide();CursorShow();printf(n Fail!n);delay(4000);exit(0);3. 用户标注完10个雷块,但其中有误标注,游戏失败退出FailExitGame():for (i=0;i10;i+)if (MineMarki1Marki0) m+;if (m9) FailExitGame();4. 用户找出所有的10个雷块,游戏胜利退出ExitGame():for (i=0;i10;i+)if (MineMarki1Marki0) m+;if (m9) FailExitGame();MouseHide();CursorShow(); printf(n OK,Good!n);delay(4000);exit(1);六、运行结果开始界面: 图3开始界面用户点击雷块,游戏失败: 图4 点击雷块游戏失败用户标注完10个雷块,但其中有误标注,游戏失败: 图5 标注完毕但有错误找出所有的10个雷块,游戏胜利: 图6游戏胜利七、结果分析从最后的执行文件可以看出,本课程设计最终设计的扫雷小游戏基本可以完成了预定目标,有一个遗憾,就是没有记录用户所耗时间的功能。 在TC3.0的环境下,利用窗口图形实现了鼠标控制的要求。在程序判断上没有明显的问题,能够满足初级用户的要求。八、结论本次课程设计完成了扫雷游戏的模拟,并给出了相应的图形化界面。 通过本次课程设计,训练了对二维数组,中断函数等C语言基础知识的应用和掌握,并对图形界面的程序设计有了一定的锻炼。九、参考文献 1.冯博琴,刘路放,精讲多练C语言,西安交通大学出版社,1997。2.杨路明,C语言程序设计教程,北京邮电大学出版社,2003。3.罗伟坚,Visual C+经典游戏程序设计,人民邮电出版社,2004。17仅供参考#
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 研究报告 > 机械电子


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!