在我大二的時候就編寫了一個掃雷程序,現在也有很多
源程序下載,我不知道他們的算法是怎麼樣的,但我想我的
算法應是最清晰和簡單的。下面就來講解我的掃雷程序思想。
首先我們在雷區上隨機地放上雷,沒有雷的地方被點擊
後就會顯示一個數字表示它周圍有幾個雷,這是怎麼實現的
呢?我們可以把整個雷區看成一個二維數組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]
將被展開,一直波及到不可確定的雷區。這也是實現的
關鍵。我們可以把數組的元素設定為一個類對象,它們
所屬的類設定這樣的一個事件:在被展開時,檢查周圍
的雷數是否與周圍標示出來的雷數相等,如果相等則展
開周圍未標示的雷區。這樣新的雷區展開又觸發這個事
件,就這樣遞歸下去,一直蔓延到不可展開的雷區。
相信在了解以上兩個要點後,把雷區這個類編寫完全
(如添加是否有雷標記,是否展開標記,周圍雷數等,雙
擊,左右單擊的鼠標事件等),實現掃雷程序應是十分簡
單的一件事。