ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:342.12KB ,
资源ID:10663021      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10663021.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(扫雷游戏课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

扫雷游戏课程设计报告.docx

1、扫雷游戏课程设计报告(一) 需求分析 题目:32、实现一个 N*M 的扫雷游戏设计要求:能够实现一个 N*M 的扫雷游戏a、能够打开一个方格(由于做的是静态显示,故在控制台上方格用代替),已打开的方格不能关闭b、能够标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有雷)c、能够给出游戏结果:输、赢d、N和M可由玩家自己设置系统功能需求分析:一个数字和一个雷(boom)。你可以打开(open)一个方格,如果你打开的是 一个boom,那么就失败;否则就会打开一个数字,该数字是位于0,8的一个整数,该数字表示其所有 邻居方格所包含的雷数,应用该信息可以帮助你扫雷。点击到了某区域发现

2、其周围没有雷,那么显而易见应该点开周围的区域,拓展空白区域 (二)概要设计由于知识储备不足,VC中的MFC应用程序又过于复杂,故退而求其次,不再采用动态显示和界面图形化,采用静态显示来实现扫雷游戏中的主要功能。用键盘上的1键代替鼠标左击,即打开一个方格查看其属性,已打开的方格不能在关闭;用键盘上的2键代替鼠标右击,即标记一个方格,标记方格的含义是对该方格有雷的预测(并不表示真的一定有雷)用键盘上的四个键来实现光标在控制台上的自由移动,相当于用鼠标实现光标在图形界面的移动游戏区域的高度与宽度和总雷数可由玩家自己设定应题目要求设计了一个基类:Base和一个继承类:Game。基类Base主要实现一些

3、基本功能:游戏结束时输出游戏的结果:输赢;返回控制台上光标的位置返回按下键时所对应的按键控制符基类Base:类名成员类别类型成员名描述Base方法static intOutput(const char*)在当前位置上输出一串字符static intGotoXY(int, int);取得控制台上光标的坐标位置并返回static intGetKey();等待按下键,并返回所对应的按键控制符继承类Game是本程序的主要内容,也是实现扫雷游戏的关键部分。主要实现的功能:初始化图形界面,把游戏区域在控制台上显示出来;利用随机函数进行随机布雷,以保证玩家每次玩游戏时雷的分布位置均不同;得到一个坐标位置周围

4、的雷数,并把数值返回;在一个坐标点上(x,y)点击,在该位置上显示其周围的雷数或拓展空白区域或失败;如果一个坐标点的周围没有雷,则拓展空白区域,并递归拓展;其中saolei()函数是类Game里的关键函数体,用来判断玩家按下了哪个键,并作出相应反应(上下左右四个方向的移动,打开一个方格,标记一个方格),并判断游戏的输与赢继承类Game:类名成员类别类型成员名描述Game属性intcurX,curY光标位置intpoolWidth,poolHeight游戏区域的高度与宽度intpoolGAME_MAX_HEIGHT+1GAME_MAX_WIDTH+1用二维数组来存储雷的相关属性const sta

