扫雷游戏课程设计_第1页
扫雷游戏课程设计_第2页
扫雷游戏课程设计_第3页
扫雷游戏课程设计_第4页
扫雷游戏课程设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

扫雷小游戏系统目录TOC\o"1-3"\h\u32211第一章课程设计功能需求描述 145191.1功能列表与说明 1252291.2操作界面与操作方法 1第14320二章设计描述 3286012.1课程设计任务分解 3312302.2课程设计的函数接口说明 3280312.3程序中的数据结构 5第8622三章程序算法描述 6204533.1主要函数流程图 6第31513四章程序源代码,运行及遇到的问题 104.1源代码9465 104.2编译程序中遇到的错误类型9465 244.3调试过程中碰到的问题9465 254.4测试程序功能所用的数据和测试方法9465 25第五章课程设计心得体会9465 27第一章课程设计功能需求描述

1.1功能列表与说明进入了大学,我学会了C++程序编码,在学校的课程安排之下,我进行了一项C++代码的课程设计,我所选的题目是扫雷游戏。扫雷游戏是比拟经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C,C++,VB,JAVA等。我设想设计一个和window自带扫雷小游戏有相似功能的扫雷〔1.标记2.翻开3.显示所用的时间4.玩多盘成功率5.显示地雷等一系列的功能〕。但由于本人能力有限,本次课题研究的是以Visual

C++

6.0为开发环境,设计了这个扫雷小游戏,不同于windows自带的扫雷,功能比拟少,此程序是用键盘进行操作完成游戏,可能会有点复杂,繁琐,但并不影响游戏的效果,经过一番设想,我力求用最简单明了的方式将游戏呈现给大家,方便大家理解与操作体会C++游戏带来的乐趣与独到之处。本系统的功能如下:1.输入地雷数功能:玩家通过键盘输入想要设定的地雷数目。2.游戏功能:玩家输入地雷数目后,会出现一个游戏界面,然后玩家就可以根据要求一步一步的进行游戏。玩家每进行一次键盘输入,游戏界面就会发生变化,让玩家判断地雷的位置,以便进行下一步。这个功能里面包含失败与成功,当方块翻开且有雷时,就失败了,直到游戏满足结束条件,玩家胜利。3.输出地雷位置功能:在游戏结束后,会输出本次游戏地雷所在方块及周围方块的情况。1.2操作界面具体的游戏界面设计如下:在游戏的开始局部,我会输出“设定的地雷为”让玩家输入想要的设定的地雷数。当输入地雷数后,按下任意键会出现以下界面@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@图1-1游戏界面请输入坐标:X=;Y=;请输入操作〔1:翻开2:标记〕1.3操作方法当游戏界面出现后,玩家只需输入自己想要翻开或标记的方块的坐标,然后选择所想要进行的操作1或2,然后界面就会输出运行的结果,这样反复循环直到翻开了有地雷的方块或你成功翻开了所有的方块。第二章设计描述2.1课程设计任务分解由于各种原因,本次这个小游戏除了可以实现可以扫雷外,没有其它的功能了,比方所用时间,再来一盘,等等一类,这个小游戏只有单纯的扫雷过程。本次课程设计的整体规划如下列图所示,所以任务就是把各个方格中的语言描述转换成C语言代码,再把他们相互连接起来。图2-1任务分解图游戏运行设想是,利用for循环,if循环的嵌套依次扫描界面上的坐标,如果选择将该块翻开,并且该块周围没有雷的话,那么将其余8块翻开,并记录翻开的雷的数量,直到所有坐标被翻开,或踩到雷时游戏结束,具体步骤如下:

〔1〕从头到尾扫描并计数翻开的数量:利用for循环扫描所有满足条件的数组,再利用if循环,如果该块翻开且周围没有雷,那么周围8块全部翻开,并统计翻开的块数。

〔2〕屏幕输入输出:游戏的界面通过直接输出一个11*11的有@组成的格式,利用for循环,if循环的嵌套依次扫描界面上的坐标,如果a[][][2]==1,并且该块周围没有雷的话,输出为空格。如果该块不翻开,而是做标记a[i][j][2]

==

2时,就输出*,未翻开或标记的仍然输出@。

〔3〕输入坐标操作:设置三个参数x,y,choice,利用cout在屏幕上输出"输入坐标x=","输入坐标y=",使用while语句,如果输入的坐标值已经被翻开,那么利用cout输出"已经翻开,请重新输入!",然后执行上一步操作。接着用cout输出“选择操作(翻开:1,标记:2):”如果该坐标未被翻开,跳过while语句往下执行if语句,当choice被赋值为1时,〔即翻开操作〕此块翻开没有雷且周围8块雷数为0的时候,程序按步骤〔1〕继续进行,假设翻开有雷的话,那么利用cout输出“

