详解从零开始---用C#制作扫雷游戏

2019-12-30 17:59:22王振洲

2.实现技术分析

经过分析,是不是发现扫雷的的玩法其实很简单,实现的技术也不难,全是静态的没有动画的存在。

方块的表现很像一个只能按一次的按钮(事实上,在大学的时候我就是直接继承的按钮控件)。

但这一次为了能使用到更多C#相关的东西我使用了更加麻烦的自定义控件的方式。

方块有三种表现形式,为特殊性,但很显然也具有共性,所以在设计的时候,我把按钮共性抽离出来,设计成了一个抽象的基类Cube。方块有三种类型,但因为我懒,所以把其中的两种(空白和数字)合并为了NumCube类,包含地雷的为BombCube类,这两个类分别继承了Cube。

Cube的实现:

C#制作扫雷游戏,C#,扫雷游戏,写的扫雷游戏

Cube类中拥有以下字段:

C#制作扫雷游戏,C#,扫雷游戏,写的扫雷游戏


ImageSource cubeNormalPic
ImageSource cubeOnPic
ImageSource cubeDownPic
ImageSource cubeDisablePic
ImageSource cubeFlagPic

这5个字段是用来设置Cube在各个状态所显示的图片的(普通,鼠标进入,左键按下,失能,标记)


Bool isEnable
Bool isFlag

这两个字段就是标记Cube是否被使能和Flag


Image cubeImageHigh
Image cubeImageLow

这2个是两个image控件,作用是用来显示图片,之所以要2个图片是因为旗子图片被设计为一个叠加在Cube上的图片。

下面再来重点讲下下面2个东西:


displayCube
mouseEvent

在设计中,这是两个接口,分别用来处理鼠标事件和方块的展开。不同于直接在内部直接实现接口,将两个接口设计为Cube属性是为了能动态的修改这两个接口的实现方式,不至于每次修改都需要对Cube内的代码进行修改,且可以实现每个不同的Cube都使用不同的代码而不需要使用重写,这种方式在设计模式中也叫“策略模式”。

Cube只拥有一个方法,那就是Open,但这个方法其实也是有display接口代理实现。


public void Open()   
{    
 if (displayCube != null)    
 {
  displayCube.Open(this);    
 }     
}

displayCube.Open(this)之所以要把自身传入,是因为Open方法要用到Cube自己的参数和方法。

BombCube继承自Cube

C#制作扫雷游戏,C#,扫雷游戏,写的扫雷游戏