每日一言
因为不可能,所以才值得相信。 --浮士德
以下是我写扫雷的过程
我把代码分成3部分:
- game.h 放头文件和定义用
- game.c 放一些实现游戏的函数
- test.c 游戏具体的实现代码
菜单实现
肯定要使用printf函数,所以在game.h中包含一下,以后自己写的函数都放在这里声明一下,后文不在重复了。
别忘了在game.c与test.c中包含一下game.h,这样以后的头文件就都放在game.h中就行了
在test.c中写上main函数,用do-while实现游戏的大致逻辑
在这其中用menu函数打印游戏菜单
测试运行
运行无误,接下来要实现游戏的内容了,在写代码之前要捋一下思路
游戏内容实现
思路
- 首先肯定要有棋盘
- 肯定要在棋盘上放雷
- 让玩家输入,然后判断是否踩雷,如果踩到游戏结束,如果没有则告诉玩家这附近有几颗雷
- 不断循环,直到雷全部被找到
写一个game函数来封装内容实现代码吧,game函数放在这
棋盘实现
首先要确定棋盘的大小,是几乘几的,这两个数肯定会经常用到,那就在game.h中用#define定义一下,方便以后管理。
雷的个数同上
棋盘上的每个位置是否是雷肯定要保存下来,又因为棋盘是二维的,很容易想到用二维数组来存放数据。
我在这里默认雷用“1”表示,非雷用“0”表示。
先初始化棋盘,让每个位置都不是雷,方便以后放置雷。
创建棋盘:
初始化棋盘:
打印一下棋盘看看效果,打印棋盘这个功能会经常用到,就写成printboard函数吧,这个函数的实现我放在game.c中
运行结果
为了以后游玩方便,我加上了每行,每列的序号
改进后的代码
效果
看到这里肯定有人要说了,你不是要打印9*9的棋盘吗,这里怎么只打印了7*7的?
嘿嘿,先别急,我在这里先卖个关子。
棋盘放雷
棋盘写好了,接下来就是随机放雷了。
怎么才能随机放呢?我们需要生成两个随机数,来确定一个坐标,在这个坐标上放雷。
注意:1. 这两个随机数不能超过棋盘的大小。2. 生成的坐标不能重复,也就是不能在有雷的位置上放雷。
生成随机数要用srand来设置一个种子,用时间戳来当它的参数吧
别忘了要包含相应的头文件
我用sit_Mine函数来封装放雷的代码
测试一下
当然了在游戏过程中肯定不能让玩家看见,所以记得别把雷盘打印出来
玩家游玩的时候每个坐标上的数要保持神秘感,所以再创建一个二维数组,这个数组是专门让玩家看见的
当然要初始化棋盘,你也不想存一堆随机数吧。
我们把棋盘上的每个位置初始化成“ * ”
刚刚写的 Initboard 函数好像不能用,没关系改一下就好了,再传一个符号给函数就OK了
改进后的 Initboard 函数
运行一下
很好!就是我们想要的效果~
下一步就是玩家输入坐标,然后判断是否踩雷
判断输赢,以及数字提示
我把这些放在judge函数中
判断玩家输的代码很容易写,先写出来,别忘了卡定范围,防止玩家输错,导致越界访问
测试运行
接下来就是写玩家没踩雷后的情况了
首先判断该位置附近有几颗雷
然后在棋盘的相应位置打印出来
打印好说,怎么判断呐?
举个栗子,假设是6*6的棋盘
在数组中是这样的
假设玩家选择了3 3这个位置
我们只需要判断这几个位置
同样的,假设玩家选择了 x y
我们只需要判断 x-1 x x+1 与 y-1 y y+1 这几个数组成的坐标上共有几颗雷就行了。
有细心的读者肯定会发现万一有玩家选 7 7 , 1 0 等在数组边缘的位置,怎么判断有几颗雷呐?
其实很简单,那就是只让玩家看见这些坐标就行了
这就是为什么在上面我写的printboard函数只打印了7*7的棋盘
为了以后改起来更直观一点我把ROW和COL的值改了一下
用Count函数来数雷
数雷的原理就是把周围上的数加一遍然后减去7个0的ASCII码值,记得要留一个0。原因就不用我多说了,相信你们想一想都可以理解。
judge 函数
测试运行一下
没有问题
接下来写判断玩家胜利条件
再做一点修饰
让玩家死的瞑目
让玩家赢的明白
你以为这样就写完了吗?
不~
其实有bug,当玩家不断输入已经输入过的坐标,all也会变成0,进而打印玩家胜利
再做一下改进
效果
到这里简易的扫雷就写完了\(^o^)/~
记得把打印雷盘的代码收起来哦~
结语
请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
想成为大佬那就保持空杯心态加油努力吧!
都看到这里啦!真棒(*^▽^*)
可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家
编程小白写作,如有纰漏或错误,欢迎指正