C语言 扫雷


前言

本文简单讲点扫雷游戏的代码实现,如果有误请多指正


扫雷

为了代码好管理+干净整洁,咱这里选择用分文件先声明后使用的方法

在这里插入图片描述
咱先再头Mine.h里声明一下咱待会儿要使用的函数

然后在源Mine.c里实现函数

再在test里测试

在这里插入图片描述
在这里插入图片描述

1.打印选择菜单

咱正常玩游戏时候是不是都有这种选择菜单,大概类似的

在这里插入图片描述

所以,咱也要做一个!(冲冲冲

虽然有点简陋,但有比没有强(没有你也玩不了啊
咱就整个简单点的,开始游戏和退出游戏吧

打印函数printf大家应该都会吧
switch选择也会吧(一定记得每条case都加上break!
把他俩结合在一块,就是一个开始菜单咯

在这里插入图片描述

整个自定义函数menu,看着干净点

在这里插入图片描述

do while在这里起到先打印,后选择的效果(先进行后判断
选1开始玩,选0退出游戏


2.初始化棋盘

咱先来看看扫雷长啥样

是不就,一个一个小方块组成一个大方块,然后每个小方块里面放着”惊喜“,点一下某个点,附近没雷就消失,有雷就告诉你,那一块附近一圈有多少颗嘛

在这里插入图片描述

咱可以用数组来创建一个差不多的棋盘(也可以用其他的方法.jpg
二维数组哈,咱这有行和列~

1.创建数组(棋盘

创建二维数组不就是:

int arr[x][y];

咱想要的数组最后应该是长这样

在这里插入图片描述

最左边和上面一条是用来定位的坐标
里面蓝色的9 * 9 区域是雷区

但是,如果咱点了数组边缘(如图下方),他去计算,是不是就数组越界了?他实际大小就红色框那么大

为了解决这个问题,咱在创建数组时候可以多给1行1列,这样虽然浪费了一点点的空间,但是也不用去捣鼓更麻烦的方法了(

在这里插入图片描述

接下来就开始创建数组

为了方便后期修改,创建数组时,咱就可以用预处理指令#define去定义行和列

在这里插入图片描述
由于需要一个数组来存放雷的信息(位置
另一个数组用来展示给玩家
咱就直接创建两个数组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.初始化

咱想要的最初的 mine 数组应该是什么也没有,也就是0
因为没有开始往里面存放雷

在这里插入图片描述
然后 show 数组应该全部看不到,那咱就初始化成 * 吧

在这里插入图片描述

为了美观,咱这里就用函数的方法去初始化了

既然要写一个初始化函数,咱是不是就得在传参时候,把数组,数组的行和列,传过去?而且我们要初始化成两种不同的符号,所以咱可以再写一个参数,用来指定符号

先在头文件里声明一下函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

再在Mine.c下实现

在这里插入图片描述

咱先给数组初始化,把各自的字符存进去

直接用简单的for循环来解决就ok了

在这里插入图片描述

初始化完两个数组分别长这样

mine数组:

在这里插入图片描述

show数组:

在这里插入图片描述


3.显示棋盘(打印

然后咱该怎么去看里面的东西对不对呢?

再整一个打印函数!

这边也用到的for循环,打印的话就用printf
传参的话,咱只需要数组和行列信息,而且我们要让玩家们看到的地方其实就9 * 9的区域,胖所以我们传参时候只需要传 ROW 和 COL 就可以了

在这里插入图片描述

下面是实现,用的也是for(

因为咱用了俩函数,所以结果也是俩

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

咱还需要打印坐标,所以修改一下代码

用第一层循环 i 先打印第一行坐标
再用本身循环自带的 r 先打印列坐标

然后为了好看一丢,给扫雷游戏围起来(

在这里插入图片描述

在这里插入图片描述


4.布置雷

布置雷,只需要再中间9 * 9的空间放,所以只需要传row和col
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里我们直接define 一个雷,后期好修改
然后用while检测雷是否安放完毕
这里rand是获取随机数函数

rand()%9+1

其实就是随机生成
%9=8 0~8的随机值
%9+1=9 0~9的随机值

然后就是判断,这个格子里是否没有雷,没有就放雷,有就找下一个格子
放一个count就减1

在这里插入图片描述
在使用rand函数时,没有设置种子,那么每次都会默认使用1,也就是每次随机出来的值有可能是一样的

srand (unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”(百度搜的


5.排查雷

和上面一样先声明,再使用(就不截图了

在这里插入图片描述

直接看代码:
定义一个xy坐标变量,然后scanf输入

然后咱得判断下这个输入的正不正常,一上来你给我输个(0 0)或者(100 100)不好吧,咱直接上if判断

然后输入正确的话,咱就开始判断,那个位置是不是雷,如果是雷,直接就一个恭喜你,被炸了(X),然后打印一下答案,总不能死不瞑目吧(

如果不是雷,真可惜,猜对了,咱就显示附近雷数,这个该怎么弄呢?

请看代码:

在这里插入图片描述

这个应该咱自己能捣鼓出来吧(思索

在这里插入图片描述

咱这对着代码看一下子
其实就是把附近黄色的一圈全部加起来然后减去了一个8*‘0’

这里讲个小芝士:
字符‘0’减去字符‘0’ 得到的是数字0,以此类推
‘0’-‘0’=0
‘1’-‘0’=1
‘2’-‘0’=2
‘3’-‘0’=3
因为数字0到9的ASCII码值为48到57
字符’0’的ASCII码值为48
所以我们进行减法运算时候,其实算的是
48-48=0
49-48=1
50-48=2
51-48=3

由于我们这里一圈有八个元素,每个元素都是不是1就是0,全加在一起,然后减去8个字符‘0’的值,就能算出来附近的元素个数,并且用数字显示


6.结束游戏!

由于我们一开始写的while(1)

在这里插入图片描述

就算是你给雷全找出来了,也别想赢(
所以咱得设置一个胜利条件,也就是排查出所有雷

在这里插入图片描述
在这里插入图片描述

先定义一个胜利变量,这边就用win了

获胜条件就是,你把所有雷区都排出来了(没有雷的地方
咱这里不就是9 * 9的棋盘,里面有我们指定的雷吗,所以我们就直接一个
ROW * COL - MINE (9 * 9 - 10) = 安全的区域

每次排雷成功win++,最后如果排出来的地方等于我们设定的安全区域,那就游戏胜利!


后面也可以自己拓展一下功能,比如指定行列,指定雷数,游戏结束后再来一局之类的(


总结

简单讲点扫雷,这部分学的不是太好,请多指正。
如果有帮助,再好不过了(
整体来讲其实不是很难,就是有点废脑,你得想到某个功能该怎么实现
多做点题应该就可以了(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值