C#編寫掃雷遊戲
翻看了下以前大學學習的一些小專案,突然發現有個專案比較有意思,覺得有必要把它分享出來。當然現在看來,裡面有很多的不足之處,但因博主現在已經工作,沒有時間再去優化。這個專案就是利用C#編寫一個Windows系統下的掃雷小遊戲。
首先講下掃雷小遊戲的玩法:
(1)掃雷就是要把所有非地雷的格子揭開即勝利;踩到地雷格子就算失敗。
(2)當點開的格子不是地雷區域的時候,該格子會顯示一個數字,該數字表示的含義就是該格子周邊有多少個地雷。
(3)同時點開的如果非地雷的格子,周邊連貫的非地雷區域都會自動被掃描開啟,直到遇到旁邊有雷區的時候停止。
(4)當你判斷出格子是地雷的時候,你可以使用滑鼠右鍵將該塊方格標記為雷區。當不確定的時候,你可標記個問號以待確定。
下面來說下我大學時候實現這個掃雷小遊戲的思路:
(1)因為雷區是一個個格子聯合組成的,那我們可以使用winform程式自帶的系統按鈕控制元件Button來實現雷區方格。
(2)代表雷區方格的Button按鈕需要實現下面幾個事件:滑鼠左鍵點選掃雷事件,滑鼠右鍵點選標記雷區事件,滑鼠右鍵點選標記問號區域事件。
(3)為了更好的實現遊戲的可玩性,增加一個自由設定地雷數量的小功能,可自行設定雷區包含的地雷數量,設定完成後,自動重新整理介面,重新部署地雷。
(4)我們將雷區的方格儲存在一個全域性的二維陣列中,Form窗體在初始化的時候,自動生成面板區域的Button按鈕列表。
(5)為了實現每次玩遊戲的時候,地雷分佈不一致,我們在Button列表生成後。隨機抽取出某些Button按鈕作為地雷分佈點,並記錄該Button的雷區屬性為含有地雷。
(6)演算法中的關鍵:遞迴演算法計算雷區。當點選某個方格的時候,如果該方格是雷區,則直接Game Over,如果不是的話,則我們需要一個演算法去計算旁邊區域的地雷數量,以及旁邊區域沒有地雷的區域,當沒有地雷的區域連成一片的時候,我們需要使用遞迴演算法,去查詢二維陣列,找到對應的連片非雷區,將之開啟。
(7)如何設定方格的狀態:當滑鼠左鍵點選的方塊區域非雷區的時候,我們將Button按鈕的屬性設定為Disabled即可呈現開啟的狀態。當滑鼠左鍵開啟的方格是雷區時候,此時我們可以將所有地雷區域塊的Button的背景圖設定為地雷圖片,並播放相應的爆炸音效,彈出遊戲終止介面即可。當滑鼠右鍵標記雷區或者待確定區域的時候,只需要更改Button的背景圖即可。當然上述所有點選操作,都得判斷Button方格區域當前的狀態值:初始化狀態、已標記為待確定狀態、已標記為雷區。
遊戲的最終效果圖如下:
我們下面來剖析下幾個關鍵點,因為程式碼量比較多,我就不全部詳細剖析了。
首先我們定義一個LeiButton類,這個類繼承於系統控制元件Button,增加x,y,youlei三個欄位,x表示二維陣列的第一個索引,y表示二維陣列的第二個索引值,youlei用於標記Button方塊區域按鈕的狀態(0表示無雷,1表示有雷)。同時我們使用Button按鈕類自帶的一個Tag屬性標記該方塊區域是否被翻開。具體定義如下:
然後我們在窗體物件Form類中定義一些常用的變數之類,如下圖,都有相應註釋
下面我們來看下生成Button的二維陣列,即生成雷區的Button列表。我們需要在Form中新增GroupBox元件,然後將動態生成的Button列表新增到這個groupbox元件中。生成Button的二維陣列方法體如下:
生成完Button列表後,我們就開始部署地雷了,地雷隨機部署到Button列表中,部署地雷的方法如下:
到了這一步,我們就應該將雷區的介面渲染出來了,這時候我們可以將上面兩個方法放入窗體的Form_Load事件中即可渲染出遊戲介面。如下所示
我們繼續,下面寫掃雷的演算法,當滑鼠左鍵點開某個方格的時候,如果該方格不是雷區,那我們需要計算該方格周邊的地雷數量,計算方法如下:
下面是個遞迴計算的核心演算法,非常關鍵。當我們點開的方格非雷區的時候,周邊連片的非雷區的方格塊會被開啟。這一塊的核心演算法參考下列程式碼,row表示行,col表示列

下面我們來新增滑鼠的點選事件,我這邊採用的是bt_MouseUp事件來處理。點選後,我們首先判斷遊戲是否結束,如果沒結束,則進行下列操作,獲取到被點選的按鈕的x,y值以及點選事件按下的鍵值(判斷按下的是滑鼠左鍵還是右鍵)。x,y值獲取到了,我們就可以到Button二維陣列中找到對應元素。
假如點選的是滑鼠左鍵,則我們進行掃雷操作,具體的程式碼如下:
如果按下的是滑鼠右鍵,則是標記方塊是雷區或者待確定區域,具體程式碼如下:
最後再給出一個判斷是否掃雷完畢的方法。
掃雷遊戲的設計大概到此結束,中間還有很多可以優化的地方,比如將掃雷的邏輯程式碼抽離Form類獨立出來等,這些都靠讀者自行去優化了。如果有需要原始碼的初學者,可聯絡博主,博主免費贈與學習。