我提示:小白的扫雷实现
前言
扫雷和之前的三子琪的原理相似,所以写起来会相对起来方便一点
提示:以下是本篇文章正文内容,下面案例可供参考
一、棋盘的创建
1、原理解释
我们以9*9的棋盘为例子
问题一:处理边界扫雷
我们点击一个地方,显示的数字是以该数字周围八个格子里有几个雷,比如周围八个格子中有一个雷,那么你点击的那个数字会显示 “1”;
但是如果我们的棋盘在做判断的时候,如果坐标是边界的话,那么可能还会导致越界访问,或者需要额外的函数来判断是不是该坐标处于边界的状态,这样写起来比较麻烦,所以我们创建数组的时候可以创建11*11的格子, 最外边一层不放雷就好了。
问题二:如何每次打印数组的时候只打印数字,不打印雷
如果我们将雷随机放在了棋盘中,我们每下一步的时候都会再次打印改变后的数组,那么我们打印的数组可能会将放置好的雷再次打印出来。
所以我们创建两个数组,一个数组放置雷,一个数组展示给玩家。
2、初始化数组
与之前的三子棋一样,我们写一个初始化棋盘的函数
我们将埋雷的 mind数组全部初始化为0,每次放置一个雷的时候 我们将0改成1
我们再将展示的 show数组全部初始化为*,每次输入坐标的时候将* 改成周围八个格子所含雷的数量。
并且提前定义
#define ROW 9
#define ROWS ROW+2
#define COL 9
#define COLS COL+2
char mind[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
initboard(mind, ROWS, COLS, '0');
initboard(show, ROWS, COLS, '*');
void initboard(char board[ROWS][COLS], int rows, int cols,char set)
{