前言
本文简单讲点扫雷游戏的代码实现,如果有误请多指正
扫雷
为了代码好管理+干净整洁,咱这里选择用分文件先声明后使用的方法
咱先再头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++,最后如果排出来的地方等于我们设定的安全区域,那就游戏胜利!
后面也可以自己拓展一下功能,比如指定行列,指定雷数,游戏结束后再来一局之类的(
总结
简单讲点扫雷,这部分学的不是太好,请多指正。
如果有帮助,再好不过了(
整体来讲其实不是很难,就是有点废脑,你得想到某个功能该怎么实现
多做点题应该就可以了(