扫雷游戏
扫雷游戏是什么大家玩过的应该都知道吧
假如你真的不知道请看视频
扫雷游戏
大概原理就是一个9X9的棋盘里面随机生成几个雷
找到全部的雷你就通关了
那我该怎么做用c语言做出来呢
首先我应该有个菜单
对的菜单,那我们试着打一个…
先在 main 函数设定一下先菜单我们叫它 menu 吧
我们要怎么打印出菜单呢
对了用 printf 打印一下不就好了
使用 printf 函数记得包含一下头文件 #include<stdio.h>
那该怎么打呢
简单的搞一搞做出俩个选项
1.开始
0.退出
大概和上面差不多吧,hvh ~ _ ~
至少是打出来了
菜单就做好了
进入游戏
菜单是有了但是我们要进入游戏啊
怎么进入
void choose()//选择
{
printf("选择1开始游戏\n选择0退出游戏\n");
printf("<<_请选择_>>\n");
}
选项也有了嗯····
要把你选择的输入进去啊
那就用 scanf
void choose()//选择
{
int x = 0;
printf("选择1开始游戏\n选择0退出游戏\n");
printf("<<_请选择_>>\n");
scanf("%d", &x);
}
ok啊把输入的数存到 x 上了
那我该怎么判断用我输入的是什么数呢
分支语句中有 if 有switch
是不是用switch更好判断呢
这里推一下我的另一篇文章 分支语句 那里大概讲了 if 和 switch 的用法c语言分支语句 if,switch是什么东西,我该怎么用?
void choose()//选择
{
do
{
int x = 0;
printf("选择1开始游戏\n选择0退出游戏\n");
printf("<<_请选择_>>\n");
scanf("%d", &x);
switch (x)
{
case 0:printf("已退出游戏\n"); break;
case 1:game(); break;
default:printf("请重新选择\n");
}
}
while(x)
}
因为这里只需要判断 是 1 或 0 还是0 和1 以外的数
所以我们只需要判断三个条件
case 1 我们要开始游戏
case 0 退出游戏
default 都不是的话重新输入
要是我们玩了一边还想玩或者输入错了的话要再输入一次的话我们就要用到循环语句
这里我们选择用 do while 语句
do while 是先执行后判断
while判断 x 为0 的话就退出循环
可能有些哥们会问,怎么判断为0呢
你一开始在输入 0 的时候 他先回进入switch语句判断
执行case 0 后出来再判断 while(x),x=0 退出循环
游戏主体
到这里基本的框架我们都有了到了游戏主要内容
如果看一开始我玩的那一分钟小游戏的视频大概知道应该做什么了
到构建棋盘和游戏内容
构建棋盘
细心的朋友可能看到了,上面case 1 后面跟了一个 game();
我们来写函数 game 的内容
#define Longs 9
#define Wides 9
#define Longss Longs+2
#define Widess Wides+2
void game()
{
char mine[Longss][Widess]={0};
char show[Longss][Widess]={0};
}
我们需要俩个棋盘
一个是隐藏起来就我们自己看的 mine 数组
一个是放出去给别人看的 show 数组
mine 是我们用来存放雷的地方所以就是隐藏的
我们设定4个常量 分别是长 Longs 为数值9, 宽 wides数值为9
Longss 数值为Longs+2 ,Widess 数值为Wides+2
我们先用数值为 11 的俩个常量 Longss和Widess来创建俩个二维数组
这里可以会有小伙伴有疑惑不是只需要9x9大小的棋盘就行了吗为什么
要创建一个11x11大小的棋盘别急一步一步慢慢来后面会慢慢解释
不太清楚数组的小伙伴可以稍微看看这个是本人对数组的简单了解 ^ _ ^
|
数组的概念,什么是数组?一维数组和二维数组有什么区别?
|
ok ok接下里我们先初始化棋盘
我们把 mine全部放 ‘0’ 进去 show数组放 ‘*’ 进去
怎么放进去直接呢
创建一个初始化棋盘的函数
void game()
{
char mine[Longss][Widess] = { 0 };
char show[Longss][Widess] = { 0 };
InitBorad(mine, Longss, Widess,'0');//棋盘初始化
InitBorad(show, Longss, Widess,'*');
}
函数 InitBoradfe 需要4个数值分别需要 传一个二维数组mine或show 俩个常量为11的数Longss和Widess,和一个赋值给棋盘的字符 ‘0’ 或 ‘*’,因为我们需要把棋盘全部初始化。
然后这里用了 for 的嵌套循环来把 sign 的值给二维数组的每个数组进行了赋值
void InitBorad(char arr[Longss][Widess], int longss, int widess,int sign)
{
for (int i = 0; i <longss; i++)
{
for (int j = 0; j < widess; j++)
{
arr[i][j] = sign;
}
}
}
初始化完了我们是不是得打印出来看看效果
创建一个打印棋盘函数
void game()
{
char mine[Longss][Widess] = { 0 };
char show[Longss][Widess] = { 0 };
InitBorad(mine, Longss, Widess,'0');//棋盘初始化
InitBorad(show, Longss, Widess,'*');
PrintBorad(show, Longs, Wides);//打印棋盘
}
我们创建了函数 PrintBorad(show, Longs, Wides)
因为我们打印不需要打印雷盘,所以只需要 show 数组
再加上我们只需要显示9x9大小即可所以传 Longs 和 Wides 的值就行
void PrintBorad(char arr[Longss][Widess], int longs, int wides)
{
printf("~~~~~扫雷~游戏~~~~~\n~~~~~~~~~~~~~~~~~~~\n");
for (int i = 0; i <= longs; i++)//这个for循环打印的是棋盘横向坐标
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= longs; i++)
{
printf("%d ", i);//打印的是纵向坐标
for (int j = 1; j <= wides; j++)
{
printf("%c ", arr[i][j]);//打印9x9的棋盘
}
printf("\n");
}
}
效果如下
这里为什么需要打印出坐标因为
我做不到直接能鼠标点击屏幕那样 +——+
只能通过输入坐标来选择位置
创立一个布置雷的函数
接下来到布置雷了
void game()
{
char mine[Longss][Widess] = { 0 };
char show[Longss][Widess] = { 0 };
InitBorad(mine, Longss, Widess,'0');//棋盘初始化
InitBorad(show, Longss, Widess,'*');
PrintBorad(show, Longs, Wides);//打印棋盘
SetMineBorad( mine,Longs,Wides);//布置雷
}
我们创建了函数 SetMineBorad( mine,Longs,Wides)
同样的我们要把需要布置雷的棋盘 mine 和布置范围9x9的数值传送过去
#include<stdlib.h>
#include<time.h>
#define SetMine 10 //布置雷的个数
void SetMineBorad(char arr[Longss][Widess], int longs, int wides)
{
srand((unsigned int)time(NULL));//让rand 随机一个数
int mine = SetMine;//雷的个数
while (mine != 0)//判断还雷打印完没
{
int x = rand() % longs + 1;//随机数组对应的行
int y = rand() % wides + 1;//随机数组对应的列
if (arr[x][y] == '0')//判断有没有布置雷
{
mine--;//每打印一个雷减一
arr[x][y] = '1';//打印雷
}
}
}
#include<stdlib.h>
#include<time.h>
是 srand((unsigned int)time(NULL)); 和 rand();需要的头文件
创立一个排雷函数
接下来到最后一步了如何排查出雷了
void game()
{
char mine[Longss][Widess] = { 0 };
char show[Longss][Widess] = { 0 };
InitBorad(mine, Longss, Widess,'0');//棋盘初始化
InitBorad(show, Longss, Widess,'*');
PrintBorad(show, Longs, Wides);//打印棋盘
SetMineBorad( mine,Longs,Wides);//布置雷
SearchSet(mine, show, Longs, Wides);//排雷
}
SearchSet(mine, show, Longs, Wides);
这个函数的大概思路就是我们需要再 show棋盘那里选择你想要排查不是雷的坐标
然后会把 show棋盘选择的坐标传到 mine棋盘
如果这个坐标是雷你就给炸死了,游戏结束
如果这个坐标不是雷,判断附近有多少个雷,然后把判断出附近雷的个数传回show棋盘的坐标
直接把不是雷的位置全部找出来游戏就胜利了
int ShowMine(char arr1[Longss][Widess], int x, int y)//判断坐标周围的坐标是不是存在雷
{
int count = 0;
for (int i = x - 1; i <= x + 1; i++)//行坐标
{
for (int j = y - 1; j <= y + 1; j++)//列坐标
{
count += arr1[i][j];//每次和前面的数相加
count =count- '0';//判断出雷的个数
}
}
return count;
}
上面我们只需要判断坐标3x3的范围
void SearchSet(char arr1[Longss][Widess], char arr2[Longss][Widess]
, int longs, int wides)//排雷函数
{
int x = 0;//行
int y = 0;//列
int countset = longs * wides - SetMine;//不是雷的位置的个数
int count = 0;//
int secound = 0;
while (countset)//为0结束循环
{
printf("请输入位置:\n");
scanf("%d%d", &x, &y);//输入坐标
if (x > 0 && x <= longs && y > 0 && y <= wides)//判断坐标在不在范围
{
if (arr1[x][y] == '1')//判断坐标是雷的情况
{
PrintBorad(arr1, longs, wides);//打印雷盘
printf("你被炸死了\n游戏结束OvO\n");
printf("-----------\n");
break;
}
else if(arr2[x][y]>'*')//判断有没有重复输入
{
printf("已输入,请重新输入\n");
}
else if (arr1[x][y] == '0')//判断坐标不是雷的情况
{
ShowMine(arr1, x, y);//进入判断坐标附近雷的个数的函数
int count = ShowMine(arr1, x, y);//返回雷的个数的值
count = count + '0';
arr2[x][y] = count;//把附近雷的个数传回显示的棋盘
PrintBorad(arr2, longs, wides);//打印棋盘
countset--;//不是雷的位置个数减一
}
}
else
{
printf("超出范围,请重新输入\n");
}
}
if(countset==0)
printf("恭喜你游戏胜利\n");
}