1.
先构建一个全由字符‘0‘’组成的9乘9方阵,便于存放地雷,名为"mine";同理,为了直观观察排雷情况,再创建一个全由字符星号组成的9乘9方阵,名为"show"。
2.
在“mine”中随机将10个‘0’变为‘1’,其中‘1’表示地雷,从而打印一张完整雷图。
(红色框内是横竖坐标)
接着输入“mine”中的一个字符所对应的下标,开始逐一排雷,如果该字符不是雷,则记录该字符周围8个格子的雷的总数,将图“show”中的与“mine”中下标对应的‘*’变为周围8个格子雷的总数。
(此处输入(4,5)坐标,显示周围共有1个雷)
3.
接着就可以开始排雷了,多组输入,最多可以输入71次,输入71次后没踩到雷游戏胜利。
(为了快速通关,我设置了71个雷,即只要输入10次,毕竟输入71次真的太费时间了😭)
4.
雷阵的具体布置:由于要设置9*9的雷阵,在寻找坐标字符的周围雷数时,在边缘的坐标字符不能检查8个周围格子情况,如图所示:
(蓝色格子包围的格子周围不足8个字符,只有5个,无法正常查询周围雷总数)
所以,为了避免这种边缘字符无法正常检查周围雷数的情况,就要初始化一个11乘11的字符全为‘0’的“mine”雷图,再在(i,j)[2<=i<=10,2<=j<=10]中选10个位置布置雷,最边缘字符全初始为零,这样边缘字符就可以正常查周围雷数了,如图:
最后.
“talk is cheap,show me the code ”前面是思路陈述,下面就展示代码:
//游戏规则:在9*9的方形格子中布置10个雷,排除其他非雷格子后扫雷成功。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void chushihua(char board[11][11], char set);
void printboard(char board[11][11]);
void setmine(char board[11][11]);
void findmine(char mine[11][11],char show[11][11]);
void game()
{
char mine[11][11];
char show[11][11];
chushihua(mine,'0');//初始化mine使其全为‘0’
chushihua(show,'*');//初始化show使其全为‘*’
printboard(show);//打印图show,更好观察排雷情况
setmine(mine);//在图mine中布置地雷
findmine(mine, show);
}
void menu()
{
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.over*****\n");
printf("****************\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();//打印菜单。
printf("请选择:>");//提示输入
scanf_s("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);//do...while函数实现多组输入
}
void chushihua(char board[11][11], char set)
{
int i = 0;
for (i = 0; i < 11; i++)
{
int j = 0;
for (j = 0; j < 11; j++)
{
board[i][j] = set;
}
printf("\n");
}
}
void printboard(char board[11][11])
{
int i = 0;
printf("**********扫雷游戏********\n");
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < 10; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j < 10; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("**********扫雷游戏********\n");
}
void setmine(char board[11][11])
{
int count = 10;
while (count)
{
int x = 0; int y = 0;
x = rand() % 9 + 1;
y = rand() % 9 + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
static int countmine(char mine[11][11], int x, int y)
{
return(mine[x - 1][y - 1] +
mine[x - 1][y] +
mine[x - 1][y + 1] +
mine[x][y - 1] +
mine[x][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] - 8 * '0');
}
void findmine(char mine[11][11], char show[11][11])
{
int count =81;
while (count>10)
{
int x = 0; int y = 0;
printf("请输入:>");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= 10 && y >= 1 && y <= 10)
{
if (mine[x][y] == '1')
{
printf("你被炸死了,游戏失败\n");
break;
}
else
{
int r = countmine(mine, x, y);
show[x][y] = '0' + r;
printboard(show);
count--;
}
}
else
printf("输入有误,重新输入:>\n");
}
if (count == 10)
{
printf("游戏胜利\n");
}
}
最后,看完了希望大家能点个赞😊