扫雷设计报告_第1页
扫雷设计报告_第2页
扫雷设计报告_第3页
扫雷设计报告_第4页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.Har bin I nstitute of Technology课程设计报告课程名称:数据结构与算法课程设计设计题目:扫雷游戏院系: 计算机科学与技术学院班级:10503105设计者:黄林峰学号:1050310521指导教师:李秀坤设计时间:2007年 9月 8日哈尔滨工业大学;.哈尔滨工业大学课程设计任务书姓名:黄林峰院 (系): 计算机科学与技术专业:计算机科学与技术班号: 10503105任务起至日期:2007 年8月27日至2007 年9 月9 日课程设计题目:扫雷游戏课程设计要求: 1、做一个 N x M 的扫雷游戏(如下图),每个方格包含两种状态: 关闭( closed )和打开

2、( opened ),初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字( clue )和一个雷( bomb )。你可以打开( open )一个方格, 如果你打开的是一个 bomb ,那么就失败; 否则就会打开一个数字,该数字是位于 0 ,8 的一个整数,该数字表示其所有邻居方格( neighboring squares )所包含的雷数,应用该信息可以帮助你扫雷。2、能够给出游戏结果(输、赢、剩余的雷数、用掉的时间按秒计)3、游戏界面最好图形化,否则一定要清楚的字符界面。4、合理分配各个操作的按键,以及各方格各种状态如何合理显示。;.设计任务总述:1、利用二维数组建立一个N

3、x M 的区间,初始化每个方格关闭。2、用户能够打开一个方格,一个已打开的方格不能再关闭。3、能够标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有雷),当一个方格标记后该方格不能被打开,只能执行取消 标记的操作,只能在取消后才能打开一个方格。4、对打开的方格进行判断,如果打开的是一个bomb,则 game over;反之,显示某一数字,即所有邻居方格所包含的雷数5、在游戏界面上,显示输、赢、剩余的雷数以及用掉的时间。工作计划及安排:月 28日8月 31日对 VC 图形化界面的使用进行学习,初步准备在 TC3.01、8编译环境下,利用 TC 自带的绘图函数做出图形界面。在此期

4、间,参看有关讲解 TC 函数的书籍,对所需函数灵活运用。2、 9 月 1 日开始进行编程,绘出图形,写出鼠标控制函数。3、中期检查之前要把主要的图形以及各鼠标控制做出,9 月 3 日之后开始编写完整的程序,调试。4、 9 月 8 日之前完成报告的撰写以及答辩PPT。指导教师签字 _年月日;.数据结构与算法课程设计中期检查结果学号:10503105姓名:黄林峰指导老师:李秀坤课程设计题目扫雷游戏系统总任务描述:本题目做一个N x M 的扫雷游戏, 每个方格包含两种状态:关闭( closed )和打开( opened ),初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字( cl

5、ue )和一个雷(bomb )。你可以打开(open )一个方格,如果你打开的是一个bomb ,那么就失败;否则就会打开一个数字,该数字是位于0 , 8 的一个整数,该数字表示其所有邻居方格( neighboring squares)所包含的雷数。能够打开一个方格,一个已打开的方格不能再关闭。能够标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有雷),当一个方格标记后该方格不能被打开,只能执行取消标记的操作,只能在取消后才能打开一个方格。能够给出游戏结果。游戏界面图形化。;.已完成工作描述:1. 确定在 Turbo C/C+ 3.0 的平台上,利用 DOS系统调用函数和 gr

6、aphics.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<10;i+)

7、x=random(10);y=random(10);while (Mineyx)x=random(10);y=random(10);Mineyx=MINE;4. 对任意一个不是雷的小块周围8 块依次判断,确定其周围的雷数:if (Mineyx!=MINE)if (Mineyx-1=MINE)&&(x-1)>=0) i+; if (Mineyx+1=MINE)&&(x+1)<10) i+; if (Miney-1x=MINE)&&(y-1)>=0) i+; if (Miney+1x=MINE)&&(y+1)<

8、10) i+;if (Miney-1x-1=MINE)&&(x-1)>=0)&&(y-1)>=0) i+; if (Miney-1x+1=MINE)&&(x+1)<10)&&(y-1)>=0) i+; if (Miney+1x+1=MINE)&&(x+1)<10)&&(y+1)<10) i+; if (Miney+1x-1=MINE)&&(x-1)>=0)&&(y+1)<10) i+;Mineyx=i;.下一步工作计划及

