在 《C语言扫雷游戏演示和说明》一节中,我们对扫雷游戏的玩法进行了介绍和演示,这节就来分析一下它的源代码。扫雷游戏源代码百度网盘下载地址:https://pan.baidu.com/s/1sncBcnz 密码: wcfg各位读者不防先将源代码下载浏览一遍,记住关键的几个函数,整理一下不了解的知识点,做到心中有数。

一、关键知识点

下面请各位读者先学习一下该游戏中涉及到的几个关键知识点,有了这些必备条件,我们才好讲解扫雷的设计思路。

1) 改变输出文本的颜色

扫雷游戏的整个界面,都是由特殊字符组成,小方块 ■ 是灰色的,方框 □ 是白色的,炸弹 ● 是黄色的,等等。这就涉及到如何改变文本的输出颜色,请大家猛击《彩色版的C语言,让文字更漂亮》了解详情。

2) 键盘监听

在扫雷游戏中,当用户输入是否开始游戏的 Y/N 时,程序能够自动监听,当用户输入完成后,不用回车,程序立即做出反应,这就用到了键盘监听。请大家猛击《C语言非阻塞式键盘监听》了解详情。

3) 获取随机数

扫雷游戏中,雷区会随机出现在整个区域的任意位置,没有任何规律,这就要求程序能够生成随机数值,由随机数设置雷区的位置。有关随机数的产生请大家猛击《C语言获取随机数》了解详情。

二、扫雷游戏初始化

扫雷游戏初始化过程中,我们使用到了 3 个二维数组:mine、show、mineDow:

  • mine 数组用于初始化扫雷游戏。具体做法是:首先默认整个二维数组中没有雷区,全部设为安全区域(用 0 表示),然后在二维数组中随机安插一定数量的雷区;

  • show 数组用于每次将结果输出给用户。当用户输入完成后,show 数组会根据用户的输入对存储的数据做适当的更新,然后输出给用户;

  • mineDow 数组中每个数据表示的,该位置相邻的周围雷区的数量,此数组的建立为的是实现“点击一个位置,开出一片安全区域”的效果

提示:在源代码的 game 函数中,在 mine_sweep() 函数之前的所有工作,都是初始化工作。

三、扫雷功能的实现

扫雷功能的实现,整体思路是:

  1. 判断用户输入坐标处是否是雷区;

  2. 更新 show 数组:如果是雷区,将 show 数组中该坐标位置上由字符 ‘*’ 改为表示雷区的字符 ‘o’;如果不是雷区,借助 mineDow数组中存储的信息,使用递归的方式,找到其他符合条件的非雷区区域(show_deal 函数的作用),将找到的所有区域一并更新到 show 数组中;

  3. 将新的 show 数组以一定的格式输出,反馈给用户;

提示:show_deal 函数找的是该区域既不是雷区,其周围也没有雷区的区域,将其全部更新到 show 数组中。一旦遇到周围有雷区的区域(这部分区域也会被更新到 show 数组中),则递归结束。

扫雷功能的具体实现,可见源代码中的 mine_sweep 函数。

四 扫雷界面的优化

扫雷界面,实际上是将 show 数组中存储的数据换了一种方式输出出来。例如,show 数组中存储有字符 ‘*’,在输出时,统一换为“■”;表示雷区的字符 ‘o’,统一换为 ‘●’,等等。

注意:用于替换的字符,并不是普通的字符,它们并不在 ASCII 码范围内,是宽字符,占用两个字节。

采用此种方式,再配以合适的颜色(采用Windows API),可以将二维数组以如下的这种形式反馈给用户:

5bd397166e802eed8569b5af9a1505bd.png 

扫雷界面的详细优化代码,可见原代码中的 display_board() 函数的实现。

abc5b75833663a638f8ba4ae6279df84.png

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