完整工程文件:
https://github.com/Yubao-wss/Game/tree/master/Demine/Demine
如下代码为排雷函数:
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int k = 0;
int l = 0;
int win = 0;
while (win < row*col - COUNT)
{
printf("请输入要排查的坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (win == 0) //判断是否为第一步
{
if (mine[x][y] == '1')
{
mine[x][y] = '0';
while (1)
{
k = rand() % row + 1;
l = rand() % col + 1;
if (mine[k][l] == '0')
{
mine[k][l] = '1';//移动雷
break;
}
}
}
win++;
/*DisplayBoard(mine, ROW, COL);*/
}
if (mine[x][y] == '1')
{
printf("你被炸死了!\n");
DisplayBoard(mine, row, col);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
if (count == 0)
{
OpenBoard(mine, show, x, y); //调用展开函数
}
DisplayBoard(show, row, col);
win = 0;//初始化win计数
for (x = 1; x <= row; x++)
{
for (y = 1; y <= col; y++)
{
if (show[x][y] != '*')
win++; //win此时等于现在玩家棋盘上不是‘*’的坐标的个数
}
}
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
if (win == row*col - COUNT) //成功的条件
{
printf("排雷成功!\n");
DisplayBoard(mine, row, col);
}
}
展开函数:
void OpenBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
show[x][y] = ' ';
if (mine[x - 1][y] == '0'&&x - 1 > 0 && y > 0 && show[x - 1][y] == '*')
{
x = x - 1;
show[x][y] = GetMineCount(mine, x, y) + '0';
if (GetMineCount(mine, x, y) == 0)
{
OpenBoard(mine, show, x, y);
}
x = x + 1;
}
if (mine[x][y + 1] == '0'&&x > 0 && y + 1 > 0 && show[x][y + 1] == '*')
{
y = y + 1;
show[x][y] = GetMineCount(mine, x, y) + '0';
if (GetMineCount(mine, x, y) == 0)
{
OpenBoard(mine, show, x, y);
}
y = y - 1;
}
if (mine[x][y - 1] == '0'&&x > 0 && y - 1 > 0 && show[x][y - 1] == '*')
{
y = y - 1;
show[x][y] = GetMineCount(mine, x, y) + '0';
if (GetMineCount(mine, x, y) == 0)
{
OpenBoard(mine, show, x, y);
}
y = y + 1;
}
if (mine[x + 1][y] == '0'&&x + 1 > 0 && y > 0 && show[x + 1][y] == '*')
{
x = x + 1;
show[x][y] = GetMineCount(mine, x, y) + '0';
if (GetMineCount(mine, x, y) == 0)
{
OpenBoard(mine, show, x, y);
}
x = x - 1;
}
}
还有很多需要优化的地方!
执行情况