扫雷游戏相信大家都玩过把,那么怎样用C语言实现呢?
我们想要用代码来实现一定要先理清思路。
第一步,提出问题,扫雷游戏整个流程是怎么完成的?
1.生成棋盘,在里面随机布置10个雷(9 X 9的棋盘),棋盘上每个位置都是覆盖的,都是看不见里面是什么的。
2.我们要开始游戏了,随机点开了一个不是雷的格子,格子会统计以它为中心的九宫格内有多少雷,并显示在我们点开的各种上。
3.如果点到雷,游戏结束。如果我们成功点到最后剩下10格子,那么这十个格子必定是雷,游戏结束,排雷成功。
以上就是对扫雷游戏过程的简单描述。
第二步,分析问题,对上述过程分析,找出解决办法
1.生成棋盘,棋盘是9X9的,我们可以用数组来储存我们需要的数据。棋盘上要储存的数据有:该点是不是雷,该点周围的雷有多少。方法:随机在棋盘上放入10个1,其他位置是0,方便统计雷的个数。
2.棋盘格子在未点开时是覆盖住的。因此,我们可以使用另一个数组,给数组全部填上(*),表示该点是被覆盖的状态。当我们点开其中一个不是雷的格子时,自动定位到存储数据数组的同一位置,遍历该位置周围的数据,统计雷的个数,随后将统计的个数赋给覆盖数组的同一位置,将原来的*替换掉。
3.在实际操作后发现在统计个数时有一种特殊情况,在统计棋盘边边上的位置时发现九宫格有些位置无法遍历。方法:多开一些数组,在原有的基础上在开:“一圈”,让这一圈的值全部是0就可。
第三步,代码的实现
以下展示的代码是游戏的核心部分,一些简单内容自行发挥。
#define Rs 11
#define Ls 11
1.初始化数组的函数
void intboard(char arr[Rs][Ls], int rs, int ls,char t)
{
for(int i=0;i
2.放置雷
void setmine(char arr[Rs][Ls], int rs, int ls)
{
int cout = 10; //雷的个数
while (cout) //0不是雷,1是雷
{
int x = rand() % (rs - 2) + 1;
int y = rand() % (ls - 2) + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
cout--;
}
}
}
3.排查雷(核心部分),不难理解
void findmine(char mine[Rs][Ls], char show[Rs][Ls], int rs, int ls)
{
int x, y;
int win = 0;
while (win< (rs - 2) * (ls - 2) - num)
{
printf("请输入要排查的坐标->");
scanf("%d%d", &x, &y);
if (x >= 1 && x < (rs - 1) && y >= 1 && y < (ls - 1))
{
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("你排到雷啦,游戏结束\n");
print(mine, Rs, Ls);
Sleep(1900);
break;
}
else
{
system("cls");
int count = minenum(mine, x, y);
show[x][y] = count + '0';
print(show, Rs, Ls);
win++;
}
}
else printf("请勿重复输入坐标\n");
}
else
{
printf("坐标输入错误!请重新输入\n");
}
}
if (win == (rs - 2) * (ls - 2) - num)
{
system("cls");
print(show, Rs, Ls);
printf("恭喜你排雷成功!!!!\n");
Sleep(1500);
}
}
4.统计雷的个数
直接暴力求解,把周围的数组全部遍历一遍
int minenum(char mine[Rs][Ls], int x, int y)
{
return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x+1][y]+
mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
以上函数就是扫雷游戏实现的关键,剩下的就是把这些函数拼装在一起组成程序。
源码:
链接:https://pan.baidu.com/s/1hp4mGK9E4ak09iunsuCREQ?pwd=8ws1
提取码:8ws1
如果觉得不错的话支持一下,谢谢大家^-^