当前位置:文档之家› 《面向对象程序设计》大作业

《面向对象程序设计》大作业

《面向对象程序设计》大作业项目名称基于C#的一款扫雷游戏班级7B1551组员李豪雄曹启李宁一、开发环境开发环境:vs2010开发语言:C#二、系统功能设计1.创建项目功能实现创建项目,找图片素材2.界面设计介绍关于扫雷游戏界面的设计提出希望在对应级别(初级、中级、高级、自定义)的按钮的显示勾,以表示目前的游戏等级。

3.雷区绘制界面中雷区的绘制方法4.菜单操作有两个时候需要对它进行操作,一个是加载上次游戏设置的时候,一个是在游戏过程中进行设置的时候,设计菜单中的相关方法5.内部实现内部埋雷,放雷,标旗子,标问号的方法6.整体完善写游戏的胜利条件,自定义游戏的初始化及相关调试任务三、实现1、创建项目功能实现玩过扫雷的读者应该知道,扫雷需要用到三种图片素材——地雷、红旗、问号。

当右击一个方块的时候,会插上红旗,表示游戏者认为该方块内有地雷;再次右击该方块,会变成问号,表示不确定该方块内是否有地雷;第三次右击该方块,问号消失,恢复到初始的状态。

我们前往Iconfinder寻找合适的图标,并且通过Photoshop或者Illustrator的处理得到我们所需要的图标。

文章中含有下载地址的图标资源可以使用右键—目标另存为进行下载。

通过一定的搜索以及图片的处理,得到了下面一组素材图标,下载地址:Doubbt、Flag、Mine。

除了这些素材以外,我们还需要找一个图标,使得整个程序看上去更加正式一点,这里使用图标如下,注意程序图标的后缀为ico,下载地址:favicon接下来,我们打开Visual Studio 2013开始创建工程,界面如下:创建好的项目如下图所示。

我们需要对这个窗口的几项属性进行修改,首先通过Text属性将它的标题修改为“Minesweeper”;通过FormBorderStyle属性将它的大小设置为“FixedSingle”,即为不可调节窗口大小;通过MaximizeBox属性将它的最大化按钮设置为“False”,即最大化按钮失效;通过Name属性将它的名称修改为“Form_Main”,修改这个属性主要用于后面书写代码的方便;通过BackColor属性将它的背景修改为“White”。

如下图所示:我们可以顺便修改一下这个窗口的代码文件的名称。

在右上方找到解决方案资源管理器,右击Form_1.cs—重命名—Form_Main.cs,程序会自动将下面包含的文件名也都改成一致的名称。

如图所示:接下来我们需要修改一下程序的图标,将刚才下载的favicon文件放到Minesweeper/Minesweeper文件夹下,同时将三个图标资源放到Minesweeper/Minesweeper/Resources文件夹下(Resources文件夹需要自己新建),如下图所示:在属性栏中找到Icon属性,并且定位到favicon.ico文件,如下图所示:此时,我们按下快捷键Ctrl + S对整个工程进行保存,并且按下快捷键Ctrl + F5运行查看我们的程序,效果如下:2、界面设计这一节我们主要介绍关于扫雷游戏界面的设计,此处我们借鉴经典扫雷界面的设计方法,首先需要创建一个菜单栏。

具体方法在左边找到工具箱窗口,展开其中的菜单和工具栏,找到MenuStrip选项,如图所示:只需要双击该条目就可以在窗口中新建一个菜单栏,如图所示:对于这个控件(我们习惯上将窗口中的东西称作为控件),我们还是需要修改它的一些属性,对于个人习惯而言,我习惯于修改它的Name属性,这样编程的时候不至于将很多控件混淆。

我们将它的Name属性修改为“MenuStrip_Main”。

单击“请在此键入”,输入“Game(&G)”,其中&G整体会显示成G这个字母下面加一个下划线,这样在用户使用的时候就可以通过按下字母G来访问这个按键了。

(当然,顶层菜单还需要按下Alt键,例如Alt + G键。

)输入以后的界面如图所示:使用同样的方法,创建如下图所示的一个菜单栏:注意到,图中的分割线,只需要输入一个减号,即“–”,再按下回车键即可得到。

我们一次介绍一下各个选项的功能,以便读者对它们有一个基本的了解。

菜单一共有两组,一个为游戏(Game),一个为帮助(Help):其中游戏菜单下分别包含了新游戏(New Game)、初级(Beginner)、中级(Intermediate)、高级(Expert)、设置(Setting)、标记(Mark)、音效(Audio)、排行榜(Rank)、退出(Exit);而帮助菜单下仅包含关于(About)。

其中新游戏用来开始一场新的游戏;初级、中级、高级,用于选择不同的游戏难度;设置用于自定义扫雷区域的大小以及地雷的数目;标记用于设置是否启用红旗、问号这一类的标记;音效用于设置是否启用音效;排行榜用于对游戏时间进行排名(仅记录初级、中级、高级的结果,对于自定义游戏的结果不进行记录);退出用于退出游戏。

最后,关于用来显示游戏的一些关于信息。

对于初级、中级、高级、标记、音效这几个菜单,我们需要在它的前面显示它的状态,即是否被选中,如果选中了就会在它的前面出现一个勾,如果没有选中,则没有,这是我们以后需要实现的功能,在此先进行说明。

