在学习完前文各章节内容后,我已具备编写一款简易扫雷小游戏的能力。于该游戏的开发过程中,涉及到随机数生成、数组运用、函数调用以及分文件编写等知识与技能。此过程极大地提升了我的能力。
在进行游戏的过程中,必然会存在一个菜单,它为玩家提供各种操作选项。为了实现打印这个菜单的功能,我们能够设置一个专门用于打印菜单的函数。

而且,鉴于游戏具备可重玩的特性,循环结构就显得尤为必要。在众多循环结构中,我们可以选择使用 do – while 循环。do – while 循环的显著优势在于,它能够确保程序至少进入一次菜单界面,这与游戏的实际逻辑高度契合。因为当玩家启动游戏时,首先映入眼帘的通常就是菜单,这就需要程序一开始就展示菜单内容。在进入 do – while 循环体之后,我们可以利用 switch 语句来有效实现玩家对不同选项的选择。通过这种方式,玩家能够根据自身需求,在菜单所提供的各项功能中做出选择,比如开始游戏,退出游戏等等,从而让游戏具备良好的交互性与可操作性。
以下是我的main()函数

逻辑很清晰
接下来是game()函数的封装。
我们设想一下,在玩扫雷游戏的过程中,通常会出现一个 9×9 规格的游戏棋盘。在控制台环境下,我们可以通过一种特定的方式来模拟这个棋盘。具体来说,我们用 “1” 来代表棋盘上存在雷的位置,用 “0” 来代表空无一物的位置。按照这样的思路,我们就可以定义一个二维数组,将 “1” 放置在有雷的位置,“0” 放置在空位置上。

在游戏尚未正式开始扫雷之前,为了营造出未知的游戏氛围,我们打印出的棋盘全部由 “ * ” 组成。考虑到 “ * ” 是字符类型,为了保持数据类型的一致性和匹配度,我们需要使用字符‘1’和‘0’来表示雷和空位置。至此,想必大家对于这个游戏棋盘的初步构建已经有了一定的思路。
然而,这里还存在一个问题。当我们真正开始扫雷时,如果仅仅使用一个棋盘,那么在排雷过程中,当我们排查到某个位置本身没有雷,但它周围却存在一颗雷的情况时,就会出现歧义。比如此时显示的 “1”,它到底是代表这个位置本身是雷,还是仅仅表明该位置周围有一颗雷呢?为了有效消除这种歧义,我们可以设置两个棋盘。其中一个棋盘专门用于存放雷的分布信息,而在排查过程中所获取到的信息,比如某个位置周围雷的数量等,则放到另一个棋盘上。经过这样的思考,相信大家对于游戏的实现思路变得更加清晰了。


但事情并没有就此结束,这里又冒出了一个新问题。在排查棋盘边界位置的时候,如果还是采用与排查棋盘中间位置相同的方式,就很容易导致数组越界访问的错误。那么这个问题该如何解决呢?其实方法非常简单,我们只需要在原本定义的数组周围围上一圈 “0”。这样一来,在进行计算和排查时,就会变得比较简便,从而有效避免数组越界的问题。

接下来对比我的代码,可以让你更好的理解
棋盘初始换函数:set_board

展示棋盘(由 * 组成)函数:display_board

设置雷函数:set_mine

寻找雷:fine_mine

若没有选择到雷,计算周围雷个数:get_mine函数

接下来是运行的效果图

以上就是我的分享了,谢谢大家。
我比较菜。。。。。(点个赞吧)



