利用C進(jìn)行的Windows開發(fā)掃雷小游戲_第1頁
利用C進(jìn)行的Windows開發(fā)掃雷小游戲_第2頁
利用C進(jìn)行的Windows開發(fā)掃雷小游戲_第3頁
利用C進(jìn)行的Windows開發(fā)掃雷小游戲_第4頁
利用C進(jìn)行的Windows開發(fā)掃雷小游戲_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余7頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、簡(jiǎn)單的總結(jié)一下,如何利用C#進(jìn)行WinForm掃雷小游戲的開發(fā):掃雷游戲的主要設(shè)計(jì)的類有三個(gè):Main、Pane、MineField1) Main是主控窗體,負(fù)責(zé)項(xiàng)目的啟動(dòng)和關(guān)閉;并協(xié)調(diào)內(nèi)部各個(gè)組建模塊的協(xié)調(diào)工作。2) Pane是一個(gè)方格的封裝,是雷區(qū)的重要組建;它表示一個(gè)方格的當(dāng)前狀態(tài),以及是否布雷等信息。3) MineField是雷區(qū)的封裝,是游戲的核心組建;它負(fù)責(zé)方格的布局以及地雷的分布;并控制玩家的基本操作以及正確的響應(yīng)。類的實(shí)現(xiàn):一、Pane類功能描述:Pane是一個(gè)方格的封裝,是雷區(qū)的重要組建;它表示一個(gè)方格的當(dāng)前狀態(tài),以及是否布雷等信息One.它所具有的公共屬性:名稱可見性返回值

2、類型功能描述AroundMineCountpublicint獲取或設(shè)置當(dāng)前方塊周圍地雷的數(shù)量HasMinePublicbool獲取或設(shè)置當(dāng)前方塊是否又雷StatePublicPaneState獲取或設(shè)當(dāng)前方塊掃雷的狀態(tài)Two.它所具有的公共方法:名稱可見性返回類型參數(shù)功能描述Markpublicvoid無把當(dāng)前方塊標(biāo)記為【有雷】狀態(tài),即:插上一個(gè)小紅旗。Openpublicvoid無打開該方塊。打開后如果如果有雷,則顯示地理圖標(biāo);否則如果周圍有相鄰的地理,則顯示地雷數(shù)量。Resetpublicvoid無恢復(fù)關(guān)閉狀態(tài),即:取消Mark()的操作結(jié)果。Three:源碼:默認(rèn)的構(gòu)造方法publicP

