首先我们要知道基础的扫雷是什么样的。
这就是网上的一种扫雷,那我们改如何制作呢,接下来就由C剑客带你入手。
首先无论是什么游戏都有自己的菜单吧,那么我们就要先创建一个游戏的菜单,这里呢可以根据个人喜好设置,为了简单方便,我是这样设置的,大家可以参考一下。
*
我的方法呢是用的do while循环来进行这个游戏菜单,并且为游戏菜单专门自定义了一个函数。
接下来就是我们要去想这个游戏改怎么设定了。
扫雷要有一个棋盘,那么基础版的棋盘就是9*9的大小,然后就会设置10个雷在这里面,然后玩家就可以通过点击每个位置来排雷,如果不是雷就不会被炸死,并且会显示周围的八个位置中雷的数量,如果点到雷了就会被炸死。基于这样的原理先给大家看一下网页版的扫雷。
这就是没点到雷的时候
数字表示以他为中心的八个位置有几个雷。
当踩到雷就会结束。
现在我们大致梳理好了流程那我们我们首先就要创建一个9*9的棋盘,那么如果创建呢?这边呢我是通过二维数组来存储9个元素来设置的。上图:
这里我们是采用对文件的形式来写的代码,然后呢我们初始化了一个棋盘是9*9的。假设我们要排查雷这个雷是在顶端就是在这里,我们先用网易版扫雷给大家看一下。
假设我们点了我所指的位置那么我们是不是就访问了以他为中心的八个位置,但是我们要知道我们只有9*9的大小,当我们想访问上面的位置的时候,数组是不是越界了,那么我们该如何应对呢?这里的解决方法当然是扩大数组的存储空间呀,就相当于给上面加了一排。。那当我们点了最右边最左边最下边呢?是不是都要加一排那么,我们就要初始化11*11的棋盘,但是我们只给别人看9*9的棋盘。那么我们就要把board数组的范围变大,括号里面改为ROWS和COLS。
那么我们怎么设置雷和不是雷呢,我们就可以规定1是雷而0不是雷,那么我们首先就要把棋盘给初始化为全部都是0,但是有一个问题就是,如果我们点了一个地方那么这个地方就会统计周围雷的个数,那么这个信息就会覆盖全面布置雷的和不是雷的信息,那我们应该怎么办?这里我用的办法可能不是最好的,但是我还是给大家推荐一下哈哈哈哈,就是我们可以设置两个数组来储存这两个信息,第一个数组Mine就是存储雷和不是雷的信息,第二个数组Show就是展示周围雷个数的信息,并且我们在排除雷的信息的时候可以把这个信息储存到Show中这样就可以为后期排雷做参考,而且Show数组中我们可以把里面的元素初始为*来保持神秘感。这样就可以解决这个问题了。
这里我们可以知道,Show中的元素是字符,那么我们Mine的元素也必须是字符,这样才可以把Mine的数据好进行存储,那么雷就是字符1,不是雷就是字符0,这里给大家看一下我的初始化:
然后我们要将雷,不是雷和字符*存储到对应的数组中进行初始化。这里大家可以看一下我这里的代码图。
这里我是运用了函数的调用进行了初始化的,不用自定义函数来初始化也可以。只是个人觉得这样写的方便好看。那么我们初始化好棋盘就肯定先要打印出棋盘来看看是怎么样的,那么我们是打印
9*9的棋盘但是我们的棋盘实际又11*11所以我设置了不同的变量。
我在头文件中就包含了这个变量,接下来我们就进行书写打印棋盘的代码啦,这里给大家再次看一下的书写的代码。
生成的话就是如上面的图片这样子滴。我们不难发现,如果我们要找一个坐标的话我们只能一个一个去数,这样非常的不方便所以我们这里可以给他们弄上一个行列。
代码是这样滴我给大家看一下我的。
这样就会有这个行列号,那么我给大家分析一下这个行和列。
首先我们会先打列,那么我们就要在这个棋盘打印之前就把这个列号打印出来。肯定是从1-9打印的,那么上图看效果。
然后就是这样的,现在我们来打印行,因为我们知道进行每一行的代码的时候我们都是i = 0开始的然后j从1-9循环完之后i再加上1,那么我们就可以知道我们在进入j的那个循环之前把i的数值打印出来不就可以了嘛,那我们直接开始操作.
但是通过打印我们看到好像*被刚刚打印出来的行号给挤出了一列,那么这个的话我们可以让列号的1之前多打印一个0是不是就可以把行号挤的那一列给加回来。
那么我们的这个就是非常可观的了。现在我们的下一步就是设置雷,并且把雷的信息储存才Mine的数组当中。
首先我们先设置雷,那么我们应该要随机生成10个雷,并且要将这个雷放入这个Mine的数组中来储存。
这一步是我们设置雷,因为雷的个数是10个我们就让count等于10,每生成一个雷就减一,这样就可以使用while的循环让(count)来做循环的条件。因为雷的生成是随机的,那么我们就要用到rand,我们还需要使用时间戳来真正的用到随机,不然这只是一个伪随机,因为这个rand的随机里面有一个种子作为基准值来作为计算生成随机数,我们可以根据时间戳来改变种子就可以使每次随机的值都是不一样的。
这里就要用到C语言中的一个函数srand来设置rand里面的种子,srand函数的参数seed是随机的那么rand的种子就是随机的,想让rand是产生随机数,那么seed也要是随机数才可以随机,那么这两个随机就会矛盾。
这个时候程序员就会用时间来作为种子,因为时间是无时无刻在变化的,然后time函数,他的原型是time_t time (time_t* timer);time函数会返回当前的日历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
time的指针如果非NULL那么他的这个差值会返回他所指的内存当中去,如果是NULL那么他就直接将这个差值来当作返回值。time函数返回的这个差值叫时间戳。time函数使用时要包含他的头文件time.h,这里调用的rand和srand函数要调用stdlib.h的头文件.
这样雷就设置好了,我们也可以打印出来看一下
这里面就有10个1说明我们的10个雷设置成功啦,继续加油啊兄弟们。
这里的最后一部就是排查雷了,那我们要知道我们要排查雷的首先是我们能查询这个坐标,其次再知道这个坐标的周围有几个雷。
现在先给大家看的写完的代码然后我在做讲解。
首先呢我们查询一个坐标肯定是要进行输入的,那我们输入了坐标那肯定必须在1-9的范围对吧,不可能是-1或者1000,这都是不合理的所以我们需要用if语句来进行选择。
然后我们如果输入的坐标是雷我们就会被炸死,并且退出循环,如果没有被雷炸死我们就是要把这个坐标周围的雷的个数算出来。这个计算公式是这个图
当我们计算出来之后就要把这个数据覆盖在我们的那个坐标上。上图中我们算如return的值是要接受一个整形的,而那8个位置是的类型是字符,当我们字符减去字符0就是整型了。通过这个ret这个整形来接收。
之后我们又要把这个值覆盖在这个刚刚查的坐标上,我们就要将这个数值变成字符类型,我们就可以加上一个字符0让他变成字符的类型,因为我们的数组是字符类型的,所以必须赋值字符这种类型的,然后我们就要将这个棋盘打印出来让我们看,这样才知道我们刚刚那个位置有几个雷。
当我们每次进行一次游戏就win++,当我们成功的进行了9*9-10次之后我们就会成功,因为这个棋盘有9*9那么大,那么我们就要把10个给全部排查出来,当我们全部排查出来的时候就需要9*9-10那么多次,所以当win等于9*9-10的时候就赢了。
这就是我设置的简易版扫雷。现在给大家试玩一下。
很好第一次直接中了我也是有实力的,这里有个地方忘记用换行符号了有点丑,但是无伤大雅。谢谢大家的观看。