最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用C#編寫掃雷游戲(附源碼)

 更新時間:2019年01月11日 11:25:50   作者:江湖逍遙  
掃雷游戲相信不用給大家過多介紹,大家基本都玩過,下面這篇文章主要給大家介紹了關(guān)于如何利用C#編寫掃雷游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

翻看了下以前大學(xué)學(xué)習(xí)的一些小項(xiàng)目,突然發(fā)現(xiàn)有個項(xiàng)目比較有意思,覺得有必要把它分享出來。當(dāng)然現(xiàn)在看來,里面有很多的不足之處,但因博主現(xiàn)在已經(jīng)工作,沒有時間再去優(yōu)化。這個項(xiàng)目就是利用C#編寫一個Windows系統(tǒng)下的掃雷小游戲。

首先講下掃雷小游戲的玩法:

(1)掃雷就是要把所有非地雷的格子揭開即勝利;踩到地雷格子就算失敗。

(2)當(dāng)點(diǎn)開的格子不是地雷區(qū)域的時候,該格子會顯示一個數(shù)字,該數(shù)字表示的含義就是該格子周邊有多少個地雷。

(3)同時點(diǎn)開的如果非地雷的格子,周邊連貫的非地雷區(qū)域都會自動被掃描打開,直到遇到旁邊有雷區(qū)的時候停止。

(4)當(dāng)你判斷出格子是地雷的時候,你可以使用鼠標(biāo)右鍵將該塊方格標(biāo)記為雷區(qū)。當(dāng)不確定的時候,你可標(biāo)記個問號以待確定。

下面來說下我大學(xué)時候?qū)崿F(xiàn)這個掃雷小游戲的思路:

(1)因?yàn)槔讌^(qū)是一個個格子聯(lián)合組成的,那我們可以使用winform程序自帶的系統(tǒng)按鈕控件Button來實(shí)現(xiàn)雷區(qū)方格。

(2)代表雷區(qū)方格的Button按鈕需要實(shí)現(xiàn)下面幾個事件:鼠標(biāo)左鍵點(diǎn)擊掃雷事件,鼠標(biāo)右鍵點(diǎn)擊標(biāo)記雷區(qū)事件,鼠標(biāo)右鍵點(diǎn)擊標(biāo)記問號區(qū)域事件。

(3)為了更好的實(shí)現(xiàn)游戲的可玩性,增加一個自由設(shè)置地雷數(shù)量的小功能,可自行設(shè)置雷區(qū)包含的地雷數(shù)量,設(shè)置完成后,自動刷新界面,重新部署地雷。

(4)我們將雷區(qū)的方格存儲在一個全局的二維數(shù)組中,F(xiàn)orm窗體在初始化的時候,自動生成面板區(qū)域的Button按鈕列表。

(5)為了實(shí)現(xiàn)每次玩游戲的時候,地雷分布不一致,我們在Button列表生成后。隨機(jī)抽取出某些Button按鈕作為地雷分布點(diǎn),并記錄該Button的雷區(qū)屬性為含有地雷。

(6)算法中的關(guān)鍵:遞歸算法計(jì)算雷區(qū)。當(dāng)點(diǎn)擊某個方格的時候,如果該方格是雷區(qū),則直接Game Over,如果不是的話,則我們需要一個算法去計(jì)算旁邊區(qū)域的地雷數(shù)量,以及旁邊區(qū)域沒有地雷的區(qū)域,當(dāng)沒有地雷的區(qū)域連成一片的時候,我們需要使用遞歸算法,去查找二維數(shù)組,找到對應(yīng)的連片非雷區(qū),將之打開。

(7)如何設(shè)置方格的狀態(tài):當(dāng)鼠標(biāo)左鍵點(diǎn)擊的方塊區(qū)域非雷區(qū)的時候,我們將Button按鈕的屬性設(shè)置為Disabled即可呈現(xiàn)打開的狀態(tài)。當(dāng)鼠標(biāo)左鍵打開的方格是雷區(qū)時候,此時我們可以將所有地雷區(qū)域塊的Button的背景圖設(shè)置為地雷圖片,并播放相應(yīng)的爆炸音效,彈出游戲終止界面即可。當(dāng)鼠標(biāo)右鍵標(biāo)記雷區(qū)或者待確定區(qū)域的時候,只需要更改Button的背景圖即可。當(dāng)然上述所有點(diǎn)擊操作,都得判斷Button方格區(qū)域當(dāng)前的狀態(tài)值:初始化狀態(tài)、已標(biāo)記為待確定狀態(tài)、已標(biāo)記為雷區(qū)。

游戲的最終效果圖如下:

我們下面來剖析下幾個關(guān)鍵點(diǎn),因?yàn)榇a量比較多,我就不全部詳細(xì)剖析了。

首先我們定義一個LeiButton類,這個類繼承于系統(tǒng)控件Button,增加x,y,youlei三個字段,x表示二維數(shù)組的第一個索引,y表示二維數(shù)組的第二個索引值,youlei用于標(biāo)記Button方塊區(qū)域按鈕的狀態(tài)(0表示無雷,1表示有雷)。同時我們使用Button按鈕類自帶的一個Tag屬性標(biāo)記該方塊區(qū)域是否被翻開。

具體定義如下:

然后我們在窗體對象Form類中定義一些常用的變量之類,如下圖,都有相應(yīng)注釋

下面我們來看下生成Button的二維數(shù)組,即生成雷區(qū)的Button列表。我們需要在Form中添加GroupBox組件,然后將動態(tài)生成的Button列表添加到這個groupbox組件中。生成Button的二維數(shù)組方法體如下:

