1.1扫雷文件的创建
大家好,我是晓星航,今天为大家带来的知识是扫雷的创建以及运行过程。
1.1.1游戏文件创建逻辑:
1.1.2扫雷菜单的创建:
创建好后我们在主函数的test();中将其打印出来:
打印效果:
1.1.3游戏逻辑的建立:
这时我们在写游戏的基本外部运行逻辑同时也可以加入我们扫雷的游戏函数game(); ,随后我们游戏内部逻辑便在game();函数中编写。
1.1.4头文件的引用
我们可将所有要用的头文件都写在我们自己创建的game.h头文件中,然后再其他源文件中引用它。引用的方法很简单,只需要再源文件上面写入#include "game.h"之后,我们所有的源文件便不需要再引用其他的头文件了!
小结:先创建文件,然后写出菜单menu();在主函数的test();中打印出来,之后我们游戏的选择逻辑在test();中写出,并进行测试(一定要写一点测一点,不然代码写多了再测试可能会导致后面代码写多了找不到哪里有bug)!😀
2.1扫雷棋盘的初始化
2.1.1创建两个二维数组并将它们初始化
在扫雷中我们设计两个二位数组接受,设计思路如下:mine数组为原数组接受我们雷和安全区域的信息(这个数组是给设计者使用的)0为安全1为雷,show数组为排查数组,show中先全用*代替,然后再排雷的过程中再将 *变为数字1-9(数字表示在以点开的这个位置为中心的九方格中雷的个数)。
这里我们的思路是创建两个二维数组,先初始化他们元素都为0。
然后我们创建初始化函数
并将其再game.h中声明
最后在game.c中实现其逻辑。在这里我们使用了循环嵌套把两个二维数组中的每一个元素都用set来接受并定义。
最后将其在test.c中运行实现。(这里的’0’和’*'就是我们set接受的字符,即用0定义mine数组,用 *定义我们的show数组)
2.1.2防止越界的操作
我们在定义字符常量时特地的定义了两种,一种是我们所需的大小,一种是我们所需大小加2。这里的加2就是为了防止我们之后的排查越界的。----之后会讲解为什么要加2而不是直接接受一样的尺寸。
3.1打印棋盘
3.1.1打印棋盘函数的实现
我们先将打印棋盘函数DisplayBoard函数在game.h中声明一下
然后将其实现原理写入game.c中,这里我们直接循环嵌套然后用printf函数打印即可。注:为了读者看的更方便我们在第一行和第一列旁边都打印出一行和一列的数字可以方便读者阅读和使用。
这是我们加入坐标前
这是我们加入坐标后,是不是更方便了呢?!
4.1布置地雷
4.1.1布置地雷函数的声明:
将SetMine函数在game.c中进行逻辑实现:
这里我们可以看到在布置地雷的过程中,我们用到了随机数函数。
他的使用我们直接在test.c中写入srand((unsigned int)time(NULL));并在game.h中加入两个头文件#include #include 即可直接使用。
这里我们用随机数模10产生了0-9的随机数,正好对应我们数组的元素坐标,然后我们定义EASY_COUNT为几,雷1的便有几个。
至此我们布置雷的代码便完成了!
5.1排查雷的个数和胜利条件
5.1.1排查雷数
在game.h中声明排查雷的函数FindMine
在game.c中实现我们的逻辑:
我们先是判断了输入坐标的合法性,看它有没有超过我们的元素下标,若超过了便返回循环重新输入。
在输入对的坐标后我们便调用mine函数看这个坐标是不是1(雷),如果是1便打印很遗憾你被炸死了。
如果不是1(雷)而是0(安全),我们便用get_mine_count函数来统计这个位置周围的九方格中1的个数。
get_mine_count函数的实现逻辑如下:
y-1 y y+1
x-1 □ □ □
x □ □ □
x+1 □ □ □
就好比上面这九个位置,我们输入中间的坐标x y然后我们要对它旁边的八个位置一 一排查,雷为1,非雷为0,最后雷的数直接将他们所有为1的值加起来即可。但这里用的是字符所以我们要和ASCII码值一样对应,我们将其转化为整形则将他们所有加起来的ASCII减去8个ASCII表的0,得到的结果就是旁边雷的个数!
至此我们的扫雷代码就编写完成了!!!
我们可以上手玩一玩试试了。
感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