c语言扫雷游戏报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机实习报告
题目编号:c语言扫雷游戏
①需求分析
本程序是上网查找的,程序没有注释,给我对程序的理解造成了很多不便,
首先我们在雷区上随机地放上雷,没有雷的地方被点击后就会显示一个数字表示它周围有几个雷,这是怎么实现的呢?我们可以把整个雷区看成一个二维数组a[i,j],如雷区:
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
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[34]周围有几个雷,就只有去检测
a[23],a[24],a[25]
a[33],a[35]
a[43],a[44],a[45]
这8个雷区是否放上了雷,仔细观察它们成在数学关系。抽象出来就是:a[i,j]的雷的个数就是由
a[i-1,j-1],a[i-1,j],a[i-1,j+1]
a[ i ,j-1], a[ i ,j+1]
a[i+1,j-1],a[i+1,j],a[i+1,j+1]
(如果超出边界再加以判断)这样的8个雷区决定的。
自动展开已确定没有雷的雷区。如果a[3,4]周围雷数为1,a[2,3]已被标示为地雷,那么a[24],a[25],a[33],a[35],a[43],a[44],a[45] 将被展开,一直波及到不可确定的雷区。这也是实现的关键。在被展开时,检查周围
的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。
②程序设计
说明程序中用到的所有数据类型的定义。绘制主程序的流程图
③列出调式过程中遇到的主要问题,并说明解决方法;
1,程序在borlandC环境下运行,会出现printf定义,但在turboC环境下就可以,所以必须在开始添加#include “stdio.h”
2,程序中有许多指令不知道,现在把它都写上:
(1)memset(table,0,sizeof(table));
/*以table为起始地址的一块长为sizeof(table)个字节的内存置0*/ (2)/*rand:返回一个随机数值必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1*/
(3)运算符sizeof是用来求得某种类型(例如sizeof(double))或某个变量在内存中占有的字节数。
④使用说明
•通过space/enter键即可挖开方块。如果挖开的是地雷,则您输掉游戏。
•如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。
•要标记您认为可能有地雷的方块,请按f/F
•如果无法判定某方块是否有雷,请用q/q键两次给它标记一个问号 (Q)。
•要退出游戏请按esc键;
⑥其他
(1)注释源程序代码;
#include "graphics.h"
#include "stdio.h"
#include "STRING.H"
#include
#include
#include
#define ROW 16
#define COL 16
#define STARTX 50
#define STARTY 50
#define SIZEX 20
#define SIZEY 20
#define UNFLAG 0
#define FLAGED 1
#define QUESTION 2
#define OPEN 3
#define EXPLORE 4
#define NULL 0
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define SPACE 0x3920
#define UPPERF 0x2146
#define LOWERF 0x2166
#define UPPERQ 0x1051
#define LOWERQ 0x1071
#define UPPERA 0x1e41
#define LOWERA 0x1e61
#define UPPERN 0x314e
#define LOWERN 0x316e
#define UPPERY 0x1559
#define LOWERY 0x1579
#define ESC 0x11b
int table[ROW][COL];
int flag[ROW][COL];
int num[ROW][COL];
int di[8]={-1,0,1,-1,1,0,1,-1}; int dj[8]={1,1,1,0,0,-1,-1,-1};
int pi,pj;
int gameRes;
void initGraph()
{
int gdriver,gmod;
detectgraph(&gdriver,&gmod);
initgraph(&gdriver,&gmod,"F:\\Program \\TC");
}
/*图形系统初始化*/
void generateMine()
{
int i,j;
int totleMine;
int ri,rj;
int ni,nj;
totleMine=ROW*COL/6;
memset(table,0,sizeof(table));
/*以table为起始地址的一块长为sizeof(table)个字节的内存置 0*/
memset(num,0,sizeof(num));
srand((unsigned)time(NULL));
for(i=0;i { do{ ri=rand()%ROW; rj=rand()%COL; /*rand:返回一个随机数值必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1*/ }while(table[ri][rj]); table[ri][rj]=1; for(j=0;j<8;j++) { ni=ri+di[j]; nj=rj+dj[j];