几年前用C#就做过XP系统下的扫雷游戏的外挂,当时能力有限,程序的框架不够好,功能也不够完善。现在用C++写了一个win32的自动扫雷程序mineTerminator(扫雷终结者),现将其整理成博文。
将分为如下几篇解说:
说到自动游戏,即用程序自动去玩某个游戏。这主要会涉及到三个部分:获取游戏数据,分析数据、得到有用数据,控制游戏。
mineTerminator中用分析游戏窗口像素信息得到游戏数据,而控制游戏而是用SendMessage给游戏窗口发送按键消息。现在的难点既是分析游戏数据:通过下面几部分来说明如何利用数学之美,成功地解决问题。
先来分析一下扫雷中可以存在的情况,总结出了四种不同的模型:
- 第一种、第二种模型
分析右上角的的2,其周围的未知块a,b两块,等于其周围雷数,故可判断出a,b都是雷;接下来,分析下面的2,其周围共有3个未显示的块a,b,c,其中a,b已判断出为雷,即周围已判断的雷数等于其雷数时,则可判断剩下的块都不是雷,即c块不是雷。
这两种模型,一种是判断出雷、一种是判断出没有雷,这是地球人都知道的扫雷方法。而接下来的模型或许只有扫雷高手或者数学高手才知道~~
- 第三种模型
我先做一个大胆的判断,c块没有雷!!且听我慢慢道来~
根据两个显示为1的块,可得如下的式子:
a+b=1 (1)
d+e=1 (2)
表示a,b中有且只有一个雷,d,e有且只有一个雷,
根据显示为2的块,可得:
a+b+c+d+e=2 (3)
表示abcde中有且只有两个雷
根据(1)(3),可得
c+d+e=1 (4)
根据(2)(4)可得, c=0 ,所以c块肯定无雷,可放心地揭开。
这种模型可以说在扫雷中应用得最精妙,看似无法判断的情况,通过这样的计算就可确定出哪里是雷或者哪里不是雷。
- 第四种模型
上面三种模型都属于可确定判断的范畴,而在扫雷中经常会遇到无法确定判断的死局。这时就得用到数学工具——概率,来进行最优判断。
如图所示显示为3周围有雷的概率很容易计算出:3/8(这是比较简单的情况)。再看下面的图
当点开两个"8邻接"距离小于等于2的块时,它们周围有雷的概率就不那么容易判断了(上面a,b,c有雷的概率分别是多少),这种情况留在后文详细分析。《编程之美》的最后一题也就是这个问题, 三年前自己一直在想这个概率如何来求,以及如何用程序实现。现在总算是想明白了~~~
前言先写到这,后面的精彩敬请期待。