c语言扫雷游戏报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

相关文档
最新文档