建议
如果没看过上一篇文章,可以先看上一篇“扫雷的实现”文章,并尝试完成扫雷程序
如果已经完成扫雷程序,可以先尝试实现扩展发现的函数,再来看
void Expand_Find(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int *count)
{
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (Get_Mine_Count(mine, x, y) == 0 && show[x][y] == '#') // 判断show是#,不然会死循环
{
show[x][y] = '0';
(*count)++;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if (i != 0 || j != 0) // i和j不能同时为0,i不等于0或j不等于0,不能是&&
Expand_Find(mine, show, x + i, y + j, count);
}
}
}
else
{
if (show[x][y] == '#') // 判断show是#,再改不然会重复该多次,导致count加多
{
show[x][y] = Get_Mine_Count(mine, x, y) + '0';
(*count)++;
}
}
}
}
思路
1.当坐标周围没有雷时,直接将‘0’传给show[x][y],*(count)++
2.通过双重for循环,使周围八个位置调用扩展发现函数,实现递归
3.当周围有雷时,传给show[x][y]雷的个数的字符,*(count)++
提醒
1.判断坐标是否合法(递归后坐标可能非法,与之前Find_Mine函数的判断并不重复)
2.判断show[x][y] 是否等于‘#’(第一个),再继续(否则死递归)
3.i和j必须有一个不为零,但由于“提醒2”的存在可以省略
4.判断show[x][y]是否等于‘#’(第二个),是因为会重复给已经更改完的show[x][y]重新更改,导致count加多
5.(*count)++,而不能是*count++,注意运算符优先级
提醒均为作者所一步步调试,而逐步完善的,希望大家也可以通过调试来找到bug(上篇文章有提到)
扩展函数为作者独立完成,如有错误还望各位大佬指正,如有更好的方法也请各位大佬分享,谢谢大家的阅读
修改的Find_Mine函数
void Find_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y, count = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '0')
{
Expand_Find(mine, show, x, y, &count);//原来两行,改为一行
Display_Board(show, ROW, COL);
}
else
{
printf("砰,你被炸死了!\n");
Display_Board(mine, ROW, COL);
break;
}
if (count == ROW * COL - Easy_Count)
{
printf("你赢了!\n");
break;
}
}
else
printf("坐标非法,重新输入!\n");
}
}