9、安排:1. 查阅相关资料,进一步处理光标和箭头的函数模块。2.编写 FailExitGame和 ExitGame 的函数,区分两种不同方式的Exit 。3. 编写计时函数。4. 把各模块拼装成一整体,调试程序。5. 完成报告和 PPT。;.填表时间:2007 年 9 月 3 日指导教师签字:一、 题目分析游戏开始时, 系统会在雷区的某些小方块中随机布下若干地雷。安排放好的地雷小方块称之为雷方块, 其他的称之为非雷方块。部署完毕后, 系统会在其他非雷方块中填充一些数字。某一个具体的数字表示与其紧邻的8 个方块中有多少雷方块,例如“1”就表示紧邻8个方块中有一个雷方块。玩家可以根据这些信息去判断是

10、否可以打开某些方块,并把认为可能是地雷的方块打上标识。 当玩家将所有地雷找出后, 其余的非雷方块区域都已经打开, 此时游戏胜利结束。在游戏过程中,一旦错误地打开了雷方块,即立即失败,游戏结束。图 1Windows 下扫雷胜利的情形;.图 2Windows 下扫雷失败情形二、总体设计基于上面对Windows 扫雷游戏的分析,可以总结出游戏的总体结构:该游戏主要包含如下三个阶段:随机布雷,扫雷过程和结果显示。布雷:开始否是生成随机的雷方块的坐标( x,y)判断( x,y)区域是否已经布下雷在( x,y )区域布雷,修改状态数据;.判断是否布下所有的雷结束扫雷:鼠标左键事件开始在雷区雷方块定位游戏结

11、束继续处理其胜利他区打开区域失败处理域胜利处理处理拓展最大可;.能显示范围.鼠标右键事件鼠标右键雷方块定位判断历史属性以及相关状态修改相关状态显示结束;.三、数据结构设计在程序中,我设定了如下几种数据结构来实现功能:1.定义一个二维数组Mine1010 存放雷的信息,定义二维数组Turn1010 存放右键信息。2.在鼠标函数的编写中,用了一个REGS 的共用体类型, 该共用体的成员由结构类型的x 和h 组成,其中x 代表 16 位寄存器变量,它的成员用CPU 的相关寄存器名表示。结构类型h代表 8 位寄存器变量,其成员与相关的CPU 的 8 位寄存器同名。3.中断的调用。在程序中一共使用了两种

12、软中断调用方式,int86() 和 geninterrupt() 。四、算法设计该游戏算法并不复杂,主要集中在布雷和扫雷过程中。一、布雷开始时,利用 C 语言中随机数的生成函数 random 在已经初始设空 (NULL) 的区域内布 10 个雷。如果重复,重新布一次。二、设置雷区下数值当雷布好后, 就进入了其他非雷区域设定阶段。 由于雷是随机布放的, 没有类的地方被点击后就会显示一个数字, 表示它周围有几个雷。 因此,可以把整个雷区看成如下所示的一个二维数组11 12 13 14 15 16 17 1821 22 23 24 25 26 27 28ai,j=31 32 33 34 35 36

13、37 3841 42 43 44 45 46 47 4851 52 53 54 55 56 57 58假若要知道 a 3,4 周围有几个雷,就必须检测下面8 个雷区是否放上了雷。a2,3a2,4a2,5a3,3a3,5a4,3a4,4a4,5仔细观察它们存在的数学关系,发现ai,j 周围的雷个数是由这样8 个雷区决定的(如果超出了边界,应再加以判断) :ai-1,j-1ai-1,jai-1,j+1ai,j-1ai,j+1ai+1,j-1ai+1,jai+1,j+1三、玩家按键最后就是处理玩家在游戏过程中的按键。玩家有两种鼠标按键选择,左键和右键。此外,玩;.家还可能键盘按键, 而该游戏中主要是

14、提供鼠标按键,所以必须对用户按了什么键首先判断。用户按 Esc 键时退出游戏;按鼠标左键时,进一步判断是否是雷;按右键时,标记可能是雷的区块,并及时修改Mines 剩余值。若在已经标记过的区块再点一次右键,则取消标记。五、物理实现一、鼠标编程由于该游戏的特点,在编游戏的开始阶段我就选择了利用Turbo C 调用中断, 编写一组鼠标操作函数。鼠标驱动程序提供了一个标准的软件中断接口,在加载了鼠标驱动程序之后,无论鼠标的类型如何,应用程序都可以直接通过该软件接口操作鼠标。该接口的中断号为INT33H ,其使用方法和其他BIOS 的中断调用完全相同。以下,介绍程序中主要的几个鼠标函数:(1)初始化鼠