至此,我们的菜单栏就制作完成了。

接下来我们需要制作一个用来记录地雷数目以及用时的功能。

我们选择工具箱中容器的TableLayoutPanel,双击该项目,会在窗口中创建一个TableLayoutPanel控件。

同样我们先将它的Name属性修改为“TableLayoutPanel_Main”。

展开它的Size属性,将Height属性修改为48。

同时修改它的Dock属性,选择Bottom,如图所示:我们会发现它会自动吸附在底部,如果改成别的参数则会吸附在别的位置,这里我们设置为Bottom。

同时将RowCount属性设置为1,ColumnCount属性设置为9。

打开Columns属性对话框,按照下图进行修改:这里进行一些解释,其中Column1、Column3、Column5、Column7、Column9为中心对称的,用来设置边距,不放置任何控件,纯粹为了排版需要。

接下来我们需要在Column2、Column8中分别放置地雷(Mine_Show.png)以及秒表(Timer.png)的图标,表示剩余的地雷数目以及已用时长。

而Columns4、Columns6中分别放置用于显示地雷数目以及已用时长的文本。

下载地址:地雷、秒表。

在工具箱中展开公共控件,找到PictureBox,将它拖动到TableLayoutPanel 的第二个列中,同时将它的Name属性设置为“PictureBox_Mine”,Dock 属性设置为Fill(表示充满整个页面,此处的页面即TableLayoutPanel中Column2全部),BackgroundImage属性定位到Mine_Show.png文件(通过导入按钮),BackgroundImageLayout属性设置为Stretch(表示自动缩放图像大小)。

使用同样的方法加入一个PictureBox控件,将它放到Column8中,同时将Name属性设置为“PictureBox_Timer”,BackgroundImage属性定位到Timer.png文件,其余与PictureBox_Mine设置相同。

其中图片导入的方法如下图所示:接下来我们需要添加两个用于显示内容的Label控件,展开工具箱中的公共控件,找到Label控件,分别拖动到Column4和Column6,并且将Dock属性设置为Fill,TextAlign属性设置为MiddleCenter(使文字显示在控件中心),Font属性设置为“Consolas, 16.2pt”(即Consolas字体,字号三号)。

其Name属性及Text属性分别修改为“Label_Mine”和“Label_Timer”。

同时将它们的ForeColor属性分别设置为“DarkRed”和“HotTrack”(这项属性用于设置文字显示的颜色)。

至此界面已经基本完成了,但是我们还需要增加一个控件——Timer,用来计时。

展开工具箱中的组件,双击Timer。

这个控件不会在界面上显示,但是会在后台进行计时功能。

同样,我们将它的Name属性修改为“Timer_Main”,Interval属性修改为“1000”(这里为计时间隔,以毫秒为单位,此处为1000毫秒,即1秒计时一次)。

最后按下Ctrl + F5进行编译查看结果,相较于第一节中的界面已经有了很大的改观,如图所示:到这里或许读者会问,最为重要的扫雷区域怎么制作呢,关于这个区域,我们将会使用程序来生成,而不是使用控件。

我们将会在下一节中进行讲解。

3、雷区绘制这一节我们主要涉及界面中雷区的绘制方法。

首先来考虑几个问题。

为了保存整个雷区的信息,我们需要哪些数据。

显然,除了要保存雷区的宽度和高度(分别定义为宽和高方向上方块的个数)外,还需要保存地雷的数目。

这样我们需要用到三个变量nWidth, nHeight, nMineCnt分别保存雷区的宽度、雷区的高度以及地雷的数目。

右击窗口,选择查看代码,也可以使用快捷键F7,如下图所示:可以看到这样的代码界面:在图示位置添加下图所示的代码,用来定义扫雷区域的基本变量,它们的含义在上文或者注释中都有提及:为了方便设置这三个参数,我们可以定义一个新的函数SetGame,如下图所示:这样,我们就可以通过调用SetGame函数来设置游戏的参数了。

为了方便阅读,我们可以为这个函数加上一个注释,在函数名上方输入”///“,程序会自动生成一个注释块,如下图所示:输入相关信息,第二行的内容是用来对函数的作用进行说明,下面的三行分别用来对三个参数的作用进行说明,将它们修改如下:这样当我们输入这个函数的时候(当然,我们目前还不需要调用这个函数。

),就会显示出来对应的注释,如下图所示:到目前为止,我们的代码应该是这样的:接下来我们可以定义几个辅助函数,分别表示设置游戏参数为初级、中级、高级,如下图所示:在我们开始游戏的时候,我们希望它自动获取上次的游戏设置,如果这是第一次开始游戏,那么将游戏设置为初级。

我们先来看一下第一个需求,自动获取上次的游戏设置,这就意味着我们需要在上次游戏关闭的时候将上次的游戏设置保存下来。

保存到哪里呢,我们在这里采用Setting文件来保存这些数据。

工程创建的时候,系统会自动生成一个Setting文件。

因此我们不需要自己创建,只需要使用原有的Setting 文件即可。

在右方解决方案资源管理器面板中展开Properties,右击Settings.settings,选择打开即可。

打开后的界面如图所示:按照下图对它进行设置,设置完成后按Ctrl + S进行保存。

相关主题