未优化版的扫雷需要1个1个输入坐标,而我们见到的扫雷是点一下展开一片,所以我们进行优化,此外,再加上标记雷和取消雷的操作
void range(char board[ROWS][COLS], char show[ROWS][COLS], int x, int y, int option)
{
if (x == 0 || y == 0 || x == ROWS - 1 || y == COLS - 1) //防止访问边界
return;
if (show[x][y] != '*') //防止重复访问
{
return;
}
if (option == 1) //下棋
{
int num = mine_num(board, x, y);
show[x][y] = ' ';
if (num > 0)
{
show[x][y] = num + '0';
return;
}
if (num == 0)//附近没雷
{
range(board, show, x - 1, y - 1, option);
range(board, show, x - 1, y, option);
range(board, show, x - 1, y + 1, option);
range(board, show, x, y - 1, option);
range(board, show, x, y + 1, option);
range(board, show, x + 1, y - 1, option);
range(board, show, x + 1, y, option);
range(board, show, x + 1, y + 1, option);
}
}
else if (option == 0)//标记雷
{
show[x][y] = 'X';
}
}
void findmine(char board[ROWS][COLS], char show[ROWS][COLS], int r, int c)
{
int win = 0;
while (1)
{
int x = 0;
int y = 0;
int option = 0;
printf("\n请输入坐标->");
scanf("%d %d", &x, &y);
printf("\n0.标记雷\n1.扫雷\n2.取消标记雷\n请选择操作->");
getchar();
scanf("%d", &option);
if (x >= 1 && x <= r && y >= 1 && y <= c) //防止访问边界
{
if (show[x][y] == '*') //未被重复访问
{
if (board[x][y] == '1'&&option==1) //踩到雷
{
printf("\n恭喜你,踩到雷了,游戏失败\n");
break; //游戏结束,跳出循环
}
else //游戏未结束
{
range(board, show, x, y, option);
win++;
}
}
else //被重复排查
{
if (option == 2 && show[x][y] == 'X') //取消标记雷
{
show[x][y] = '*';
}
if(option==1)
printf("\n该地已被排查\n");
}
if (win == r * c - mine ) //胜利,跳出循环
{
printf("\nWIN\n");
print(board, r, c);
break;
}
}
else //访问边界,重新输入
{
printf("坐标非法,请重新输入\n");
}
print(show, r, c);
}
}