版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单的总结一下,如何利用C#进行WinForm扫雷小游戏的开发:扫雷游戏的主要设计的类有三个:Main、Pane、MineField1) Main是主控窗体,负责项目的启动和关闭;并协调内部各个组建模块的协调工作。2) Pane是一个方格的封装,是雷区的重要组建;它表示一个方格的当前状态,以及是否布雷等信息。3) MineField是雷区的封装,是游戏的核心组建;它负责方格的布局以及地雷的分布;并控制玩家的基本操作以及正确的响应。类的实现:一、Pane类功能描述:Pane是一个方格的封装,是雷区的重要组建;它表示一个方格的当前状态,以及是否布雷等信息One.它所具有的公共属性:名称可见性返回值
2、类型功能描述AroundMineCountpublicint获取或设置当前方块周围地雷的数量HasMinePublicbool获取或设置当前方块是否又雷StatePublicPaneState获取或设当前方块扫雷的状态Two.它所具有的公共方法:名称可见性返回类型参数功能描述Markpublicvoid无把当前方块标记为【有雷】状态,即:插上一个小红旗。Openpublicvoid无打开该方块。打开后如果如果有雷,则显示地理图标;否则如果周围有相邻的地理,则显示地雷数量。Resetpublicvoid无恢复关闭状态,即:取消Mark()的操作结果。Three:源码:默认的构造方法publicP
3、ane()InitializeComponent();this.BackgroundImageLayout=ImageLayout.Stretch;公有属性:PublicboolHasMineget;set;PublicintAroundMineCountget;set;PublicPaneStateStateget;set;由于它有几种状态,设置一个枚举类型属性publicenumPaneStateClosed,关闭状态Opened,打开状态Marked,标记状态)共有方法:publicvoidMark()/标记当前方格为又雷状态,插个小红旗(this.BackgroundImage=Pro
4、perties.Resources.Marked;this.State=PaneState.Marked;)publicvoidReset()恢复标记状态,取消小红旗标记(this.BackgroundImage=null;this.State=PaneState.Closed;)打开方法 打开后如果如果有雷, 则显示地理图标; 否则如果周围有相邻的地理, 则显示地雷数量。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是雷区的封装,是游戏的核心组建;它负责方格的布局以及地雷的分布;并控制玩家的基本操作以及正确的响应。One.它所具有的公有方法名称可见性返回值类型参爹功能描述InitMineFieldPublicVoidintpaneNumber,intmineNumber初始化雷区。 布局方格并随机分布地理。DisplayA
8、llPublicVoid无明示雷区的全部方块里的内容。当踩雷以后,给玩家显示所有地雷位置。DisplayAroundPubicVoidPanepane明示与给定方格相关联的无地雷的方格。 玩家点击一个无雷方格后使用。Two.它有具有的私有方法名称可见性返回值类型参数功能描述GetPanesAroundPrivateListPanepane获取与当前方格相邻的所有方格。GetMineCountAroundPrivateintPanepane获取周围地雷的总数量GetPaneSizePrivateSize无获取每个小方格的大小用 C 触彳 fWinform 扫雷游戏的开发小结10 工程 W 丁小未
9、 10141303LayoutPanesPrivateVoid无排列有所方格, 完成布雷LayMinesPrivateVoidintmineNumber随机布雷IsAllMineSweepedPrivateBool无判断是否扫雷成功Three.事件处理名称可见性返回值类型参数功能描述MineField_SizeChangedPrivateVoidobjectsender,EventArgse如果雷区面板尺寸有变化,则重新进行布局。OnPaneMouseDownPrivateVoidobjectsender,EventArgse仅处理鼠标左键和右键事件,忽略其他按键。Four.源码/事件的委托p
10、ublicdelegatevoidMineSweepingCompletedEventHandler(objectsender,EventArgse);publicdelegatevoidMineSweepingFailedEventHandler(objectsender,EventArgse);publicpartialclassCrlMineField:UserControl成功和失败两个委托事件的申明publiceventMineSweepingCompletedEventHandlerMineSweepingCompleted;publiceventMineSweepingFaile
11、dEventHandlerMineSweepingFailed;publicCrlMineField()InitializeComponent();/初始化雷区/每排方块的数量/地雷的数量publicvoidInitMineField(intpaneNumber,intmineNumber)if(mineNumber=paneNumber*paneNumber)thrownewApplicationException(地雷太多了,不合法游戏规则。);/清空现有的所有方块if(this.Controls.Count0)(this.Controls.Clear();/添加雷区方格for(inti=
12、0;ipaneNumber*paneNumber;i+)(Panepane=newPane();pane.MouseDown+=newMouseEventHandler(OnPaneMouseDown);this.Controls.Add(pane);/布局方格this.LayoutPanes();/随机部署地雷this.LayMines(mineNumber);/设置每个方格周边的地雷数foreach(Panepinthis.Controls)(p.AroundMineCount=this.GetMineCountAround(p);/明示雷区的全部方块里的内容/publicvoidDisp
13、layAll()(foreach(Panepaneinthis.Controls)(if(pane.State!=PaneState.Opened)(pane.Open();/明示与给定方格相关联的无地雷的方格/publicvoidDisplayAround(Panepane)(if(pane.State=PaneState.Opened|pane.HasMine)(return;/明示当前方格本身pane.Open();/通过递归明示当前方格四周的所有方格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私有方法/获取与当前方格相邻的所有方格。/当前方格/privateListGetPanesAround(Panepane)(Listresult=newList();/通过递归明示当前方格四周的所有方格intpaneHeight=this.GetPaneSize().Height;intpaneWidth=this.GetP
15、aneSize().Width;foreach(Panepinthis.Controls)(逐个扫描当前方格四周地雷数目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;/获取当前方格四周地雷数量/当前方格/privateintGetMineCountAround(Panepane)(intresult=0;Listpanes=this.GetPanesAround(pane);foreach(Panepinpanes)(if(p.HasMine)(result+;returnresult;/获取当前每个方格的尺寸/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);)/排列所有雷区的方格,完成布局。/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;/绘制雷区方块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);/设置方块位置pane.Size=newSize(paneWidth,paneHeight);/设置方块大小paneIndex+;)用 C 触彳 fWinform 扫雷游戏的开发小结10 工程 W 丁小未 10141303)/随机部署地雷/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;)/是否扫雷成功。即:所有地雷都已经正确作出标记/privateboolIsAllMineSweeped()intmarkedCount=0;intmineCount=0;foreach(Panepaneinthis.Controls)if(pane.HasMine)mineCount+;)if(pane.State=PaneState.Marked)markedCount+;if(!pane.HasMine)存在做了标记但没有地雷的方格,扫雷没有正确完
21、成。returnfalse;)returnmineCount=markedCount;)#endregion#region事件处理/如果雷区面板尺寸有变化,则重新进行布局。/使得通过改变方格大小来整体适应雷区面板的尺寸。/privatevoidCrlMineField_SizeChanged(objectsender,EventArgse)trythis.LayoutPanes();)catch(Exceptionex)ExceptionHandler.OnException(ex);)privatevoidOnPaneMouseDown(objectsender,MouseEventArgse)/仅处理鼠标左键和右键事件,忽略其他按键。if(e.Button!=MouseButtons.Left&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论