幾年前用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有雷的概率分別是多少),這種情況留在后文詳細分析。《編程之美》的最后一題也就是這個問題, 三年前自己一直在想這個概率如何來求,以及如何用程序實現。現在總算是想明白了~~~
前言先寫到這,后面的精彩敬請期待。
