C#編寫掃雷游戲

来源:https://www.cnblogs.com/xu-yi/archive/2018/11/30/10047375.html
-Advertisement-
Play Games

翻看了下以前大學學習的一些小項目,突然發現有個項目比較有意思,覺得有必要把它分享出來。當然現在看來,裡面有很多的不足之處,但因博主現在已經工作,沒有時間再去優化。這個項目就是利用C#編寫一個Windows系統下的掃雷小游戲。 首先講下掃雷小游戲的玩法: (1)掃雷就是要把所有非地雷的格子揭開即勝利; ...


翻看了下以前大學學習的一些小項目,突然發現有個項目比較有意思,覺得有必要把它分享出來。當然現在看來,裡面有很多的不足之處,但因博主現在已經工作,沒有時間再去優化。這個項目就是利用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類獨立出來等,這些都靠讀者自行去優化了。

附上博主源碼下載的百度雲鏈接,需要代碼學習的可自行下載研究:https://pan.baidu.com/s/1T4zVndyypzY9i9HsLiVtGg 提取碼: b2im 

 最後,附上博主的IT技術學習群,歡迎各位同行入群指導交流。技術群:872894940


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 import numpy as np 2 3 ######################## 4 # 索引 5 n1 = np.random.randint(0, 100, 10) 6 # print(n1) 7 ''' 8 [68 27 40 11 18 6 61 62 67 31] 9 '... ...
  • Python無法卸載的解決辦法 Python 使用虛擬環境管理器:virtualenvwrapper win 的時候出現了一些命令上的錯誤。所以打算卸載重新安裝,但發現無法卸載。 從文件夾中翻出當初的安裝包,進行修複。點擊Repair 正在修複 修複過後,點擊Uninstall開始卸載。 結果,卸載 ...
  • 一,項目簡介 1.利用Java GUI 繪製圖像界面,設置整體佈局 2.編寫一個隨機數生成1~100的隨機數 3.編寫一個驗證類,用於驗證用戶輸入值與生成隨機數是否相等並記錄用戶猜測次數,當用戶猜測成功或者超過5次結束游戲 二,運行界面 三,代碼實現 補充 我的註意事項: ...
  • 小伙伴們好今天給大家分享一下冒泡排序法: 它的原理是利用兩次for迴圈,外層for用來控制輪數,內層for用來控制每一輪比較的次數,比較時每相鄰的兩個數進行比較依次向後,這樣每一輪都會出比較出一個極值。 ...
  • 一道DP。 給你一個矩陣裡面有很多數,你需要從上往下找到一種跳躍方法使得經過的點的價值之和最大。 具體題面見鏈接 洛谷P1107 BZOJ1270 很明顯是一個二維的DP。 混搭碼風,求諒解。 ...
  • Python基礎知識(18):面向對象高級編程 使用__slots__:限制實例的屬性,只允許實例對類添加某些屬性 (1)實例可以隨意添加屬性 (2)某個實例綁定的方法對另一個實例不起作用 (3)給類綁定方法市所有類都綁定了該方法,且所有實例都可以調用該方法 用__slots__定義屬性反對這個類的 ...
  • 熟悉java的過程中發現了一些小問題,定義的類Car老是提示必須在它自己的文件中定義。自己想了想試試把Car繼承的類Vehicle中的public換到Car類中,結果發現輸出問題很大。它只顯示了一個輸出(我代碼有4個輸出)。後來查了查度娘原來是public類的類名和存儲的.java名字要一樣。問題雖 ...
  • 感謝博客園團隊日夜為廣大需要獲取知識人們所做的奉獻 博客園團隊您們辛苦了 ASP.NET MVC 實現有論壇功能的網站(有iis發佈網站 這是之前寫的... www.lazyfitness.cn 經過一個月的修正 通過ASP.NET MVC 所做的網站www.lazyfitness.cn正式發佈了! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...