其实我没怎么玩过这游戏,除了在古早的xp系统上见到过内置的扫雷软件外,稍微玩过几把后就体验到了脑补雷的位置并推断地雷的位置是一件多么烧脑的事情,遂放弃了。其实我更喜欢玩蜘蛛纸牌。好了废话就讲这几句=-=
嗯,首先,我们要知道扫雷游戏是怎么实现的呢?下面来看一张图:
这个是微软出品的扫雷游戏。里面的教程也是很详细,我就不全部放上来了。总而言之就是这些方块背后可能会有地雷。也可能没有地雷,点击方块就可以开辟出一片无雷区域,但是也有可能一下子就踩到地雷。
作为c语言的初学者,自然没有办法模拟出这么优质的画面出来。所以我们可以依据原理依葫芦画瓢。
第一步肯定是先打印棋盘了,这个棋盘肯定不是四四方方的那种。而且一开始肯定不能让玩家知道雷在哪里,不然就没有解密的刺激和烧脑感了,所以我们要把地雷元素和普通方块元素用相同的字符表示。所以第一步我们可以选用一个星号来初始化所有元素。
就像这种
而元素状态和元素实际展现出来的状态也得分别装到两个棋盘当中。于是我们可以创建两个字符数组来存储两个棋盘,一个是给玩家看到的,另一个是展现出是否有地雷状态的棋盘。
这是一个简易版的,9*9的棋盘,而一般扫雷我们会选择以所选元素为中心,以一个九宫格为范围来探测它附近的地雷数量,取四角的点,可以知道上下最大探测单元格均为11个.然后通过尝试摸索可以推出雷的具体位置。这里不再赘述玩法。
于是我们可以写出一个函数来初始化两个字符数组
一个叫show(给玩家看到的) 另一个叫board(电脑看到的)
void initial(char a[11][11], char set)//返回类型为空,可能会报错,这里可以改成int类型,然后return 0;
{
int i = 0;
int j = 0;
for (i = 1; i <= 11; i++)
{
for (j = 0; j <= 11; j++)
{
a[i][j] = set;
}
}
}
char show[11][11];
char board[11][11];
initial(show,'*');
initial(board,'0');
初始化完之后就是打印了,也是写一个打印的函数,为了方便玩家迅速找到指定点的坐标,我们可以尝试把横轴和竖轴上的整数都打印出来
void display(char a[11][11],char set)
{
int i = 0;
int j = 0;
for (i = 0; i <= 9; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= 9; i++)
{
printf("%d ", i);
for (j = 1; j <= 9; j++)
{
printf("%c ", set);
}
printf("\n");
}
}
然后我们开始考虑对board进行埋雷操作,这里需要用到rand函数和srand函数,还有time函数,当然rand函数的范围是0-32767,要用的话肯定要对数据进行一些处理。
首先,使用rand函数和srand函数要包含一个头文件
#include <stdlib.h>
其次,使用time函数也得包含一个头文件
#include <time.h>
然后在前面的位置写一段代码,这里解释起来有点复杂
srand((unsigned int)time(NULL));
接下来就可以使用rand函数了,要生成a-b范围的随机数,就写
int x = a+rand()%(b-a+1);
坐标随机,肯定要两个数字来表示坐标了,我们就可以写埋雷函数了,这里要注意一个点,ret1和ret2赋值随机数必须在while循环里面进行操作,不然每次生成的坐标都是一样的,程序就会卡在这里,后面的if判定过不了。
void setmine(char a[11][11])
{
int i = 0;
int j = 0;
int ret1 = 0;
int ret2 = 0;
int cnt = 10;
while(cnt>0)
{
ret1 = 1 + rand() % 9;
ret2 = 1 + rand() % 9;
if (a[ret1][ret2] == '0')
{
a[ret1][ret2] = '1';
cnt--;
}
}
printf("\n");
}
接下来就是交给玩家的操作时间了,玩家在输入一个坐标值后就可以看到这个方格的状态,如果是雷,就被炸死了,不是雷,就可以看到附近雷的数目。但不知道具体位置。也要注意坐标非法的情况,就是万一数组越界访问了,可能游戏会出bug,所以还要加上一层限定,让坐标就在那个范围内,否则就回到输入坐标的地方。
void checkmine(char a[11][11],char b[11][11])
{
int i = 0;
int j = 0;
int flag = 1;
int cct = 0;
while (flag == 1)
{
printf("输入坐标>:");
scanf_s("%d %d", &j, &i);
if ((j <= 9 && j >= 1) && (i >= 1 && i <= 9))
{
if (a[i][j] == '0')
{
printf("这里没有雷\n");
displaytwo(a, b, i, j);
}
else
{
printf("你被炸死了\n");
flag = 0;
break;
}
cct++;
if (cct == 71)
{
printf("你赢了,成功扫出所有雷\n");
break;
}
}
else
{
printf("参数非法,请重新输入\n");
}
}
}
int displaytwo(char a[11][11], char b[11][11], int y, int x)
{
int n = 0;
int m = 0;
int count = 0;
for (n = y-1; n <= y+1; n++)
{
for (m = x-1; m <= x+1; m++)
{
if (a[n][m] == '1')
count++;
}
}
b[x][y] = count+'0';
for (n = 0; n <= 9; n++)
{
printf("%d ", n);
}
printf("\n");
for (n = 1; n <= 9; n++)
{
printf("%d ", n);
for (m = 1; m <= 9; m++)
{
printf("%c ", b[n][m]);
}
printf("\n");
}
return 0;
}
以上。就是一个扫雷游戏的简单思路
标签:11,rand,游戏,int,char,简易版,扫雷,坐标,函数 From: https://blog.51cto.com/u_16298511/8321014