在写完三子棋之后,扫雷写起来就更加简单了,甚至我只用了两百行就实现了最简单的扫雷游戏,当然也是最简陋的,但我在这里还是写一下主要步骤和思路,注意事项以及不足。
想要实现扫雷,我们主要注意以下几个步骤:棋盘的初始化和绘制----雷的随机放置----玩家排雷和判断
1.棋盘的初始化和绘制:
有些方面和三子棋一样:
(1)棋盘是由二维数组构成,通过玩家手动输入坐标来判断和改变数组中的元素,通过循环来实现数组的输出。
有的方面不像三子棋:
(1)扫雷的棋盘更大,我们往往难以一眼看到自己想要输入的坐标,我们就需要数字来帮助我们看到我们想要输入的坐标,这些通过循环和条件来输出即可。
(2)我们定义的棋盘(数组)需要比展示给玩家的棋盘大一圈,因为我们需要统计一个坐标周围坐标地雷的数量,如果是在边缘的坐标就很难遍历计数,所以我们让棋盘大一圈,但是只给玩家展示内部的棋盘,玩家也只能输入内部棋盘的坐标,
(3)扫雷需要两个棋盘,也就意味着我们需要定义两个数组,其中一个用来安置地雷(这里的感叹号表示地雷),玩家在游戏过程中不可见的,只有在游戏结束的时候会展示给玩家。另一个则是展示给玩家的棋盘,玩家只能看到数字和’ * ‘,玩家输入的是后者的坐标,判断的是前者的元素。
(4)棋盘(数组)的初始化:在隐藏棋盘中全部初始化为’0‘;在玩家棋盘中全部初始化为’*‘。
2.雷的随机放置:
首先进行两个随机数的生成,随机到的隐藏数组元素会被改为‘!’,如果随机得到已经被定义为雷的元素,则再次生成,直到生成指定数量地雷即可。
注意:在生成随机数的过程中不要把随机数的初始化放在循环里面,否则会运行得很慢。
3.玩家排雷和判断:
玩家输入坐标和隐藏棋盘中的坐标进行对照,如果输入的坐标为雷则游戏结束,向玩家展示隐藏棋盘。如果输入的坐标不是雷,则将玩家棋盘中该坐标中的“*”改为隐藏棋盘中相同坐标周围的雷的数目。如果在游戏中输入一个不是雷的坐标,就记一次数,如果输入相同的坐标则不计数,直到计数为玩家棋盘大小减去雷数量的时候才能获得胜利。
注意:
1.由于定义的数组最好是字符数组,写代码的时候要注意整型数字和字符数字的区别。
2.定义宏来规定棋盘的大小,和雷的数量。
void playerdo(char mine[ROWS][LINES], char show[ROWS][ROWS], int line, int row)
{
int x = 0, y = 0;
int win = 0;
while (ROW*LINE-BOOM>win)
{
int count = 0;
printf("请排除一个没有雷的坐标:");
scanf("%d %d", &x, &y);
if (mine[x][y] != '*')
{
printf("坐标已经被占用,请重新输入\n");
}
else
{
if (show[x][y] == '!')
{
printf("很遗憾,你被炸死了\n");
print2(show, LINES, ROWS);
break;
}
else
{
win++;
for (int i = x - 1;i <= x + 1;i++)
{
for (int j = y - 1;j <= y + 1;j++)
{
if (show[i][j] == '!')
{
count = count + 1;
}
}
}
mine[x][y] = '0' + count;
printf("%d\n", count);
system("cls");
print1(mine, LINES, ROWS);
}
}
if (win ==ROW*LINE- BOOM)
{
printf("恭喜你,排雷成功!\n");
print2(show, LINES, ROWS);
break;
}
}
}
不足:
代码太过于简单导致游戏难度偏大。应当改善的地方有:
(1)第一次输入坐标不可能是雷,也就不能在输入第一个坐标值之后因为运气太差直接输掉游戏
(2)当输入坐标周围的坐标没有雷,也就是该坐标被定义为0时,自动将周围的坐标点亮
(3)再输入一个坐标不是雷的时候,周围坐标也应该被改为周围雷的数量