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

31 阅读5分钟

每日一言

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


以下是我写扫雷的过程

我把代码分成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^)/~

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


结语

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


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

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

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