翻看了下之前大學學習的一些小項目,忽然發現有個項目比較有意思,以爲有必要把它分享出來。固然如今看來,裏面有不少的不足之處,但因博主如今已經工做,沒有時間再去優化。這個項目就是利用C#編寫一個Windows系統下的掃雷小遊戲。算法
首先講下掃雷小遊戲的玩法:數組
(1)掃雷就是要把全部非地雷的格子揭開即勝利;踩到地雷格子就算失敗。學習
(2)當點開的格子不是地雷區域的時候,該格子會顯示一個數字,該數字表示的含義就是該格子周邊有多少個地雷。優化
(3)同時點開的若是非地雷的格子,周邊連貫的非地雷區域都會自動被掃描打開,直到遇到旁邊有雷區的時候中止。spa
(4)當你判斷出格子是地雷的時候,你可使用鼠標右鍵將該塊方格標記爲雷區。當不肯定的時候,你可標記個問號以待肯定。設計
下面來講下我大學時候實現這個掃雷小遊戲的思路:orm
(1)由於雷區是一個個格子聯合組成的,那咱們可使用winform程序自帶的系統按鈕控件Button來實現雷區方格。對象
(2)表明雷區方格的Button按鈕須要實現下面幾個事件:鼠標左鍵點擊掃雷事件,鼠標右鍵點擊標記雷區事件,鼠標右鍵點擊標記問號區域事件。blog
(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類獨立出來等,這些都靠讀者自行去優化了。
附上博主源碼下載的百度雲連接,須要代碼學習的可自行下載研究(完整解決方案源碼,能夠直接編譯運行):https://pan.baidu.com/s/1T4zVndyypzY9i9HsLiVtGg
提取密碼請關注下面的公衆號【IT技術小趣屋】,發送消息:掃雷源碼。
最後,附上博主的IT技術學習羣,歡迎各位同行入羣指導交流。技術羣:960640092
更多文章能夠關注博主我的站點:IT技術小屋。博主公衆號以下: