一、实现扫雷的基本思路
1.游戏部分创建两个二维数组,display和hide数组。hide数组是存放炸弹的数组,有炸弹是1,没有炸弹是0;display数组是用来展示地雷的数组,未知显示‘*’,排查的地方显示周围8个地方地雷总数量
2.初始化二维数组
3.实现玩家扫雷的逻辑:玩家输入一个坐标,踩雷游戏结束,未踩雷显示显示周围8个地方地雷总数量
4.排查结束,游戏胜利,玩家可重来或退出
游戏效果展示
代码思路:
1.需要两个二维数组,1个用来展示,一个用来放置地雷
//创建两个二维数组
char display[ROW + 2][COL + 2] = { 0 };
char hide[ROW + 2][COL + 2] = { 0 };
//棋盘的初始化
memset(display, '*', (ROW + 2) * (COL + 2));
memset(hide, '0', (ROW + 2) * (COL + 2));
//放置地雷
//地雷是字符1 ,安全是0
void PutMine(char arr[ROW + 2][COL + 2], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (1)
{
x = rand() % row + 1;
y = rand() % row + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
++count;
}
if (count == MineCount)
break;
}
}
2.玩家开始扫雷
扫雷逻辑
//玩家开始扫雷
int x = 0;
int y = 0;
int win = 0;
while (1)
{
printf("请输入坐标,中间加上空格:");
scanf("%d %d", &x, &y);
Player(display, hide, x, y);
//判断是输赢还是继续
int ret = IfWin(hide, x, y);
Print(display, ROW, COL);
printf("\n");
++win;
if (ret == 0)
break;
if (win == ROW*COL- MineCount)
{
printf("恭喜你,赢得游戏,退出或者再玩一次\n");
break;
}
}
}
//玩家开始扫雷
void Player(char display[ROW + 2][COL + 2], char hide[ROW + 2][COL + 2], int x, int y)
{
while (1)
{
//判断坐标合法性
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
//数这个坐标周围8个格子共有多少个雷
int count = 0;
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (i == x && j == y)
continue;
if (hide[i][j] == '1')
++count;
}
}
display[x][y] = count + '0';
break;
}
else
{
printf("坐标非法,请重新输入:");
scanf("%d %d", &x, &y);
}
}
}
//判断是否踩雷
//猜到雷返回0
//安全返回1
int IfWin(char hide[ROW + 2][COL + 2], int x, int y)
{
if (hide[x][y] == '1')
{
printf("你踩到雷了,游戏失败\n");
return 0;
}
return 1;
}