简单分析如何实现扫雷游戏
在我们写代码之前,应该首先要明白实现这个项目我们应该分析怎样去做,比如今天我们要说的扫雷游戏,首先我们肯定要先完成游戏的菜单界面。让用户选择是否开始游戏,然后就是要创建扫雷游戏的游戏界面和生成随机的雷,最后就是让用户输入坐标,并判断是否踩到雷。
一 、创建游戏菜单
现在,在写菜单之前还是老样子,分析一下,首先这个菜单是供用户选择的,如果用户想玩玩一把后再玩一把,则就需要用循环来创建,,如今我们学过的循环有很多,如while循环,for循环,do while循环。这三个循环中只有do while循环符合,因为从需求中我们不难看出,需要先让用户选择之后再循环,当然用while循环也行。接下来就让我们先在tes.c文件中先来完成游戏的菜单。
test.c
#include<stdio.h>
void menu()
{
printf("********************\n");
printf("********************\n");
printf("******* 1. play*****\n");
printf("******* 0. exit*****\n");
printf("********************\n");
printf("********************\n");
}
int main()
{
do
{
menu();
printf("请选择是否开始游戏-> ");
int a = 0;
scanf("%d",&a);
switch(a)
{
case 1:
game();
case 0:
printf("成功退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
}
}while(a);
二、创建扫雷游戏的界面和生成随机雷
在上面的代码里我们在Switch语句的1选项那里写了一个game()函数,这个game()函数就是我们用来存放我们扫雷游戏的内容的我们接下来要创建俩个字符型数组一个是用来展示给用户看的,我们用号来代替,另一个数组用来存放我们的扫雷游戏的结果
我们用字符’0’表示没有雷,用字符’1’表示雷,我们就以99的简单模式举例子,扫类游戏我们都知道规则吧,点一下如果不是雷,就会显示它旁边有多少个雷,如果是雷则游戏结束。接下来我们继续接着上面的代码开始写。
#include<stdio.h>
void game()
{
char mine[11][11] = {0};//存放扫雷结果的数组
char show[11][11] = {0};//展示给用户的数组
int cont = 10;
//初始化数组
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
mine[i][j] = '0';
}
}
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
show[i][j] = '*';
}
}
//布置随机雷
while(cont)
{
x = rand()%10;
y = rand()%10;
mine[x][y] = '1';
if(mine[x][y] != '1')
cont--;
}
}
void menu()
{
printf("********************\n");
printf("********************\n");
printf("******* 1. play*****\n");
printf("******* 0. exit*****\n");
printf("********************\n");
printf("********************\n");
}
int main()
{
do
{
menu();
printf("请选择是否开始游戏-> ");
int a = 0;
scanf("%d",&a);
switch(a)
{
case 1:
game();
case 0:
printf("成功退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
}
}while(a);
三、输入坐标和判断部分
由于我们暂时学的知识点有限,所以只能是由输入坐标来实现排雷的过程。最后代码如下:
#include<stdio.h>
void game()
{
char mine[11][11] = {0};//存放扫雷结果的数组
char show[11][11] = {0};//展示给用户的数组
int cont = 10;
//初始化数组
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
mine[i][j] = '0';
}
}
for(int i = 0; i < 11; i++)
{
for(int j = 0; j < 11; j++)
{
show[i][j] = '*';
}
}
//布置随机雷
while(cont)
{
x = rand()%9+1;
y = rand()%9+1;
mine[x][y] = '1';
if(mine[x][y] != '1')
cont--;
}
//打印游戏界面
printf("------- 扫雷 -------\n");
int a = 0;
for (a = 1; a <= 9; a++)
{
printf("%d ", a);
}
printf("\n");
for (int i = 1; i <= 9;i++)
{
printf("%d ", i);
for (int j = 1; j <= 9; j++)
{
printf("%c ", show[i][j]);
}
printf("\n");
}
//排查雷
int add(char mine[11][11], int a, int b)
{
return mine[a - 1][b] + mine[a - 1][b - 1] + mine[a][b - 1] + mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] + mine[a][b + 1] + mine[a - 1][b + 1] - 8 * '0';
}
int a = 0;
int b = 0;
int cont = 0;
int win = 0;
while (win < 9*9 - 10)
{
printf("请输入你要排查的坐标-> ");
scanf("%d%d", &a, &b);
if (a > 0 && a <= 9 && b > 0 && b <= 9)
{
if (mine[a][b] == '1')
{
printf("很遗憾,你被炸死了\n");
for(int i = 1; i <= 9; i++)
{
for(int j = 1; j <= 9; j++)
{
printf("%c ",mine);
}
printf("\n");
}
}
else
{
cont = add(mine,a, b);//用来计算旁边有多少雷
show[a][b] = cont + '0';//比如说3+'0' == '3'
printf("------- 扫雷 -------\n");
int a = 0;
for (a = 1; a <= 9; a++)
{
printf("%d ", a);
}
printf("\n");
for (int i = 1; i <= 9;i++)
{
printf("%d ", i);
for (int j = 1; j <= 9; j++)
{
printf("%c ", show[i][j]);
}
printf("\n");
}
win++;
}
}
else
{
printf("非法输入,请重新输入.\n");
}
}
if (win == 9 * 9 - 10)
printf("恭喜你,排雷成功!\n");
}
void menu()
{
printf("********************\n");
printf("********************\n");
printf("******* 1. play*****\n");
printf("******* 0. exit*****\n");
printf("********************\n");
printf("********************\n");
}
int main()
{
Srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择是否开始游戏-> ");
int a = 0;
scanf("%d",&a);
switch(a)
{
case 1:
game();
case 0:
printf("成功退出游戏\n");
break;
default:
printf("输入错误,请重新输入!\n");
}
}while(a);