一、理论思路
简单的扫雷,9*9的大小,共10个雷。
首先,扫雷就是如上图一样,那么想要达成这种效果所需的第一步就是在窗口打印出一个这样的雷盘。这个可以用二维数组来实现。
打印完之后第二步就是埋雷。埋雷可以使用<time.h>来生成随机数进行埋雷,保证每一把的雷的位置都不一样。
第三步就是扫雷了,通过玩家输入坐标来判断这个坐标有无地雷从而达成游戏的效果。
二、实践证明
通过上述思路我们就可以开始实践敲代码了。
1、打印菜单
在游戏开始之前,我们需要一个菜单来判断是否开始游戏。这一步直接使用 printf 就可以实现。
void menu() {
printf("************************\n");
printf("*******1.开始游戏*******\n");
printf("*******0.结束游戏*******\n");
printf("************************\n");
printf("请选择:");
}
然后是是否开始游戏的判断,这里我使用 do while 与switch 循环来进行。
void text() {
do {
menu();
scanf("%d", &i);
switch (i) {
case 0:
printf("游戏结束\n");
break;
case 1:
printf("游戏开始\n");
game();
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (i);
}
使用输入的数字 i 来当作判断条件,当输入的数字并非我们想要的数字时就会重新进入循环直到输入的是我们想要的数字。
2、打印雷盘
当我们进入游戏后就要在屏幕上使用二维数组打印雷盘,这里我使用 ' * ' 来充当未知的位置。在打印时,我们也可以顺便将坐标轴打印出来方便游玩。
void board1(char arr1[11][11], int h, int l) {
int i = 0, n = 0;
if (h == 11 || l == 11) {
for (i = 0; i < 11; i++) {
for (n = 0; n < 11; n++) {
arr1[n][i] = '*';
}
}
}
if(h != 11 && l != 11)//计算所输入坐标周围雷的个数
arr1[h][l] = add(arr2, h, l) + '0';
for (n = 0; n <= 9; n++) {
printf("%d ", n);
}
printf("\n");
for (i = 1; i <= 9; i++) {
printf("%d ", i);
for (n = 1; n <= 9; n++) {
printf("%c ", arr1[n][i]);
}
printf("\n");
}
}
在实践的过程中,我们需要不断的调试并且还需要埋雷,因此我们需要再创建一个透明的雷盘用于埋雷和方便我们观察。
//打印透明雷盘
void board2(char arr2[11][11], int h, int l) {
int i = 0, n = 0;
for (i = 0; i < l; i++) {
for (n = 0; n < h; n++) {
arr2[n][i] = '0';
}
}
for (n = 0; n <= 9; n++) {
printf("%d ", n);
}
printf("\n");
setmine(arr2);//埋雷
for (i = 1; i <= 9; i++) {
printf("%d ", i);
for (n = 1; n <= 9; n++) {
printf("%c ", arr2[n][i]);
}
printf("\n");
}
}
3、埋雷
接下来就需要埋雷了,这里使用 time 生成随机数然后判断该位置是否有雷 ,有了就换一个地方埋,没有就埋在这里。这里我是使用‘ 1 ’作为地雷。
//布置雷
void setmine(char arr2[11][11]) {
srand((unsigned int)time(NULL));//生成随机数
int x = 0, y = 0;
for (int i = 1; i < 10; i++) {
do {
x = rand() % 10;
y = rand() % 10;
} while (x == 0 || y == 0);
if (arr2[x][y] != '1') {
arr2[x][y] = '1';
}
else {
i--;
}
}
}
注意:使用 time 应包含头文件
#include<time.h>
4、计算坐标周围雷的个数
当我们输入坐标后,应计算出周围雷的个数并在该坐标显示出来。当输入的坐标为x, y 时他周边的坐标如下。我们就需要计算周边坐标的雷个数。
那么当我们的坐标在边边角角的时候怎么计算呢,这是我们就需要将雷盘扩大一圈(9 * 9 ➡11 *11)但打印的还是9 * 9 的雷盘。这也是我在打印雷盘时所创建的二维数组是11 * 11的原因。
//计算所选坐标周边雷的个数
int add(char arr2[11][11], int x, int y) {
int num = 0;
x = x - 1;
for (int i = 0; i <= 2; i++) {
y = y - 1;
for (int n = 0; n <= 2; n++) {
num = num + arr2[x][y] - '0';
y++;
}
y = y - 2;
x++;
}
return num;
}
5、扫雷
完成上述操作后就可以开始扫雷了,我们需要提示玩家输入坐标,并且需要判断输入的坐标是否是所打印出来的雷盘上的坐标。
//扫雷
void finemine(char arr1[11][11], char arr2[11][11]) {
int x = 0, y = 0;
printf("输入坐标:");
scanf("%d %d", &x, &y);
if (x > 9 || x < 1 || y > 9 || y < 1) {
printf("非图中坐标,请重新输入\n");
finemine(arr1,arr2);
}
if (arr2[x][y] != '1'){
board1(arr1, x, y);
finemine(arr1, arr2);
}
else {
printf("踩雷了,游戏失败\n");
}
}
6、收尾工作
接下来我们只需要将上述写的代码拼接在一起然后将打印透明雷盘中打印的步骤给注释掉就算大功告成了。
void game() {
printf("-------开始扫雷-------\n");
board1(arr1, H, L);
board2(arr2, H, L);
finemine(arr1, arr2);
}
然后再写上我们的main
int main() {
text();
return 0;
}
这样我们的简易版扫雷也算是完成了,当然还有许多需要完善的地方。例如:难度的选择,输入坐标后将周围不是雷的区域显示出来等。这些就需要不断地学习完善了。