前面的《自動掃雷》系列博文介紹了如何從XP內建的掃雷遊戲中擷取遊戲、分析確定情況下的雷塊,以及操作滑鼠完成遊戲。這篇將介紹如何使用數學中的機率知識來玩掃雷遊戲,也正是本人最想介紹的地方,即《前言》中所說的第四種掃雷模型的分析。
先看遊戲介面,如下:
在遊戲開始時,如何出現這樣的情況,我們可以認為遊戲中未顯示塊按機率相等可分為四個地區,其中a,b,c是其中的三個地區(a地區指上面的5個塊,b地區指中間的3個塊,c地區指下面的5個塊),再加上不與已揭開塊相鄰的所有塊構成一個地區d(d地區含有465塊)。那麼這四個地區中哪個地區有雷的機率最小呢?
這裡直接說明所使用的數學方法叫做——條件機率和全機率公式。
條件機率可以說是電腦領域的一個功臣,由其發展而來的“統計語言模型”實現了機器翻譯、語音辨識、漢字識別等一系列的用傳統方法很難解決的問題。而以其為基礎的“貝葉斯公式”在影像處理、決策支援系統和博弈論中有著廣泛的應用。
維基百科中給的定義是:條件機率就是事件A在另外一個事件B已經發生條件下的發生機率。條件機率表示為P(A|B),讀作“在B條件下A的機率”。
而全機率為:
假設{ Bn : n = 1, 2, 3, ... } 是一個機率空間的有限或者可數無限的分割,且每個集合Bn是一個可測集合,則對任意事件A有全機率公式:
又因為
此處Pr(A | B)是B發生後A的條件機率,所以全機率公式又可寫作:
用自己的話說,條件機率是在某件事發生的情況下,另一件事的機率;全機率是將所有情況的機率加起來。
而在掃雷遊戲中有什麼“所有情況”呢?
看上面的遊戲情境,a,b,c所佔的13個塊,如果僅僅根據上面所顯示的"1","2",可以說這13個塊中,雷的總數可以有2個,也可以有3個!!並且有2個或者3個的機率分別是1/2。
那麼其情況如下:
上表說明當雷數為2時,abc有雷的機率分別為0,1/3,1/5;當雷數為3時,abc有雷的機率分別為1/5,0,2/5。
可算出
a地區有雷的機率為0*1/2+(1/5)*(1/2)=1/10
b地區有雷的機率為(1/2)*(1/3)+0*1/2=1/6
c地區有雷的機率為(1/2)*(1/5)+(1/2)*(2/5)=3/10
而d地區的機率同理也算出為(1/2)*(97/465)+(1/2)*(96/465)=193/930
可知,a地區有雷的機率最小,故可以在此5塊中隨機選一塊點擊了,然後一切就交給上蒼了~~(在不用類似查看記憶體的方法的情況下,人做的就只有這麼多了)
到此,數學原理已介紹完畢,用一句話總結,即,先找出按地區劃分的未顯示塊,然後分類討論這些地區中雷的總個數。接下來的一篇博文(也是本系列最後一篇),將介紹如何將上面的數學運算用程式碼實現。
批註:從自己想到數學實現到想明白如何用程式碼實現,應該有兩年之多,當然只是偶爾無聊時才思考一下。不過,在思考這個實現過程中,自己開始一直在用數學的思路而沒有用代碼的思路去思考,故一直行不通。當自己用代碼實現後,感覺自己的思維又有了新的提高~~