用笑脸玩扫雷
想必大家都有玩过「扫雷」这款游戏,尤其是经历过 Windows 早年版本时代的人们,在计算机的开始菜单里找了半天,好不容易找到「游戏」文件夹,里面赫然躺着一个应用程序。双击打开,看到一个黄黄的微笑,心想这游戏肯定很简单吧!然后便被炸弹炸死。

好吧,这游戏到底该怎么玩呢?首先,你可以点开一个网格,看看下面有没有雷,就像是现实生活中挖雷一般。你可以右键给一个网格插上旗子,标记该网格,假设它底下有雷。
那就点开一个网格看看吧!

看来我们挖出了一个大区域。其中没有数字的网格,代表它的周围(即相邻的八个格子)没有雷;有数字的网格,上面的数字代表周围存在多少个雷,例如 1 就是相邻的格子里有 1 个雷、2 就是相邻的格子里有 2 个雷……
知道了这一条规则后,我们可以快速锁定这些 1 们:因为它们的周围只有 1 个格子,也只有 1 个雷,那么雷到底在哪里,很显而易见了吧~

给这些定有雷的格子插上旗后,我们可以进一步推测出,旁边的 1 的雷已经被找到了,那么它们的周围就不可能再有其他雷 —— 全部挖开!
持续做下去后,很快你便会发现,已经没有可以用这种推理方法挖开或者插旗的格子了。当然,这不意味着扫雷无法再继续进行下去,只是我们还没有明白该游戏的本质。
扫雷的核心逻辑在于「公共区域的控制权」。什么是公共区域?当两个数字相邻时,它们周围的一圈格子在中间部分一定是重叠的。除了这片公共区域,它们又各自拥有属于自己的一小块独占区域。
假设我们决定观察这两个相邻的数字:M 和 N。M 周围有 M 个雷,N 周围也有 N 个雷,它们中间夹着的几个格子是它们共同拥有的。无论这些公共格子通过什么方式排列雷,它们对 M 和 N 的贡献是一样的。如果 M 是 1,N 也是 1,意味着 M 需要在它的视野里找到 1 颗雷,N 也需要找到 1 颗雷 —— 因为 M 通过公共区域得到了满足,那么 N 作为邻居,自然也得到了满足。如果此时 N 还有额外的独占区域格子,那么格子必然不能有雷,否则 N 周围的雷数就会超标。
明白了这些后,恭喜你,你理解了扫雷游戏里的「1-1」定式!
接着我们用这个逻辑去理解「1-2」定式。想象这么一个场景,M 是 1,N 是 2。这意味着公共区域内最多只能有 1 颗雷,绝对不能再多。既然最多只能有 1 颗雷,那么 N 的最后那颗雷哪里来?答案是在 N 的独占区域内。也就是说,我们可以通过减法公式 N - M = 1,来得出答案 1 颗雷必然存在于大数字的独占区域内。
再来看「1-2-1」定式。我们这里使用 M = 1、N = 2、O = 1 来代表这个场景。假设我们把雷放在 N 的正下方,这颗雷会同时被 M、N、O 看到,且同时满足 M 和 O 的条件。可是,中间的 N 还差 1 颗雷。但这颗雷没有地方放了,因为如果再在任何地方放雷,左右两边的 1 就会变成 2,也就违背了已知条件。所以,结论只有一个:中间那个公共格子绝对不能有雷。既然中间不能有雷,为了满足中间的 2,雷只能被迫分布在两个 1 的下方。也就是说,「1-2-1」是一个硬性定式,只要看到了就可以断定两个 1 下面有雷,而 2 的下面没有。

如果将两个「1-2」叠加起来,我们能得到「1-2-2-1」定式。左边的「1-2」结构意味着,为了补足 2 的雷数,最左边的雷必须在 2 的独占区域。同理,右边的「2-1」结构意味着最右边的雷也必须在 2 的独占区域。这样一来,两个 2 外侧的雷都确定了。现在只需要找到公共区域的雷。由于它们原本都是 2,现在各减去确定的 1 颗,剩下的需求便变成了「1-1」的局面。
根据前面提到的「1-1」逻辑,中间往往是安全的,或者雷的分布是对称的。结果便是,两头的 1 下面有雷,中间的两个 2 下面往往可以挖开。不过该定式需要取决于雷的具体排列,不过逻辑核心依然是先确定外侧的必然雷。
其实,这些定式本质上都是数个「1-1」或者「1-2」组成的,只要理解底层逻辑,都可以通过这些减法公式来判断雷的位置。但是呢,在实际的中盘博弈中,数字周围通常已经插上了旗帜。如果不扣除这些已知的雷,直接套用减法公式,新手容易将实质上的「1-2」误判为「2-2」或者「3-3」等对称局面,从而得出完全相反的安全结论并导致踩雷。
过去我为作业写过 一个简单的扫雷 AI。因为对该游戏的不熟悉,代码里并没有赋予 AI 处理任何需要综合判断的局面的能力。这对我们而言也是同样的,如果只是随便将定式套在数字上,而没有考虑到更为综合的情况的话,得到的可能就是一个爆炸的雷,和一个死掉的小黄脸了。
该文章仅讲述扫雷游戏的入门玩法,参考 该文章,想要更多了解的也请阅读该文章。