页面设计
大家好,今天我们为验证数组和函数的基本掌握度,用实现一个扫雷游戏来验证。下面我将讲解扫雷游戏的详细思路。如有不足希望各位大佬谅解。
1.首先大家应该都玩过扫雷吧,一个游戏应该有一个基本的菜单,那么我们可以直接使用库函数printf来实现一个简单的菜单。
这里直接打印出来就可以了,我们可以看一下代码的实现。
void menu()
{
printf("******************************\n");
printf("*******1.开始游戏*************\n");
printf("*******0.退出游戏*************\n");
printf("******************************\n");
}
页面选择进入或退出
如上所说,有了页面我们是不是应该选择进入或者退出呢,问题来了应该怎么选择呢,在这里我们可以选择switch语句选择1就进入,选择0就退出。如果选择其他就提示选择错误。下面我们看看代码具体的实现,
int main()
{
int select = 0;
do
{
menu();
scanf("%d", &select);
switch (select)
{
case 1:
printf("扫雷游戏\n");
break;
case 0:
printf("exit\n");
break;
default :
break;
}
} while (select);
这里我们定义一个select变量如果不是0,就进入循环,在循环里在放一个switch语句,来判断选择1还是0,然后我们在case 1里放游戏的具体实现就可以了。
游戏的实现
首先我们定义一个函数名叫game()在此函数里放功能的实现,首先我们得创建一个棋盘下面我们具体分析一下;
这是一个9*9的棋盘,如果要创建出这个棋盘,直接用一个二维数组来创建,相信大家很容易想到。,但是有一个问题我们平时玩扫雷游戏的时候点一个位置,那么这个位置旁边的九个格子都会显示出来,并且会判断旁边8个格子有几个雷,那么我们这个棋盘如果在下面红色圈这个位置那么是不是会造成数组的越界,这样就可能报错了,那么应该怎么解决这个问题呢?
棋盘问题的解决
对于上面的棋盘问题,我们是不是可以将二位数组进行一个扩大让1 2 3的位置都有一个值,这样就不会造成数组的越界了,大家可以看看我的具体实现
我们直接把它扩大成11*11的二维数组(这里我们用1表示有雷,0表示没有),大家看是不是很好的解决了数组越界的问题了。下面看一下具体的代码实现
在game()函数中创建两个二维数组,mine表示布置雷的数组,show表示展示给用户的数组,然后我们是不是应该把这两个数组初始化,将雷的数组初始化为全0,用于展示的数组初始化为全*。下面是代码的具体实现
void initBorad(char mine[ROWS][COLS], int row, int col, char set)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
mine[i][j] = set;
//printf("%c ", mine[i][j]);
}
printf("\n");
}
}
对于这里的set是怎么回事呢,大家可以看看我initborad函数的传参,这里我们是不是就直接可以初始化一个全为*的棋盘,和一个全为0的棋盘了呢。大家可以看看具体的效果。
这里是打印好的棋盘
这里是具体的打印函数。
雷的设置
好了棋盘已经设置好了,那么我们现在是不是应该布置雷了呢。
那么怎么随机布置雷了,这里我们要用到一个函数srand,以及rand来生成随机坐标来布置雷具体的代码如下
用时间作为参数,时间随时变化。
用1表示雷,用0表示没有雷这里我们用count来布置十个雷,每布置一个雷count就减减
这里的x,y是随机的1-9的坐标正好我们布置雷的二维数组只想9*9的坐标内有雷,那么我们看如果这个x,y的坐标是‘0’就让它是一个雷,然后count--,当十个雷布置完了count就为0了直接退出循环,那么我们的雷就布置好了。
下面是具体实现
排雷操作
雷已经布置好了,那么我们怎么排雷呢
这里我们可以想一个让玩家输入一个坐标如果这个坐标等于1就踩中雷了,就提示玩家说被炸死了;以下是具体的代码实现,当时这是一个循环,玩家被炸死之后就直接跳出来。同样的如果玩家输入非法坐标我们是不是应该有一个提示呢,所以这样我也用来一个if语句来提示
接下来如果玩家没有踩中雷,我们是不是应该统计旁边8个格子有几个雷呢,然后我们的雷是通过‘1来存放的’这里给大家说下怎么转换的‘0’-‘0’=0;‘1’-‘0’=1,‘4’-‘0’=4,
到这里大家看看下面这张图
如果我们知道了x和y的位置是不是旁边的位置我们都可以访问到了,知道了这个点我们把它旁边8个格子的值加起来是不是就知道有几个1了啊,所以我们有了下面这串代码
我们统计了旁边8个位置然后减去8*‘0’这样我们就得到了一个整形了,再把值返还回去了可以了
基本的代码就已经写完了,到这时候代码就能跑起来了,让我们看看具体的效果
如果有什么不好的地方希望各位大佬指教!!1