3、ane()InitializeComponent();this.BackgroundImageLayout=ImageLayout.Stretch;公有屬性:PublicboolHasMineget;set;PublicintAroundMineCountget;set;PublicPaneStateStateget;set;由于它有幾種狀態(tài),設(shè)置一個(gè)枚舉類型屬性publicenumPaneStateClosed,關(guān)閉狀態(tài)Opened,打開狀態(tài)Marked,標(biāo)記狀態(tài))共有方法:publicvoidMark()/標(biāo)記當(dāng)前方格為又雷狀態(tài),插個(gè)小紅旗(this.BackgroundImage=Pro

4、perties.Resources.Marked;this.State=PaneState.Marked;)publicvoidReset()恢復(fù)標(biāo)記狀態(tài),取消小紅旗標(biāo)記(this.BackgroundImage=null;this.State=PaneState.Closed;)打開方法 打開后如果如果有雷, 則顯示地理圖標(biāo); 否則如果周圍有相鄰的地理, 則顯示地雷數(shù)量。publicvoidOpen()(if(this.HasMine)(this.BackgroundImage=Properties.Resources.MineBomp;this.Enabled=false;)else(sw

5、itch(this.AroundMineCount)(case0:this.BackgroundImage=null;this.Enabled=false;break;case 1:this.BackgroundImage=Properties.Resources.Num1;this.Enabled=false;break;case 2:this.BackgroundImage=Properties.Resources.Num2;this.Enabled=false;break;case 3:this.BackgroundImage=Properties.Resources.Num3;this

6、.Enabled=false;break;case 4:this.Backgroundlmage=Properties.Resources.Num4;this.Enabled=false;break;case 5:this.BackgroundImage=Properties.Resources.Num5;this.Enabled=false;break;case 6:this.BackgroundImage=Properties.Resources.Num6;this.Enabled=false;break;case 7:this.BackgroundImage=Properties.Res

7、ources.Num7;this.Enabled=false;break;case 8:this.BackgroundImage=Properties.Resources.Num8;this.Enabled=false;break;、MineField類功能描述:CrlMineField是雷區(qū)的封裝,是游戲的核心組建;它負(fù)責(zé)方格的布局以及地雷的分布;并控制玩家的基本操作以及正確的響應(yīng)。One.它所具有的公有方法名稱可見性返回值類型參爹功能描述InitMineFieldPublicVoidintpaneNumber,intmineNumber初始化雷區(qū)。 布局方格并隨機(jī)分布地理。DisplayA

8、llPublicVoid無明示雷區(qū)的全部方塊里的內(nèi)容。當(dāng)踩雷以后,給玩家顯示所有地雷位置。DisplayAroundPubicVoidPanepane明示與給定方格相關(guān)聯(lián)的無地雷的方格。 玩家點(diǎn)擊一個(gè)無雷方格后使用。Two.它有具有的私有方法名稱可見性返回值類型參數(shù)功能描述GetPanesAroundPrivateListPanepane獲取與當(dāng)前方格相鄰的所有方格。GetMineCountAroundPrivateintPanepane獲取周圍地雷的總數(shù)量GetPaneSizePrivateSize無獲取每個(gè)小方格的大小用 C 觸彳 fWinform 掃雷游戲的開發(fā)小結(jié)10 工程 W 丁小未

9、 10141303LayoutPanesPrivateVoid無排列有所方格, 完成布雷LayMinesPrivateVoidintmineNumber隨機(jī)布雷IsAllMineSweepedPrivateBool無判斷是否掃雷成功Three.事件處理名稱可見性返回值類型參數(shù)功能描述MineField_SizeChangedPrivateVoidobjectsender,EventArgse如果雷區(qū)面板尺寸有變化,則重新進(jìn)行布局。OnPaneMouseDownPrivateVoidobjectsender,EventArgse僅處理鼠標(biāo)左鍵和右鍵事件,忽略其他按鍵。Four.源碼/事件的委托p

10、ublicdelegatevoidMineSweepingCompletedEventHandler(objectsender,EventArgse);publicdelegatevoidMineSweepingFailedEventHandler(objectsender,EventArgse);publicpartialclassCrlMineField:UserControl成功和失敗兩個(gè)委托事件的申明publiceventMineSweepingCompletedEventHandlerMineSweepingCompleted;publiceventMineSweepingFaile

11、dEventHandlerMineSweepingFailed;publicCrlMineField()InitializeComponent();/初始化雷區(qū)/每排方塊的數(shù)量/地雷的數(shù)量publicvoidInitMineField(intpaneNumber,intmineNumber)if(mineNumber=paneNumber*paneNumber)thrownewApplicationException(地雷太多了,不合法游戲規(guī)則。);/清空現(xiàn)有的所有方塊if(this.Controls.Count0)(this.Controls.Clear();/添加雷區(qū)方格for(inti=

12、0;ipaneNumber*paneNumber;i+)(Panepane=newPane();pane.MouseDown+=newMouseEventHandler(OnPaneMouseDown);this.Controls.Add(pane);/布局方格this.LayoutPanes();/隨機(jī)部署地雷this.LayMines(mineNumber);/設(shè)置每個(gè)方格周邊的地雷數(shù)foreach(Panepinthis.Controls)(p.AroundMineCount=this.GetMineCountAround(p);/明示雷區(qū)的全部方塊里的內(nèi)容/publicvoidDisp

13、layAll()(foreach(Panepaneinthis.Controls)(if(pane.State!=PaneState.Opened)(pane.Open();/明示與給定方格相關(guān)聯(lián)的無地雷的方格/publicvoidDisplayAround(Panepane)(if(pane.State=PaneState.Opened|pane.HasMine)(return;/明示當(dāng)前方格本身pane.Open();/通過遞歸明示當(dāng)前方格四周的所有方格ListpanesAround=this.GetPanesAround(pane);foreach(PanepinpanesAround)

14、(/如果該方格四周沒有相鄰的地雷,則遞歸if(this.GetMineCountAround(p)=0)(this.DisplayAround(p);else(if(p.State!=PaneState.Opened&!p.HasMine)(p.Open();#region私有方法/獲取與當(dāng)前方格相鄰的所有方格。/當(dāng)前方格/privateListGetPanesAround(Panepane)(Listresult=newList();/通過遞歸明示當(dāng)前方格四周的所有方格intpaneHeight=this.GetPaneSize().Height;intpaneWidth=this.GetP

15、aneSize().Width;foreach(Panepinthis.Controls)(逐個(gè)掃描當(dāng)前方格四周地雷數(shù)目if(Math.Abs(p.Top-pane.Top)=0&Math.Abs(p.Left-pane.Left)=paneWidth|Math.Abs(p.Left-pane.Left)=0&Math.Abs(p.Top-pane.Top)=paneHeight|Math.Abs(p.Top-pane.Top)=paneHeight&Math.Abs(p.Left-pane.Left)=paneWidth|Math.Abs(p.Left-pane.Left)=paneWidt

16、h&Math.Abs(p.Top-pane.Top)=paneHeight)(result.Add(p);returnresult;/獲取當(dāng)前方格四周地雷數(shù)量/當(dāng)前方格/privateintGetMineCountAround(Panepane)(intresult=0;Listpanes=this.GetPanesAround(pane);foreach(Panepinpanes)(if(p.HasMine)(result+;returnresult;/獲取當(dāng)前每個(gè)方格的尺寸/privateSizeGetPaneSize()(if(this.Controls.Count=0)(returnn

17、ewSize();)else(intpaneNumber=(int)Math.Sqrt(this.Controls.Count);intpaneWidth=this.Width/paneNumber;intpaneHeight=this.Height/paneNumber;returnnewSize(paneWidth,paneHeight);)/排列所有雷區(qū)的方格,完成布局。/privatevoidLayoutPanes()(if(this.Controls.Count=0)(return;)intpaneNumber=(int)Math.Sqrt(this.Controls.Count);

18、intpaneHeight=this.GetPaneSize().Height;intpaneWidth=this.GetPaneSize().Width;intpaneIndex=0;/繪制雷區(qū)方塊intpaneLeft=0;intpaneTop=0;for(intcolNum=0;colNumpaneNumber;colNum+)(paneTop=colNum*paneHeight;for(introwNum=0;rowNumpaneNumber;rowNum+)(paneLeft=rowNum*paneWidth;Panepane=this.ControlspaneIndexasPane

19、;pane.Location=newPoint(paneLeft,paneTop);/設(shè)置方塊位置pane.Size=newSize(paneWidth,paneHeight);/設(shè)置方塊大小paneIndex+;)用 C 觸彳 fWinform 掃雷游戲的開發(fā)小結(jié)10 工程 W 丁小未 10141303)/隨機(jī)部署地雷/privatevoidLayMines(intmineNumber)Randomrdm=newRandom();for(inti=0;imineNumber;i+)while(true)intindex=rdm.Next(0,this.Controls.Count);Pane

20、pane=this.ControlsindexasPane;if(!pane.HasMine)pane.HasMine=true;break;)/是否掃雷成功。即:所有地雷都已經(jīng)正確作出標(biāo)記/privateboolIsAllMineSweeped()intmarkedCount=0;intmineCount=0;foreach(Panepaneinthis.Controls)if(pane.HasMine)mineCount+;)if(pane.State=PaneState.Marked)markedCount+;if(!pane.HasMine)存在做了標(biāo)記但沒有地雷的方格,掃雷沒有正確完

21、成。returnfalse;)returnmineCount=markedCount;)#endregion#region事件處理/如果雷區(qū)面板尺寸有變化,則重新進(jìn)行布局。/使得通過改變方格大小來整體適應(yīng)雷區(qū)面板的尺寸。/privatevoidCrlMineField_SizeChanged(objectsender,EventArgse)trythis.LayoutPanes();)catch(Exceptionex)ExceptionHandler.OnException(ex);)privatevoidOnPaneMouseDown(objectsender,MouseEventArgse)/僅處理鼠標(biāo)左鍵和右鍵事件,忽略其他按鍵。if(e.Button!=MouseButtons.Left&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論