很遗憾!

踩到地雷了!!!

GameOver!”游戏至此结束,当choice被赋值为2时,按〔2〕中操作输出a[][][2]==2。2.2课程设计的函数接口说明本次课程设计的函数包含有输入界面函数voidshuru(),输出函数voidshuchu(),执行循环的voidxunhuan()函数,还有中间玩的函数intplay〔〕,主函数intmain〔〕。主函数中调用了玩的函数和输入界面函数和输出函数,玩的函数中调用了输出和循环函数,详情如下:主函数:原型:intmain〔〕功能:调用各种函数实现课程设计功能需求要求。返回值:正确返回0,失败返回1.输入函数:原型:voidshuru〔〕功能:使用for循环输入游戏界面。返回值:无。循环函数:原型:voidxunhuan〔〕功能:用来将满足条件并且未翻开的方块翻开。玩的函数:原型:intplay〔〕功能:调用所需要的函数,实现游戏玩耍的过程。返回值:gameflag==0时返回0,gameflag==1时返回1.2.3程序中的数据结构本次课程设计包含的头文件有

iostream.hstdio.h

time.hstdlib.h,其中stdio.iostream是标准输入输出库,函数必备,time.h是时间库,要用到里面的时间作为随机布置地雷的种子,stdlib.h标准工具库,要用到其中的rand()函数。定义静态数组staticinta[11][11][4],a[][][0]表示有无雷,a[][][1]表示周围雷的个数,a[][][2]表示是否翻开,a[][][3]表示是否已经翻开,其设置为静态的,这样的好处是静态数据成员只分配一次内存,供所有对象共用,并且能将变量的值保存至下一次调用时,提高了系统的运行速度。第三章程序算法描述3.1程序中的主要函数流程图开始主函数的流程图:开始否否输入n的值输入n的值调用输入函数调用输入函数i=0i=0i<11?<11i<11?<11是否是否i++j=0i++j=0j<11?j<11?是是a[i][j][0]=0a[i][j][1]=0a[i][j][0]=0a[i][j][1]=0a[i][j][2]=0a[i][j][3]=0j++j++随机函数设置地雷位置随机函数设置地雷位置计算a[i][j][1]周围的地雷数计算a[i][j][1]周围的地雷数Gameflag=0=0Gameflag=0=0否否调用play函数调用play函数结束结束图3-1主函数程序流程图图3-1主函数程序流程图Choice==2?操作的选择1,2的输入输入坐标x,y的判断开始2.play函数的流程图Choice==2?操作的选择1,2的输入输入坐标x,y的判断开始否a[x][y][2]=2;_num++;是a[x][y][2]=2;_num++;当choice==1时的运行当choice==1时的运行f==0?f==0?是否执行循环函数和循环条件执行循环函数和循环条件i=0i=0否i<11?否i<11?是i++j=0i++j=0j<11?根据a[][][]的状况,分别输出不同的符号否j<11?根据a[][][]的状况,分别输出不同的符号j++j++是图3-2程序流程图结束 图3-2程序流程图结束开始当choice=1时的流程图:开始Choice==1?Choice==1?是a[x][y][0]==0?否 a[x][y][0]==0?a[x][y][1]==0?是a[x][y][1]==0? 否 否是{a[x][y][2]=1;num++;a[x][y][3]=1;{a[x][y][2]=1;num++;a[x][y][3]=1;a[x-1][y+1][2]=1;num++;//周围8块的坐标是否翻开a[x-1][y][2]=1;num++;a[x-1][y-1][2]=1;num++;a[x][y+1][2]=1;num++;a[x][y-1][2]=1;num++;a[x+1][y-1][2]=1;num++;a[x+1][y][2]=1;num++;a[x+1][y+1][2]=1;num++;结束a[][][2]=1;输出失败的语句 结束a[][][2]=1;输出失败的语句 图3-3程序流程图循环模块的流程图〔包括循环函数和判断是否循环〕开始开始否f==0否f==0是是利用循环扫描界面利用循环扫描界面否利用循环扫描界面f=1a[i][j][3]=1;利用if语句使周围八块按要求赋值;a[i][j][1]==0&&a[i][j][2]==1&&a[i][j][3]==0? 否利用循环扫描界面f=1a[i][j][3]=1;利用if语句使周围八块按要求赋值;a[i][j][1]==0&&a[i][j][2]==1&&a[i][j][3]==0?是是否 否是是图3-4程序流程图结束否否是f=0a[i][j][1]==0&&a[i][j][2]==1&&a[i][j][3]==0? 图3-4程序流程图结束否否是f=0a[i][j][1]==0&&a[i][j][2]==1&&a[i][j][3]==0?程序源代码和开发中的问题4.1源代码1.源代码为:#include<iostream.h>#include<stdio.h>#include<time.h>//时间库,要用到里面的时间来做随机数的种子#include<stdlib.h>//标准工具库,要用到其中的rand()staticinta[11][11][4];//a[][][0]有无雷a[][][1]周围雷的个a[][][2]翻开没有;intgameflag=1;//游戏是否继续进行,=0就是结束游戏〔gameflag为一个变量〕intflag;//完成游戏后gameflag=0,flag区分是否完成游戏intnum=0;//翻开几块int_num=0;//标记地雷总数inth;//地雷总数intplay();//声明play函数voidshuru();//声明输入函数voidxunhuan();//声明循环函数voidshuchu();//声明输出函数intplay()//定义play函数{intx,y,choice;intf;f=0;cout<<"输入坐标x(0~10)=";cin>>x;cout<<"输入坐标y(0~10)=";cin>>y;while(a[x][y][2]!=0)//如果该块已经翻开,那么执行括号内语句,否那么{cout<<x<<","<<y<<"已经翻开或标记,请重新输入!"<<endl;cout<<"输入坐标x(0~10)=";cin>>x;cout<<"输入坐标y(0~10)=";cin>>y;}cout<<"选择操作(翻开:1,标记:2):";//如果未翻开,直接执行此句cin>>choice;if(choice==1){if(a[x][y][0]==0){if(a[x][y][1]==0){a[x][y][2]=1;num++;a[x][y][3]=1;a[x-1][y+1][2]=1;num++;//周围8块的坐标是否翻开a[x-1][y][2]=1;num++;a[x-1][y-1][2]=1;num++;a[x][y+1][2]=1;num++;a[x][y-1][2]=1;num++;a[x+1][y-1][2]=1;num++;a[x+1][y][2]=1;num++;a[x+1][y+1][2]=1;num++;}else{a[x][y][2]=1;num++;}}else{ cout<<"\t\t很遗憾!踩到地雷了!!!GameOver!"<<endl; cout<<endl;shuchu();system("pause");/*system是一个系统调用pause是一个系统操作;目的是为了不让运行窗口一闪而过,让你看清楚运行的结果。*/gameflag=0;//游戏结束flag=0;return0;}}if(choice==2){a[x][y][2]=2;_num++;}f=0;while(f==0)//循环0的输出。{intd,e;xunhuan();f=1;for(d=0;d<11;d++){for(e=0;e<11;e++){if(a[d][e][2]==1&&a[d][e][1]==0&&a[d][e][3]==0){f=0;break;}}if(f==0)break;}}inti,j;/****************重头到尾的扫描***************/for(i=0;i<=10;i++)//输出游戏界面{for(j=0;j<=10;j++){if(a[i][j][2]==1)//如果该块翻开{cout<<""<<a[i][j][1]<<"";}elseif(a[i][j][2]==2){cout<<"*";}else{cout<<"@";}}cout<<endl;}system("pause");/******************从尾到头的扫描并计数翻开的数量**********/for(i=0;i<=10;i++)//输出游戏界面{for(j=0;j<=10;j++){if(a[i][j][2]==1){if(a[i][j][1]==0)cout<<"";elsecout<<""<<a[i][j][1]<<"";}elseif(a[i][j][2]==2)//标记就输出*cout<<"*";elsecout<<"@";//没有翻开的输出@}cout<<endl;}if(num>=(143-_num))//如果完成了游戏推出{gameflag=0;flag=1;return0;}/********************************屏幕输出****************************/cout<<"你已经翻开了"<<num<<"块"<<"标记地雷总数:"<<_num<<"地雷总数"<<h<<endl;return1;}intmain(){intn;cout<<"设置地雷数(10-30)n=";//设置地雷数cin>>n;h=n;system("cls");//调用清屏命令shuru();//初始化inti,j;for(i=0;i<11;i++)for(j=0;j<11;j++){a[i][j][0]=0;a[i][j][1]=0;a[i][j][2]=0;a[i][j][3]=0;}/*****************设置地雷**************/srand((unsigned)time(NULL));/*随机的种子〔rand是设计随机数的种子,作用是使每次产生的随机数不一样,time(NULL)会返回一个表示当前系统时间的整数,把这个数作为种子就能保证程序每次运行结果都不一样了〕*/intn1,n2;for(i=1;i<=n;){n1=rand()%9+1;n2=rand()%9+1;if(a[n1][n2][0]!=1){a[n1][n2][0]=1;i++;}elsecontinue;}/******************计算某块周围有几颗地雷*************/for(i=0;i<11;i++){for(j=0;j<11;j++){if(a[i][j-1][0]==1)a[i][j][1]++;if(a[i][j+1][0]==1)a[i][j][1]++;if(a[i-1][j][0]==1)a[i][j][1]++;if(a[i-1][j-1][0]==1)a[i][j][1]++;if(a[i-1][j+1][0]==1)a[i][j][1]++;if(a[i+1][j][0]==1)a[i][j][1]++;if(a[i+1][j+1][0]==1)a[i][j][1]++;if(a[i+1][j-1][0]==1)a[i][j][1]++;}}while(gameflag==1){play();}if(flag==1){cout<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<"恭喜,你找到了所有的雷!!!游戏结束!"<<endl;cout<<"输出雷的位置:"<<endl;shuchu();//调用输出函数}system("pause");return0;}voidshuru()//定义输入函数{inti,j;for(i=0;i<11;i++){for(j=0;j<11;j++){cout<<"@";}cout<<endl;}}voidxunhuan()//定义循环函数{intb,c,i,j;for(i=0;i<11;i++){for(j=0;j<11;j++){if(a[i][j][1]==0&&a[i][j][2]==1&&a[i][j][3]==0){a[i][j][3]=1;for(b=i-1;b<=i+1;b++)for(c=j-1;c<=j+1;c++) {if(a[b][c][2]==0) {a[b][c][2]=1;num++;}elseif(a[b][c][2]==1) a[b][c][2]=1; elseif(a[b][c][2]==2) a[b][c][2]=2;}}}}}voidshuchu()//定义输出函数{inti,j;for(i=0;i<=10;i++){for(j=0;j<=10;j++){if(a[i][j][0]==1)cout<<"L";elseif(a[i][j][1]!=0)cout<<""<<a[i][j][1]<<"";elsecout<<"";//没有翻开的输出空格}cout<<endl;}}2.程序的运行〔1〕.设定地雷数目截图intn;cout<<"设置地雷数(10-30)n=";//设置地雷数cin>>n;图4-1程序运行截图〔2〕游戏失败运行截图:图4-2程序运行截图图4-3程序运行截图图4-4程序运行截图图4-5程序运行截图〔3〕游戏胜利运行截图:由于截图过多,只截取重要局部图4-6程序运行截图图4-7程序运行截图图4-8程序运行截图图4-9程序运行截图4.2编译程序遇到的问题及原因经常出现的错误:error

C2018:

unknown

character

'0xa3'

原因是有不认识的字符'0xa3'我在里面参加了汉字导致错误。error

C2065:

'f'

undeclared

identifie原因是我在函数中没有定义f就直接使用了。error

C4716:

must

return

a

value原因是我定义的函数是int,应该有返回值。errorC2000:unexpected

end

of

file

原因是我的大括号使用错误了。等等还有许多错误。4.3调试过程中遇到的问题在以前调试时,我不会使用单步调试,这让我在这次调试上遇到了难题,有些问题我不知道该怎么办,在一次程序辅导课上,指导老师给我详细的解释了单步调试,并且演示给我,这让我在以后寻找程序中的错误是剩下了很多的时间和精力。单步调试的介绍:〔1〕Restart(Ctrl+shift+F5):此debugger功能将从程序的开始(第一有效行)处全速执行,debugger会自动停在程序的main()开始处.这时如果选择StepOver(F10)就可以逐步执行main()函数了.〔2〕StopDebugging(Shift+F5):此debugger功能将终止(所有)调试,并返回到常规编辑状态.〔3〕StepInto(F11):此功能可以单步进入到在调试过程中所跟踪的调用函数的语句的函数内部.选择StepInto(F11)后,Debugger将进入Display()函数内部并停在Display()函数内部的第一条语句上.(此时,就可以StepOver(F10)对Display()函数进行单步调试了.)〔4〕StepOver(F10):此功能可以单步对所在函数单步调试,如果调试的语句是一个调用函数的语句时,Debugger将全速执行所调用的函数,单步(一步)通过所调用的函数,Debugger停该调用语句的下一条语句上.〔5〕StepOut(Shift+F11):此功能将使Debugger切换回全速执行到被调用函数结束,并停在该函数调用语句的下一条语句上.当确定所调用的函数没有问题时可以用这个功能全速执行被调用函数.〔6〕RuntoCursor(Ctrl+F10):此功能将全速执行到包含插入点光标所在的行,可以作为在插入点光标处设置常规断点的一种选择.〔7〕Go(F5):此功能将全速执行程序直到遇到一个断点或程序结束,或直到程序暂停等待用户输入.4.4测试程序功能所用的数据和测试方法在测试时,为了查看我的程序是否正确,我所用的方法是逐步测试,就是将数据0及以后的数逐步输入,查看输出的结论是否正确,以此来判断程序是否正确,在一步一步的测试和之后不断的修改下,最后实现我想要的目的。第五章课程设计心得体会这次设计的最初难点在于如何产生随机数的问题,通过查资料,我发现要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了,

温馨提示

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

评论

0/150

提交评论