实现思路
用二维数组做扫雷盘,埋雷函数,扫雷动作函数,自动覆盖空格函数
二维数组的列和行都分别比扫雷基本盘的多两行;
埋雷函数
void set_mine(char board[][cols], int ROW, int COL)
{
int i=EAZY_MINE;
while (i)
{
int x = rand() % 10;
int y = rand() % 10;
if (board[x + 1][y + 1] != '1')
{
board[x + 1][y + 1] = '1';
i--;
}
}
}
扫雷动作函数和自动覆盖周围无雷区域函数(注意多出来的两行全为0时,对自动覆盖函数有影响,需要条件限制无雷区域覆盖在基本扫雷盘之外的两行进行覆盖)
//扫雷动作函数
void move(char show[][cols], char mine[][cols], int ROW, int COL)
{
int i = ROW, j = COL;
if (show[ROW][COL] != '*')
{
cout << "坐标已被选中过,请重新输入"<<endl;
return;
}
if (mine[ROW][COL] == '1')
{
show[ROW][COL] = '#';
}
else
{
show[ROW][COL] = mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1]
+ mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j - 1] + mine[i + 1][j]
+ mine[i + 1][j + 1] - 8 * '0' + '0';
if (show[ROW][COL]=='0')
{
show[ROW][COL] = ' ';
i = ROW - 1;
j = COL - 1;
move1(show, mine, i, j);
move1(show, mine, i, j+1);
move1(show, mine, i, j+2);
move1(show, mine, i+1, j);
move1(show, mine, i+2, j);
move1(show, mine, i+1, j+2);
move1(show, mine, i+2, j+1);
move1(show, mine, i+2, j+2);
}
}
}
//自动覆盖周围函数
void move1(char show[][cols], char mine[][cols], int ROW, int COL)
{
int i = ROW, j = COL;
if (show[ROW][COL] != '*')
return;
if (mine[ROW][COL] == '1'|| ROW==0 || ROW==rows-1 || COL==0 ||COL==cols-1)
return;
else
{
show[ROW][COL] = mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1]
+ mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j - 1] + mine[i + 1][j]
+ mine[i + 1][j + 1] - 8 * '0' + '0';
if (show[ROW][COL] == '0')
{
show[ROW][COL] = ' ';
i = ROW - 1;
j = COL - 1;
//上
for (;j <= COL + 1;j++)
{
move1(show, mine, i, j);
}
j--;i++;
//右
for (;i <= ROW + 1;i++)
{
move1(show, mine, i, j);
}
i--;j--;
//下
for(;j>=COL-1;j--)
move1(show, mine, i, j);
j++;i--;
//左
for(;i>=ROW-1;i--)
move1(show, mine, i, j);
i++;
}
}
}