一、游戏概述
扫雷游戏如下:规则大致是,打开一个格子,每个格子的数字代表已该格子为中心,四周存在雷的个数,如果所打开的格子是“雷”,则输。
二、想法设计
1,以二维数组的形式来表示该区域,将该区域看作是棋盘。
2,接下来就是对棋盘的设计,我们用‘1’来表示“雷”,‘0’表示不是雷。
3,还需要另外一个棋盘,来表示某个格子处周围“雷”的个数。这时,用数字来表示“雷”的个数的意义就体现出来,当求某个格子周围“雷”的个数时,直接将周围数字加起来就可以了。
4,棋盘的设计,考虑到要将格子周围数加起来,为了防止再加的时候出现越界,所以对数组扩大一圈,扫雷的区域:行ROW,列COL,而设计的是:行ROWS,列COLS。
ROWS=ROW+2,COLS=COL+2;
三、代码展示
1,先拟定一个菜单,让用户进行选择:开始游戏还是退出游戏。用一个do...while循环实现
2,该部分完成后,开始设计游戏内容。
这里用一个自定义函数Initboard初始化棋盘。注:棋盘元素均时字符形式
定义一个mine字符数组用来表示存放雷的棋盘,show数组用来表示排查出某个格子周围有几个雷的信息。再对两个数组初始化,将mine初始化为‘0’(0表示不是雷),将show数组初始化为‘*’,方便后面存放排查出雷的信息。
3,棋盘初始化之后,肯定要先打印出来,依然使用函数的形式处理。
这样棋盘打印出的结果如下:
但为了方便,我们可以顺便把棋盘的行号和列号打印出来。代码可以进行如下改动:
4,棋盘大致已经形成,接下来需要对棋盘进行布雷,以‘1’表示雷。
count表示需要布置雷的个数。
其中通过rand函数产生随机数,从而产生随机坐标(x,y)进行布雷,那么需要在main函数中加上
srand((unsigned int)time(NULL)),表示以时间戳为种子产生随机数。头文件中需包括
#include <time.h> 和#include <stdlib.h>
5,最后需要进行排雷操作
注:字符‘0’ 的ASSIC码值是48,‘1’的ASSIC码值是49,‘2’的ASSIC码值是50......
有‘1’-‘0’=1 ‘2’-‘0’=2 ......
因此再求周围雷的个数时,将周围8个字符加起来的ASSIC码值减去8*‘0’的ASSIC码值即可。
6,最后实践如下