掃雷程式思想講解 (轉)

gugu99發表於2008-01-05
掃雷程式思想講解 (轉)[@more@]

  掃雷思想講解
  在我大二的時候就編寫了一個掃雷程式,現在也有很多
源程式,我不知道他們的演算法是怎麼樣的,但我想我的
演算法應是最清晰和簡單的。下面就來講解我的掃雷程式思想。
  首先我們在雷區上隨機地放上雷,沒有雷的地方被點選
後就會顯示一個數字表示它周圍有幾個雷,這是怎麼實現的
呢?我們可以把整個雷區看成一個二維陣列a[i,j],如雷區:
 
 11  12  13  14  15  16  17  18
 21  22  23  24  25  26  27  28
 31  32  33  34  35  36  37  38
 41  42  43  44  45  46  47  48
 51  52  53  54  55  56  57  58
 
我要知道a[34]周圍有幾個雷,就只有去檢測
 a[23],a[24],a[25]
 a[33], a[35]
 a[43],a[44],a[45]
這8個雷區是否放上了雷,仔細觀察它們成在數學關係。
抽象出來就是:a[i,j]的雷的個數就是由
 a[i-1,j-1],a[i-1,j],a[i-1,j+1]
 a[ i ,j-1], a[ i ,j+1]
 a[i+1,j-1],a[i+1,j],a[i+1,j+1] 
(如果超出邊界再加以判斷)
這樣的8個雷區決定的。


  掃雷程式還會自動展開已確定沒有雷的雷區。如果
a[3,4]周圍雷數為1,a[2,3]已被標示為地雷,那麼
a[24],a[25],a[33],a[35],a[43],a[44],a[45]
將被展開,一直波及到不可確定的雷區。這也是實現的
關鍵。我們可以把陣列的元素設定為一個類,它們
所屬的類設定這樣的一個事件:在被展開時,檢查周圍
的雷數是否與周圍標示出來的雷數相等,如果相等則展
開周圍未標示的雷區。這樣新的雷區展開又觸發這個事
件,就這樣遞迴下去,一直蔓延到不可展開的雷區。
  相信在瞭解以上兩個要點後,把雷區這個類編寫完全
(如新增是否有雷標記,是否展開標記,周圍雷數等,雙
擊,左右單擊的滑鼠事件等),實現掃雷程式應是十分簡
單的一件事。



 
 zg
 to:nozg@263">nozg@263.net


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-996479/,如需轉載,請註明出處,否則將追究法律責任。

相關文章