在 《C语言扫雷游戏演示和说明》一节中,我们对扫雷游戏的玩法进行了介绍和演示,这节就来分析一下它的源代码。扫雷游戏源代码下载地址:
各位读者不防先将源代码下载浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。
下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解扫雷的设计思路。
扫雷游戏的整个界面,都是由特殊字符组成,小方块 ■ 是灰色的,方框 □ 是白色的,炸弹 ● 是黄色的,等等。这就涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言》了解详情。
在扫雷游戏中,当用户输入是否开始游戏的 Y/N 时,程序能够自动监听,当用户输入完成后,不用回车,程序立即做出反应,这就用到了键盘监听。请大家猛击《C语言非阻塞式键盘监听》了解详情。
扫雷游戏中,雷区会随机出现在整个区域的任意位置,没有任何规律,这就要求程序能够生成随机数值,由随机数设置雷区的位置。有关随机数的产生请大家猛击《C语言获取随机数》了解详情。
扫雷游戏初始化过程中,我们使用到了 3 个二维数组:mine、show、mineDow:
提示:在源代码的 game 函数中,在 mine_sweep() 函数之前的所有工作,都是初始化工作。
扫雷功能的实现,整体思路是:
提示:show_deal 函数找的是该区域既不是雷区,其周围也没有雷区的区域,将其全部更新到 show 数组中。一旦遇到周围有雷区的区域(这部分区域也会被更新到 show 数组中),则递归结束。
扫雷功能的具体实现,可见源代码中的 mine_sweep 函数。
扫雷界面,实际上是将 show 数组中存储的数据换了一种方式输出出来。例如,show 数组中存储有字符 ‘*’,在输出时,统一换为“■”;表示雷区的字符 ‘o’,统一换为 ‘●’,等等。
注意:用于替换的字符,并不是普通的字符,它们并不在 ASCII 码范围内,是宽字符,占用两个字节。
采用此种方式,再配以合适的颜色(采用Windows API),可以将二维数组以如下的这种形式反馈给用户:
扫雷界面的详细优化代码,可见原代码中的 display_board() 函数的实现。