还不会用C写扫雷?请看这边

每日一言

因为不可能,所以才值得相信。 --浮士德


以下是我写扫雷的过程

我把代码分成3部分:

  • game.h 放头文件和定义用
  • game.c 放一些实现游戏的函数
  • test.c 游戏具体的实现代码

菜单实现

肯定要使用printf函数,所以在game.h中包含一下,以后自己写的函数都放在这里声明一下,后文不在重复了。
还不会用C写扫雷?请看这边_第1张图片
别忘了在game.c与test.c中包含一下game.h,这样以后的头文件就都放在game.h中就行了
还不会用C写扫雷?请看这边_第2张图片

在test.c中写上main函数,用do-while实现游戏的大致逻辑
还不会用C写扫雷?请看这边_第3张图片

在这其中用menu函数打印游戏菜单
还不会用C写扫雷?请看这边_第4张图片

测试运行
还不会用C写扫雷?请看这边_第5张图片
运行无误,接下来要实现游戏的内容了,在写代码之前要捋一下思路

游戏内容实现

思路
  1. 首先肯定要有棋盘
  2. 肯定要在棋盘上放雷
  3. 让玩家输入,然后判断是否踩雷,如果踩到游戏结束,如果没有则告诉玩家这附近有几颗雷
  4. 不断循环,直到雷全部被找到

写一个game函数来封装内容实现代码吧,game函数放在这

还不会用C写扫雷?请看这边_第6张图片

棋盘实现

首先要确定棋盘的大小,是几乘几的,这两个数肯定会经常用到,那就在game.h中用#define定义一下,方便以后管理。
在这里插入图片描述
雷的个数同上
在这里插入图片描述

棋盘上的每个位置是否是雷肯定要保存下来,又因为棋盘是二维的,很容易想到用二维数组来存放数据。
我在这里默认雷用“1”表示,非雷用“0”表示。
先初始化棋盘,让每个位置都不是雷,方便以后放置雷。
创建棋盘:
在这里插入图片描述
初始化棋盘:还不会用C写扫雷?请看这边_第7张图片

打印一下棋盘看看效果,打印棋盘这个功能会经常用到,就写成printboard函数吧,这个函数的实现我放在game.c中
还不会用C写扫雷?请看这边_第8张图片
运行结果还不会用C写扫雷?请看这边_第9张图片
为了以后游玩方便,我加上了每行,每列的序号
改进后的代码
还不会用C写扫雷?请看这边_第10张图片

效果还不会用C写扫雷?请看这边_第11张图片
看到这里肯定有人要说了,你不是要打印9*9的棋盘吗,这里怎么只打印了7*7的?
嘿嘿,先别急,我在这里先卖个关子。

棋盘放雷

棋盘写好了,接下来就是随机放雷了。
怎么才能随机放呢?我们需要生成两个随机数,来确定一个坐标,在这个坐标上放雷。
注意:1. 这两个随机数不能超过棋盘的大小。2. 生成的坐标不能重复,也就是不能在有雷的位置上放雷。

生成随机数要用srand来设置一个种子,用时间戳来当它的参数吧
还不会用C写扫雷?请看这边_第12张图片
别忘了要包含相应的头文件
还不会用C写扫雷?请看这边_第13张图片
我用sit_Mine函数来封装放雷的代码
还不会用C写扫雷?请看这边_第14张图片
还不会用C写扫雷?请看这边_第15张图片

测试一下还不会用C写扫雷?请看这边_第16张图片
当然了在游戏过程中肯定不能让玩家看见,所以记得别把雷盘打印出来

玩家游玩的时候每个坐标上的数要保持神秘感,所以再创建一个二维数组,这个数组是专门让玩家看见的
在这里插入图片描述

当然要初始化棋盘,你也不想存一堆随机数吧。
我们把棋盘上的每个位置初始化成“ * ”
刚刚写的 Initboard 函数好像不能用,没关系改一下就好了,再传一个符号给函数就OK了
改进后的 Initboard 函数
还不会用C写扫雷?请看这边_第17张图片

还不会用C写扫雷?请看这边_第18张图片

运行一下
还不会用C写扫雷?请看这边_第19张图片
很好!就是我们想要的效果~

下一步就是玩家输入坐标,然后判断是否踩雷

判断输赢,以及数字提示

我把这些放在judge函数中
还不会用C写扫雷?请看这边_第20张图片

判断玩家输的代码很容易写,先写出来,别忘了卡定范围,防止玩家输错,导致越界访问
还不会用C写扫雷?请看这边_第21张图片

测试运行
还不会用C写扫雷?请看这边_第22张图片

接下来就是写玩家没踩雷后的情况了
首先判断该位置附近有几颗雷
然后在棋盘的相应位置打印出来
打印好说,怎么判断呐?

举个栗子,假设是6*6的棋盘
在数组中是这样的
还不会用C写扫雷?请看这边_第23张图片
假设玩家选择了3 3这个位置
我们只需要判断这几个位置
还不会用C写扫雷?请看这边_第24张图片
同样的,假设玩家选择了 x y
我们只需要判断 x-1 x x+1 与 y-1 y y+1 这几个数组成的坐标上共有几颗雷就行了。
有细心的读者肯定会发现万一有玩家选 7 7 , 1 0 等在数组边缘的位置,怎么判断有几颗雷呐?
还不会用C写扫雷?请看这边_第25张图片
其实很简单,那就是只让玩家看见这些坐标就行了
还不会用C写扫雷?请看这边_第26张图片
这就是为什么在上面我写的printboard函数只打印了7*7的棋盘
为了以后改起来更直观一点我把ROW和COL的值改了一下
还不会用C写扫雷?请看这边_第27张图片

用Count函数来数雷
还不会用C写扫雷?请看这边_第28张图片

数雷的原理就是把周围上的数加一遍然后减去7个0的ASCII码值,记得要留一个0。原因就不用我多说了,相信你们想一想都可以理解。

judge 函数
还不会用C写扫雷?请看这边_第29张图片
测试运行一下
还不会用C写扫雷?请看这边_第30张图片
没有问题
接下来写判断玩家胜利条件

还不会用C写扫雷?请看这边_第31张图片

再做一点修饰
让玩家死的瞑目
让玩家赢的明白
还不会用C写扫雷?请看这边_第32张图片
你以为这样就写完了吗?
不~
其实有bug,当玩家不断输入已经输入过的坐标,all也会变成0,进而打印玩家胜利
还不会用C写扫雷?请看这边_第33张图片

再做一下改进
还不会用C写扫雷?请看这边_第34张图片
效果
还不会用C写扫雷?请看这边_第35张图片
到这里简易的扫雷就写完了\(^o^)/~

记得把打印雷盘的代码收起来哦~


结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
想成为大佬那就保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


你可能感兴趣的:(C语言,c语言,开发语言)