可以在基础扫雷上进行升级
1,使旁边没有雷的地方全部展开
2,用户可以标记其认为是雷的地方
一,基于上一篇博客中的FindCount函数,需要做出如下改变
1,利用SetBlack递归去判断周围雷的个数
如果周围没有雷,那么就不打印,用空格替代,继续往下递归
如果有雷,那么就去获取雷的个数,赋值给show数组中
递归的结束条件为周围有雷,继续条件为周围没有雷
void SetBlack(char show[ROWS][COLS], char mine[ROWS][COLS], int x,int y)
{
int count = GetMineCount(mine, x, y);
if (count == 0)
{
show[x][y] = ' ';
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (i >= 1 && i <= ROW && j >= 1 && j <= COL && show[i][j] == '*')
SetBlack(show, mine, i, j);
}
}
}
else
{
show[x][y] = count + '0';
}
}
2,判断游戏结束方式的改变
我们应该使用MineCount函数去获取show中剩余‘*’的个数。
如果设置雷的个数等于剩余’*‘的个数,那么就游戏成功。
int MineCount(char show[ROWS][COLS], int row, int col)
{
int count = 0;
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++)
{
if (show[i][j] == '*')
{
count++;
}
}
}
return count;
}
二,进行标记雷的地方
我们可以用#来标记疑似雷的地方
1,询问用户是否标记,1代表标记,0代表不标记
2,定义一个MarkCount函数
先判断坐标的合法性,合法再进行标记
void MarkCount(char show[ROWS][COLS])
{
int x, y;
while (1)
{
printf("请输入要标记的坐标!\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL && show[x][y] == '*')
{
show[x][y] = '!';
break;
}
else
{
system("cls");
printf("坐标非法,请重新输入\n");
PrintBoard(show,ROW, COL);
}
}
}
3,可以适当使用system("cls")来清屏提高代码整洁度
system头文件为<windows.h>