Xiangism

从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源。对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大。
  博客园  :: 首页  :: 联系 :: 管理

自动扫雷——前言

Posted on 2012-10-27 19:14  Xiangism  阅读(5218)  评论(8编辑  收藏  举报

几年前用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有雷的概率分别是多少),这种情况留在后文详细分析。《编程之美》的最后一题也就是这个问题, 三年前自己一直在想这个概率如何来求,以及如何用程序实现。现在总算是想明白了~~~

前言先写到这,后面的精彩敬请期待。