进阶版只需要再简单版的基础上增加一个能实现周围坐标展开的功能,并且改变判断是否胜利的条件。
简单版在之前的发布的文章中可看到
如何能够实现坐标展开呢
可以利用递归,首先先判断我们输入的坐标周围的八个坐标,如果周围八个全都不是雷,则先展开这八个坐标。展开这八个坐标后,再依次对这八个坐标每个坐标的周围八个坐标进行判断,依次类推进行判断,直至每个判断的坐标周围全部有雷才停下。
void spread(char arr[hangs][lies], char arr2[hangs][lies], int x, int y)//坐标周围展开
{
int near_x = 0, near_y = 0;
int count = 0;
if (x >= 1 && x <= hang && y >= 1 && y <= lie)//判断输入的坐标是否有效
{
//循环该坐标周围的八个坐标
for (near_x = -1; near_x <= 1; near_x++)
{
for (near_y = -1; near_y <= 1; near_y++)
{
if (arr2[x + near_x][y + near_y] == '#')
{
count = jud(arr2, x + near_x, y + near_y);
if (count == 0)//如果该坐标周围没有雷则全部展开
{
if (arr[x + near_x][y + near_y] == '*')
{
arr[x + near_x][y + near_y] = ' ';
//利用递归第一次扫的坐标后再判断周围八个坐标每个坐标的周围八个坐标,
//直至判断的坐标周围有雷再停下
spread(arr, arr2, x + near_x, y + near_y);
}
}
else
{
arr[x + near_x][y + near_y] = count + '0';
}
}
}
}
}
}
在简单版中,我们一步只能判断一个坐标,因此胜利的条件就是我们扫雷步数等于全部坐标数减去雷的总数即可。但由于