15、标函数InitMouse() :该函数用于判断是否安装了鼠标及其驱动程序,如果是,初始化鼠标驱动程序并返回鼠标的按钮数(2 或 3);否则返回0。该函数调用了 INT33H 的 00H 号功能。BYTE InitMouse()union REGS regs;int86(MOUSE, &regs, &regs);(2)显示鼠标光标函数MouseShow() :鼠标光标在文本显示下是个矩形光标,在图形方式下是一个箭头。用户移动鼠标,则光标随之移动。该函数调用了INT33H的 01H号功能。void MouseShow()union REGS regs;regs.x.ax = 1;i

16、nt86(MOUSE, &regs, &regs);(3)隐藏鼠标光标函数MouseHide() :大体同( 2),只是该函数调用了INT33H的 02H号功能。( 4) 读鼠标状态函数 GetXY() :该函数调用了 INT33H 的 03H 号功能。 void GetXY(int *x,int *y)union REGS ireg,oreg;int86(MOUSE,&ireg,&oreg);参数 x 和 y 存放的是读出的鼠标坐标。;.这里值得特别注意的是,如果是在文本方式( 80x25)下,此时鼠标所在的文本行、列位置与其坐标之间存在如下关系:鼠标所在的文

17、本列=x/8 ;鼠标所在的文本行=y/8 ;(5)设置鼠标光标位置的函数SetXY() :该函数调用了INT33H 的 04H 号功能。void SetXY(int x,int y)union REGS ireg;int86(MOUSE,&ireg,&ireg);参数 x 和 y 存放的是欲设置的鼠标光标坐标。这里值得特别注意的是, 如果是在图形方式下, 按图形方式的实际坐标设置; 如果是在文本方式下,此时鼠标光标坐标与鼠标所在的文本行、列存在如下关系:x= 鼠标所在的文本列*8 ;y=鼠标所在的文本行*8 ;(6)设置鼠标活动范围函数SetRange():该函数调用了INT3

18、3H 的 07H 号功能将鼠标的移动范围限制在屏幕上的一个矩形区域内。void SetRange(int start_x,int start_y,int end_x,int end_y)union REGS r;int86(0x33,&r,&r);int86(MOUSE,&r,&r);二、随机布雷初始化随机数发生器randomize();利用循环,初始设空:for (y=0;y<10;y+)for (x=0;x<10;x+)Mineyx=NULL;Turnyx=FALSE;开始布雷,前后布在同一块的话就利用while 循环重新布一次:for (i=0

19、;i<10;i+);.x=random(10);y=random(10);while (Mineyx)x=random(10);y=random(10);Mineyx=MINE;三、设置雷区下数值对任一块雷区周围的 8 块雷区进行扫描,依次累加到 i 上,最后 i 值即为点开该雷块应显示的数值。可由如下算法实现Int i =0;if (Mineyx!=MINE)if (Mineyx-1=MINE)&&(x-1)>=0) i+;if (Mineyx+1=MINE)&&(x+1)<10) i+;if (Miney-1x=MINE)&&

20、;(y-1)>=0) i+;if (Miney+1x=MINE)&&(y+1)<10) i+;if (Miney-1x-1=MINE)&&(x-1)>=0)&&(y-1)>=0) i+;if (Miney-1x+1=MINE)&&(x+1)<10)&&(y-1)>=0) i+;if (Miney+1x+1=MINE)&&(x+1)<10)&&(y+1)<10) i+;if (Miney+1x-1=MINE)&&(x-1)

21、>=0)&&(y+1)<10) i+;Mineyx=i;四、标记雷块建立一个二维数组Turnyx ,专门记录用户右键的情况,当用户第一次按右键的时候,修改 Turnyx 的值,使之为 2,并把该模块标记为“ * ”,同时 Total 的值自加 1;当用户在该模块上第二次点右键的时候, 修改 Turnyx 的值为 0,并把该模块重新标记为初始的 “?”,同时 Total 的值自减 1。五、游戏结束游戏有四种结束方式:1.用户按 Esc 键强行退出;2.用户点击雷块,游戏失败退出FailExitGame() :for (y=0;y<10;y+)for (x=0;x<10;x+)if (Mineyx=MINE) Prt(x+SX,y+SY,'*',14+128);MouseHide();CursorShow();.printf("nFail!n");delay(4000);exit(0);3.用户标注完10 个雷块,但其中有误标注

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论