目录
扫雷分析
从小到大你或许没玩过但一定听过的游戏——扫雷
首先我们来分一下“扫雷”的功能
这是一个简单难度的扫雷,从外观上,我们可以发现可供用户操作的棋盘范围是9×9的范围,也就是我们建立的棋盘大小至少要为9,但是问题也就来了,我们如果只建立9×9的棋盘,那么在边缘的格子要进行提示操作的时候就会出现数据越界问题。
为了解决数据越界的问题,我们最好创建一个比可视界面大一圈的数组,即11×11的数组
但是在我们开始做这个小游戏的时候发现了一个问题——一个数组里面包含的数据太多了,可能会发生数据重叠的现象,而且一个数组里面又要放雷,又要存放排雷之后的信息,还要遮掩雷和其他位置,太过麻烦,因此我们可以创建两个数组,一个数组专门用来放雷,一个数组用来存放排雷的信息,注意,这两个数组一定要保证大小一样。
所以我们不妨设置这样两个数组
mine[11][11] //存放雷的信息
show[11][11] //存放排除的雷的信息
/*如果我们直接用数字11来初始化数组,局限性太大了,我们后面如果想要
**进行修改也不好改,所以我们可以引用一个全局变量来初始化数组,这样
**即使我们以后想要玩更大的棋盘扫雷,就能够做到一步更改。考虑到棋盘
**数组的初始化要比棋盘大一圈,所以可以设置为下面这样。
*/
#define ROW 9 //可视化界面是9×9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
mine[ROWS][COLS]
show[ROWS][COLS]
//为了和扫雷游戏保持一样我们在显示扫雷棋盘的时候用符号将它遮住,这里用的是“*”,所以数组类型就确定了
char mine[ROWS][COLS]
char show[ROWS][COLS]
棋盘初始化
建立好数组之后,我们就开始思考可视化界面的建立,根据前面的信息,我们要创建一个9×9的游戏空间时得扩大一圈,因此创建的函数传参用ROWS和COLS,并且我们对这两个的数组初始化也要做出差异,那么要如何来保证一个函数能同时初始化2个数组呢?实现如下:
//将数组初始化的信息作为区分参数,传入函数即可
InitBoard(mine, ROWS, COLS, '0');//没有雷的地方存放字符‘0’
InitBoard(show, ROWS, COLS, '*');//‘*’遮掩扫雷棋盘
//接收传参的函数
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set ;
}
}
}
棋盘显示
初始化之后,是骡子是马,拉出来溜溜,因为我们要保证数据不能越界所以可视化界面比实际数组小一圈