5、tic intGMARK_BOOM;GMARK_EMPTYGMARK_MARK;雷的属性:雷(*),空,标记(#)方法intinitpool(int,int,int)初始布雷IntMoveCursor()移动光标inthuatu(int)在控制台上把扫雷区域显示出来inttryopen(int,int)在一个坐标点上(x,y)点击,在该位置上显示其周围的雷数或拓展空白区域或失败intshownum(int,int)得到一个坐标位置周围的雷数,并把数值返回inttuozhan(int,int)如果一个坐标点的周围没有雷,则拓展空白区域,并递归拓展intsaolei()扫雷并判断输赢(三)详细设计

6、核心算法:(1)布雷函数:初始化时把数组里的值全部置为0,然后利用srand(),rand()随机机制产生随机数,分别对列和行取模,便产生了雷的随机位置。但是布雷前,先要判断此随机位置是否已经布上了雷。int Game:initpool(int width,int height,int num) poolWidth=width; poolHeight=height; if(num=width*height|widthGAME_MAX_HEIGHT|width=0|heightGAME_MAX_HEIGHT) return 1; /初始是把游戏区域也即是数组里的值全都置为0 for(int y=

7、0;y=height+1;y+) for(int x=0;x=width+1;x+) poolyx=0; /利用伪随机函数进行随机布雷,以保证每次点击游戏时雷的分布位置不同 srand(time(NULL); while(num!=0) int x=rand()%width+1; int y=rand()%height+1; if(poolyx=0) poolyx=GMARK_BOOM; num-;/num为设置的总雷数 /初始化光标位置 curX=1;curY=1; MoveCursor(); return 0; (2)打开方格,查看方格的属性/在该位置上显示其周围的雷数或拓展空白区域或失败

8、int Game:tryopen(int x,int y) int m=0; if(poolyx & GMARK_BOOM)m=-1; else int count=shownum(x,y); if(count=0)tuozhan(x,y);/拓展空白区域 else poolyx=count; return m; (3)获得周围雷的数目扫描其周围的所有相邻方格,记录雷数,并把值返回;扫描前要选择合理的起始点 int Game:shownum(int x,int y) int count=0; for(int Y=-1;Y=1;Y+) for(int X=-1;X0&x0&y=poolHeigh

9、t)&(poolyx=0) int count=shownum(x,y); if(count=0) poolyx=GMARK_EMPTY; for(int Y=-1;Y=1;Y+) for(int X=-1;X=1;X+) tuozhan(x+X,y+Y); else poolyx=count; return 0;(5)在控制台上把扫雷区域显示出来在还未按键时,调用huatu()函数把游戏界面在控制台上显示出来,即全部显示为方格。以后每按键一次。刷新一次界面int Game:huatu(int n=0) for(int y=1;y=poolHeight;y+) Base:GotoXY(1,y)

10、; for(int x=1;x0 & poolyx=8) putchar(0+poolyx); else if(n=0 & (poolyx& GMARK_MARK) ) putchar(#); else if(poolyx& GMARK_BOOM) if(n!=0)putchar(*); else putchar(.); return 0;(6)判断是否胜利判断游戏是否胜利的条件在saolei()函数体内,在主函数里调用saolei()进行循环,直到戏赢了或输了才退出循环,并在控制台上输出结果;游戏赢了返回1,按下ESC键退出游戏返回-1,记为输,扫到雷也是返回-1判断是否赢了游戏:按下键1后

11、,对整个游戏区域进行检测,如果检测不到值为0的方格,即所有的雷已被扫出,则返回1,游戏胜利;按下ESC键退出游戏和扫到雷均为输,返回-1if(Key = KEY_1 )/判断是否赢了游戏 int y=1; for(;y=poolHeight;+y) int x=1; for(;x=poolWidth; +x) if(poolyx=0)break; if(x=poolWidth) break; if(! (y=poolHeight) m = 1; (四)调试分析和测试(1)由玩家设置游戏区域的高度与宽度,并设置总雷数按下回车键后界面如下: 按下键1开始扫雷,扫雷过程部分界面如下:游戏输时显示的结

12、果:(2)直接按下ESC键时输掉游戏:然后按下回车键后,直接按下ESC键,结果如下:(3)为了使快速赢得游戏,减少雷的数目:游戏运行过程部分界面如下:按下键2对怀疑有雷的区域进行标记游戏胜利时显示的界面:(五)源程序附录源程序:#include#include#include/包含伪随机数发生函数#include/包含返回一个字符在控制台屏幕上坐标的文件#include/包含getch()库函数:从控制台读取一个字符,但不显示在屏幕上/#define 定义的一些宏变量/键盘上上、下、左、右四个键和一些按键对应的ASCII编码#define KEY_UP 0xE048 #define KEY_D

13、OWN 0xE050#define KEY_LEFT 0xE04B#define KEY_RIGHT 0xE04D#define KEY_ESC 0x001B#define KEY_1 1#define KEY_2 2/设置游戏区域的最大长度与高度#define GAME_MAX_WIDTH 100#define GAME_MAX_HEIGHT 100/游戏初始时在控制台上输出的游戏提示#define GAMETITLE ArrowKey:MoveCursor KEY1:Open Key2:Mark/当游戏结束时输出的字符#define GAMEWIN Congratulations! You

14、 Win! Thank you for playing!n#define GAMEOVER Sorry,you lose! thank you for playing!n #define GAMEEND Press ESC to exitn/基类/ Base classclass Base public: static int Output(const char*); static int GotoXY(int, int); static int GetKey(); ; int Base:GetKey()/等待按下键,并返回所对应的按键控制符 int nkey=getch(),nk=0; if

15、(nkey=128|nkey=0)nk=getch();/等待你按下任意键后,把该键字符所对应的ASCII符付给nk后,在执行下面语句 return nk0?nkey*256+nk:nkey; int Base:GotoXY(int x, int y)/取得控制台上光标的坐标位置并返回 COORD cd; cd.X = x;cd.Y = y; return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd); int Base:Output(const char* pstr)/在当前位置上输出一串字符 for(;*pstr;

16、pstr+)putchar(*pstr);/函数向标准输出设备输出一个变量的字符形式 return 0; /继承class Game:public Base private: int curX,curY; int poolWidth,poolHeight;/雷区间的总高度与宽度,相当与height int poolGAME_MAX_HEIGHT+2GAME_MAX_WIDTH+2; public: Game():curX(0),curY(0)poolWidth=poolHeight=0; int initpool(int,int,int);/初始化游戏区域,设置游戏区域的高度与宽度,并设置总雷

17、数 int MoveCursor()return Base:GotoXY(curX,curY); int huatu(int);/在控制台上把扫雷区域显示出来 int shownum(int,int);/得到一个坐标位置周围的雷数,并把数值返回 int tryopen(int,int);/在一个坐标点上(x,y)点击,在该位置上显示其周围的雷数或拓展空白区域或失败 int saolei(); private: int tuozhan(int, int);/如果一个坐标点的周围没有雷,则拓展空白区域,并递归拓展 private: const static int GMARK_BOOM; cons

18、t static int GMARK_EMPTY; const static int GMARK_MARK; const int Game:GMARK_BOOM = 0x10; /*所对应的ASCII编码 ,用*表示地雷 const int Game:GMARK_EMPTY= 0x100;/空白所对应的ASCII编码 const int Game:GMARK_MARK = 0x200;/#所对应的ASCII编码,用#表示作标记int Game:initpool(int width,int height,int num) poolWidth=width; poolHeight=height; i

19、f(num=width*height|widthGAME_MAX_HEIGHT|width=0|heightGAME_MAX_HEIGHT) return 1; /初始是把游戏区域也即是数组里的值全都置为0 for(int y=0;y=height+1;y+) for(int x=0;x=width+1;x+) poolyx=0; /利用伪随机函数进行随机布雷,以保证每次点击游戏时雷的分布位置不同 srand(time(NULL); while(num!=0) int x=rand()%width+1; int y=rand()%height+1; if(poolyx=0) poolyx=GM

20、ARK_BOOM; num-;/num为设置的总雷数 /初始化光标位置 curX=1;curY=1; MoveCursor(); return 0; /在控制台上把扫雷区域显示出来 int Game:huatu(int n=0) for(int y=1;y=poolHeight;y+) Base:GotoXY(1,y); for(int x=1;x0 & poolyx=8) putchar(0+poolyx); else if(n=0 & (poolyx& GMARK_MARK) ) putchar(#); else if(poolyx& GMARK_BOOM) if(n!=0)putchar

21、(*); else putchar(.); return 0; /得到一个坐标位置周围的雷数,并把数值返回 int Game:shownum(int x,int y) int count=0; for(int Y=-1;Y=1;Y+) for(int X=-1;X0&x0&y=poolHeight)&(poolyx=0) int count=shownum(x,y); if(count=0) poolyx=GMARK_EMPTY; for(int Y=-1;Y=1;Y+) for(int X=-1;X1)curY-; nArrow=1; break; case KEY_DOWN: if(cur

22、Y1)curX-; nArrow=1; break; case KEY_RIGHT: if(curXpoolWidth)curX+; nArrow=1; break; case KEY_1: m = tryopen(curX, curY); break; case KEY_2: if(poolcurYcurX & (GMARK_MARK|GMARK_BOOM)=0) poolcurYcurX = GMARK_MARK; break; case KEY_ESC: m =-1; break; if(Key = KEY_1 )/判断是否赢了游戏 int y=1; for(;y=poolHeight;+y) int x=1; for(;x=poolWidth; +x) if(poolyx=0)break; if(x=poolWidth) break; if(! (y=poolHeight) m = 1; if(nArrow=0) huatu();/如果按下了key_1,key_2键,则显示扫雷结果 MoveCursor(); return m; void main() int x,y,b;/定义扫雷区域的高与宽,并设置游戏中得总雷数 coutx;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1