时间过得很快啊,研三的都毕业离校了,实验室有一个硬件演示系统的上位机部分需要我继承下来,由于是用C#编写的,所以最近看了一下这方面的内容。光看不练效果自然不好,在六维上找来一个C#开发扫雷游戏的视频,边看编写,虽然视频有些部分没有讲到,但还是学到不少东西,也通过自己的理解对视频给出的部分算法还有界面做了改变。文章最后会附上源码,正文里会对改进的部分做一下分析。
1、面向对象设计与分析
一个扫雷游戏界面,以一个主窗体(Form)呈现在玩家面前,窗体中包含几个控制按钮、难度设置下拉菜单、计时器,最核心的部分还是扫雷的区域,这部分我们可以把它抽象成两个对象,每个对象对应一个类,一个是雷区(minefiled),另一个是布满雷区的方格(pane),这样就形成三个级别的对象:pane、minefield、Form,每一级对象都有自己的方法,并且相邻级别的对象通过调用这些方法来完成不同类之间的通信。
1.1 基本单元方格pane
pane继承自button,当点击某个pane时,该pane会调用Mark(),Open(),或者Reset()来改变自身的状态,如果该pane有雷(HasMine==true),则游戏结束,否则显示数字AroundMineCount。
1.2 雷区minefield
雷区继承自用户控件。
初始化雷区包括四个步骤:1、产生指定数目的pane,并添加鼠标点击事件;2、由于步骤1中生成的pane是重叠在一起的,需要对他们在雷区中重新布局;3、随机埋雷;4、计算每个pane周围有雷方格的数量。
DisPlayall()方法是在游戏结束,或者玩家需要帮助的时候调用的,它将打开所有方格(有雷显示雷,无雷显示数字AroundMineCount)。
DisplayAround()方法是在玩家点击某个方格pane后,为了降低游戏难度,会显示该方格周围方格的情况,