翻看了下以前大學學習的一些小專案,突然發現有個專案比較有意思,覺得有必要把它分享出來。當然現在看來,裡面有很多的不足之處,但因博主現在已經工作,沒有時間再去優化。這個專案就是利用c#編寫乙個windows系統下的掃雷小遊戲。
首先講下掃雷小遊戲的玩法:
(1)掃雷就是要把所有非地雷的格仔揭開即勝利;踩到地雷格仔就算失敗。
(2)當點開的格仔不是地雷區域的時候,該格仔會顯示乙個數字,該數字表示的含義就是該格仔周邊有多少個地雷。
(3)同時點開的如果非地雷的格仔,周邊連貫的非地雷區域都會自動被掃瞄開啟,直到遇到旁邊有雷區的時候停止。
(4)當你判斷出格仔是地雷的時候,你可以使用滑鼠右鍵將該塊方格標記為雷區。當不確定的時候,你可標記個問號以待確定。
下面來說下我大學時候實現這個掃雷小遊戲的思路:
(1)因為雷區是乙個個格仔聯合組成的,那我們可以使用winform程式自帶的系統按鈕控制項button來實現雷區方格。
(2)代表雷區方格的button按鈕需要實現下面幾個事件:滑鼠左鍵點選掃雷事件,滑鼠右鍵點選標記雷區事件,滑鼠右鍵點選標記問號區域事件。
(3)為了更好的實現遊戲的可玩性,增加乙個自由設定地雷數量的小功能,可自行設定雷區包含的地雷數量,設定完成後,自動重新整理介面,重新部署地雷。
(4)我們將雷區的方格儲存在乙個全域性的二維陣列中,form窗體在初始化的時候,自動生成面板區域的button按鈕列表。
(5)為了實現每次玩遊戲的時候,地雷分布不一致,我們在button列表生成後。隨機抽取出某些button按鈕作為地雷分布點,並記錄該button的雷區屬性為含有地雷。
(6)演算法中的關鍵:遞迴演算法計算雷區。當點選某個方格的時候,如果該方格是雷區,則直接game over,如果不是的話,則我們需要乙個演算法去計算旁邊區域的地雷數量,以及旁邊區域沒有地雷的區域,當沒有地雷的區域連成一片的時候,我們需要使用遞迴演算法,去查詢二維陣列,找到對應的連片非雷區,將之開啟。
遊戲的最終效果圖如下:
我們下面來剖析下幾個關鍵點,因為**量比較多,我就不全部詳細剖析了。
首先我們定義乙個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類獨立出來等,這些都靠讀者自行去優化了。
。
掃雷遊戲。。c 編寫。。
我知道很簡單,就這樣吧。掃雷 2012 11 20 include include include include include include using namespace std struct node queueq int map 1010 1010 already 1010 1010 i...
掃雷(用C語言編寫掃雷遊戲)
用c語言編寫掃雷遊戲是很有趣的哦,在學習中遊戲,在遊戲中學習 game.h檔案 ifndef game h define game h enum option include include include include define row 11 define col 11 define sui...
c 掃雷遊戲
一 c 實現掃雷 1 在form中 bombclass bombclass new bombclass 布雷按鈕事件 private void initbombbtn click object sender,eventargs e 雷盤的滑鼠點選事件 方法一 private void bombpan...