生成完Button列表后,我們就開始部署地雷了,地雷隨機(jī)部署到Button列表中,部署地雷的方法如下:

到了這一步,我們就應(yīng)該將雷區(qū)的界面渲染出來了,這時候我們可以將上面兩個方法放入窗體的Form_Load事件中即可渲染出游戲界面。如下所示

我們繼續(xù),下面寫掃雷的算法,當(dāng)鼠標(biāo)左鍵點(diǎn)開某個方格的時候,如果該方格不是雷區(qū),那我們需要計(jì)算該方格周邊的地雷數(shù)量,計(jì)算方法如下:

下面是個遞歸計(jì)算的核心算法,非常關(guān)鍵。當(dāng)我們點(diǎn)開的方格非雷區(qū)的時候,周邊連片的非雷區(qū)的方格塊會被打開。這一塊的核心算法參考下列代碼,row表示行,col表示列

下面我們來添加鼠標(biāo)的點(diǎn)擊事件,我這邊采用的是bt_MouseUp事件來處理。點(diǎn)擊后,我們首先判斷游戲是否結(jié)束,如果沒結(jié)束,則進(jìn)行下列操作,獲取到被點(diǎn)擊的按鈕的x,y值以及點(diǎn)擊事件按下的鍵值(判斷按下的是鼠標(biāo)左鍵還是右鍵)。x,y值獲取到了,我們就可以到Button二維數(shù)組中找到對應(yīng)元素。

假如點(diǎn)擊的是鼠標(biāo)左鍵,則我們進(jìn)行掃雷操作,具體的代碼如下:

如果按下的是鼠標(biāo)右鍵,則是標(biāo)記方塊是雷區(qū)或者待確定區(qū)域,具體代碼如下:

最后再給出一個判斷是否掃雷完畢的方法。

掃雷游戲的設(shè)計(jì)大概到此結(jié)束,中間還有很多可以優(yōu)化的地方,比如將掃雷的邏輯代碼抽離Form類獨(dú)立出來等,這些都靠讀者自行去優(yōu)化了。

附上博主源碼下載的百度云鏈接,需要代碼學(xué)習(xí)的可自行下載研究:本地下載

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C#面向?qū)ο缶幊袒A(chǔ)概念匯總

    C#面向?qū)ο缶幊袒A(chǔ)概念匯總

    今天小編就為大家分享一篇關(guān)于C#面向?qū)ο缶幊袒A(chǔ)概念匯總的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#使用Socket實(shí)現(xiàn)通信的方法示例

    C#使用Socket實(shí)現(xiàn)通信的方法示例

    這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)通信的方法示例,文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫,給出方法、參數(shù)的詳細(xì)信息,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • C# 以MDF文件鏈接數(shù)據(jù)庫的示例代碼

    C# 以MDF文件鏈接數(shù)據(jù)庫的示例代碼

    本篇文章主要介紹了C# 以MDF文件鏈接數(shù)據(jù)庫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • c#自帶緩存使用方法 c#移除清理緩存

    c#自帶緩存使用方法 c#移除清理緩存

    這篇文章主要介紹了c#自帶緩存使用方法,包括獲取數(shù)據(jù)緩存、設(shè)置數(shù)據(jù)緩存、移除指定數(shù)據(jù)緩存等方法,需要的朋友可以參考下
    2014-02-02
  • c#獲取兩個特定字符之間的內(nèi)容并輸出的方法

    c#獲取兩個特定字符之間的內(nèi)容并輸出的方法

    今天小編就為大家分享一篇c#獲取兩個特定字符之間的內(nèi)容并輸出的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法

    .net后臺獲取html控件值的2種方法,需要的朋友可以參考一下
    2013-04-04
  • c# Struct的一些問題分析

    c# Struct的一些問題分析

    在 C# 中,結(jié)構(gòu)體是值類型數(shù)據(jù)結(jié)構(gòu)。它使得一個單一變量可以存儲各種數(shù)據(jù)類型的相關(guān)數(shù)據(jù)。struct 關(guān)鍵字用于創(chuàng)建結(jié)構(gòu)體。結(jié)構(gòu)體是用來代表一個記錄。
    2021-06-06
  • c# 實(shí)現(xiàn)控件(ocx)中的事件詳解

    c# 實(shí)現(xiàn)控件(ocx)中的事件詳解

    這篇文章主要介紹了c# 實(shí)現(xiàn)控件(ocx)中的事件詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#中winform使用相對路徑讀取文件的方法

    C#中winform使用相對路徑讀取文件的方法

    這篇文章主要介紹了C#中winform使用相對路徑讀取文件的方法,實(shí)例分析了C#使用相對路徑讀取文件的技巧與實(shí)際應(yīng)用,需要的朋友可以參考下
    2015-01-01
  • C#面向?qū)ο蟮?3種設(shè)計(jì)模式介紹

    C#面向?qū)ο蟮?3種設(shè)計(jì)模式介紹

    這篇文章介紹了C#面向?qū)ο蟮?3種設(shè)計(jì)模式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評論

徐水县| 改则县| 定日县| 洪湖市| 永福县| 河南省| 宽城| 乐都县| 民丰县| 安塞县| 萨嘎县| 天气| 玉环县| 观塘区| 桂平市| 台前县| 玉龙| 龙岩市| 无极县| 河津市| 绥中县| 通榆县| 徐水县| 双江| 双牌县| 崇文区| 小金县| 青州市| 新疆| 卢龙县| 廉江市| 华阴市| 庆云县| 姚安县| 贵溪市| 建德市| 阜宁县| 得荣县| 文安县| 遂宁市| 高唐县|