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

每日一言

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


以下是我写扫雷的过程

我把代码分成3部分:

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

菜单实现

肯定要使用printf函数,所以在game.h中包含一下,以后自己写的函数都放在这里声明一下,后文不在重复了。
在这里插入图片描述
别忘了在game.c与test.c中包含一下game.h,这样以后的头文件就都放在game.h中就行了
在这里插入图片描述

在test.c中写上main函数,用do-while实现游戏的大致逻辑
在这里插入图片描述

在这其中用menu函数打印游戏菜单
在这里插入图片描述

测试运行
在这里插入图片描述
运行无误,接下来要实现游戏的内容了,在写代码之前要捋一下思路

游戏内容实现

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

写一个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^)/~

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


结语

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


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

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

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


  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值