基于C#程序设计的扫雷冲关游戏开发 毕业论文
更新时间:2024-05-09 03:38:01 阅读量: 综合文库 文档下载
金 华 职 业 技 术 学 院
J I N H U A P O L Y T E C H N I C
毕业教学环节成果
(2014届)
题 目 基于C#程序设计的扫雷冲关游戏开发 学 院 信息工程学院 专 业 计算机网络技术 班 级 网络112 学 号 姓 名 指导教师
2013年 5月 27日
金华职业技术学院毕业教学成果
目 录
摘要 ..................................................................... 1 英文摘要 ................................................................. 1 引言 ..................................................................... 2 1 软件开发的背景,目的与意义 ............................................ 3 1.1 开发背景 ............................................................ 3 1.2 目的与意义 .......................................................... 3 2 软件可行性分析 ........................................................ 4 2.1 技术可行性 ......................................................... 4 2.2 经济可行性 ......................................................... 4 2.3 社会可行性 ......................................................... 4 3 总体设计 .............................................................. 5 3.1 算法设计图 .......................................................... 5 3.2 界面设计 ............................................................ 6 4 主要模块详细设计 ...................................................... 8 4.1 功能模块介绍 ........................................................ 8 4.2雷区布置功能 ........................................................ 8 4.3随机布雷功能 ........................................................ 9 4.4鼠标单击事件功能 .................................................... 9 4.5递归扫雷功能 ....................................................... 11 4.6复原功能 ........................................................... 12 4.6 闯关功能 ........................................................... 13 5 软件功能调试 .......................................................... 15 结论与谢辞 .............................................................. 17 参考文献 ................................................................ 18 附录1:主界面程序代码 ................................................... 19 附录2:LEIBUTTTON类程序代码 ............................................ 29
基于C#程序设计的扫雷冲关游戏开发
信息工程学院网络专业 陈俊
摘要:本软件是利用Visual Studio 2010开发的仿windos自带扫雷制作的扫雷冲关小游戏。通过在winform窗体窗体来作为游戏背景界面,主要功能通过button按钮来实现游戏界面,通过鼠标左键点击或者右键点击事件来触发不同的游戏程序代码,使游戏进入下一步操作,进入下一关,直至游戏结束。通过该游戏可以使广大玩家娱乐身心,放松自己,甚至还能挑战自己。 关键字: VS2010 扫雷 闯关
Based on C # programming mine washed off
game development design
(Major of Communication Network and Equipment , Information and Engineering colle
ge, Jinhua Polytechnic, JunChen )
Abstract: This software is to use Visual Studio 2010 to develop its own mine production windos imitation of mine washed off game. By winform form to form the background as the game interface, the main function is achieved by Button button game interface by clicking the left mouse button or right-click an event to trigger different game code to make the game into the next step, to the next off until the end of the game. With this game you can make the entertainment, the majority of players, relax, and even challenge yourself. Keywords: VS2010 Minesweeper Checkpoints
1
引言
随着计算机与网络的普及,人们生活水平的提高,电脑游戏越来越成为人们生活中不可或缺的一部分,在人们繁忙的工作之余,给人带去欢乐与放松。随着电脑游戏产业的规模越来越大,开发一款成功的电脑游戏靠个人之力已非易事。不过,随着市场上开发的游戏产品越来越丰富,各种题材的游戏越来越多,创意已成为一款成功游戏的最重要的特点。例如目前流行的游戏<<植物大战僵尸>>,<<愤怒的小鸟>>,虽然都是一些很小的休闲游戏,但是因其特有的风格,使得它们都大获好评。
2
1 软件开发的背景,目的与意义 1.1 开发背景
随着电脑和网络的普及,人们越来越依赖于电脑。过去人们通过锻炼健身等户外活动来放松和娱乐自己;现在人们更多的是在闲暇时通过玩一盘或几盘轻松娱乐的益智小游戏;来达到放松娱乐的目的。这也是扫雷,连连看,祖玛等游戏火热至今的原因之一。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然是该系统装机必备的软件,可见这款小游戏受到越来越多人的喜爱。
扫雷作为一款windows平台上最为普及的游戏,玩过的人不计其数,对大部分人来说,扫雷游戏不再具有吸引力。可是扫雷闯关版,却是一款全新的游戏。由于其闯关功能实现,为扫雷增添了新的趣味,再次丰富了游戏的可玩性。 1.2 目的与意义
随着现在生活节奏的加快,人们在工作之余需要一个轻松娱乐的放松环境。因此我编写此软件的目的,一方面作为对我大学三年的学习成果的一次检验,另一方面开发此软件使用户能在娱乐休闲的同时拓展思维能力。同时进一步拓展研究,做到将扫雷层次升级,能够在原有扫雷基础上,增加趣味性,增加新的玩点,新的亮点,比如闯关类扫雷。
3
2 软件可行性分析 2.1 技术可行性
利用VS2010开发的仿windos自带扫雷开发的冲关扫雷,其中大量运用了循环技术,界面主要是使用了button控件与label控件来实现的,还有采用定义新类来生成雷区。在结合大量的循环方法来实现整个软件,利用循环来生成雷区并且在窗体上显示,利用循环来实现在雷区上随机布雷,并且完成鼠标单击时间的功能。 2.2 经济可行性
基于C#程序设计的扫雷冲关游戏,从经济角度上来说。该游戏结构简单,容易开发,开发简单,开发时用到的人力和物力相对来说比较少,而且对现在市场上的需求性很高,相对来说也比较实用,对疲惫的各种人群都有很大的帮助。因此,会有一定的市场潜力,也会有不错的经济效益。 2.3 社会可行性
综上所述,基于C#程序设计的扫雷冲关游戏开发在市场上、需求性很大,技术可行。因而决定开发扫雷冲关游戏。
4
3 总体设计 3.1 算法设计图
通过VS2010中button控件与label控件来显示游戏时间,剩余雷数和显示最主要的笑脸哭脸。在第一次加载时默认难度为初级难度,玩家之后可以自己手动进行难度选择,而且玩家还能通过左键踩雷,右键标记来进行游戏。如图3-1所示。 (1)左键普通单击功能。 (2)递归扫雷功能。 (3)右键标记功能。 (4)游戏难度选择功能。 (5)闯关功能。
图1 算法设计图
5
3.2 界面设计
利用了windos窗体进行整个游戏的界面设计。通过VS2010中button控件与label控件来对雷区的显示,对扫雷结果和过程的完整显示。在第一次加载界面后利用循环button生成的雷区进行左键单击和右键事件来触发扫雷代码运行,在后台代码运行后将当前单击事件结果在button控件上呈现,并且当游戏运行中和失败或者胜利中间的button控件都会忠实的把结果用笑脸哭脸和酷脸来呈现。如图2、图3、图4所示: (1)实现左键单击功能。 (2)实现右键单击功能。 (3)实现结果呈现功能功能。 (4)实现闯关功能。 (5)实现难度切换功能。 (6)实现结果呈现功能。
图2 初始界面图
6
图3游戏界面
图4 难度切换界面
7
4 主要模块详细设计 4.1 功能模块介绍
(1)雷区布置功能:主要是实现雷区的布置
(2)随机布雷功能: 主要的对扫雷游戏的地雷进行随机布下
(3)鼠标单击事件功能: 主要是判定用户按下的是左键还是右键并执行后续代码 (4)递归扫雷功能:主要是实现当按下坐标点的周围无雷时扫出一片非雷区 (5)复原功能:对当前游戏进行复原设计,使玩家可以进行下一盘游戏 (6)闯关功能:主要是为了增加趣味性,通过连胜来增加难度。
4.2雷区布置功能
雷区布置功能是通过两个嵌套循环来实现的。在VS2010程序中自定义一个类LeiButton,该类继承于Button按钮,在该类中设置生成控件的大小,并且定义生成控件的坐标x,y,有无翻开属性tag,还有标记是否是雷的属性youlei。上面的都是前置条件,就像你烧饭要先准备好米,水,锅一样。光材料还不够,还需要把材料用起来,首先要在全局变量那里new一下,然后在循环里生成单个Button控件,并设置他的坐标、显示位置和非雷属性,最后在定义一下他的鼠标单击事件就OK了。主要代码如下所示: private void Leizheng() {
for (int i = 0; i < lie; i++) {
for (int j = 0; j < hang; j++) {
button[j, i] = new LeiButton();
button[j, i].Location = new Point(1 + i * 20, 55 + j * 20); //button[j,i].BackgroundImage= Image.FromFile(beijing); button[j, i].X = j; button[j, i].Y = i;
button[j, i].Youlei = 0;
this.Controls.Add(button[j, i]);
//定义LeiButton按钮的鼠标事件,大家共享 button[j, i].MouseUp += new MouseEventHandler(bt_MouseUp); } } }
8
4.3随机布雷功能
随机布雷功能是通过伪随机来实现的。伪随机获取到两个在雷区范围内的数字,分别赋值给Button[x,y]控件,,如果该控件已经有雷则次数加一重新随机,否则该位置布上雷并且修改属性youlei=1。主要代码如下所示:
private void Bulei() {
Random rand = new Random();
for (int i = 0; i < leishu; i++) {
int position_x = rand.Next(hang); int position_y = rand.Next(lie);
if (button[position_x, position_y].Youlei == 0) {
button[position_x, position_y].Youlei = 1;
} else
i = i - 1; }
}
4.4鼠标单击事件功能
鼠标单击事件功能是通过获取按下的是左键还是右键来实现功能的。首先判断游戏是否结束,结束则不做操作,否则就判定是否是左键按下,如果左键按下就需要再次判断是否是雷,是雷的话显示所有雷并结束游戏,不是就遍历周围显示周围雷数再禁用该按钮,如果显示为0则要调用递归扫雷;当右键按下时还需判断原先是否有标记,没有则标记,有的话就取消原来标记并且剩余雷数加1.不管左键还是右键按下,之后都要判断剩余雷数,如果为0就结束游戏显示酷脸。主要代码如下所示: private void bt_MouseUp(object sender, MouseEventArgs e) {
if (!over) {
int x, y;
LeiButton b = (LeiButton)sender; x = b.X; y = b.Y;
switch (e.Button)
9
{ //鼠标左键触发事件
case MouseButtons.Left:
if (button[x, y].Youlei == 0) {
button[x, y].Enabled = false;
button[x, y].Text = Getdilei(x, y).ToString(); Saolei(x, y); if (Win()) {
//Showlei();
timer1.Enabled = false; over = true; }
} else {
button[x, y].BackgroundImage = Image.FromFile(zhakai);
timer1.Enabled = false; button1.BackgroundImage = Image.FromFile(kulian);
xianshi(); over = true; ci = 1; fuli(); }
break;
//鼠标右键触发事件
case MouseButtons.Right:
button[x, y].BackgroundImage = Image.FromFile(flag); if (Convert.ToInt16(button[x, y].Tag) == 1) {
button[x, y].Tag = 0; restlie++;
button[x, y].BackgroundImage = null;
} else {
button[x, y].Tag = 1;
//button[x, y].Enabled = false; restlie--; }
10
lei.Text = restlie.ToString() + \颗?\; if (Win()) {
button1.BackgroundImage = Image.FromFile(cheng); timer1.Enabled = false; over = true; ci++; fuli(); }
break;
} } else
return;
}
4.5递归扫雷功能
递归扫雷功能是通过先进行计算点开点周围雷数,如果为0则按照顺序依次遍历周围雷区,如此递归,最后成功的实现了当点到0时向周围八个发散递归查找功能。原理其实也比较容易,比如当我点下坐标button[5, 5]时,如果该点显示周围没有雷,那么就首先禁用周围按钮并计算和显示雷数,然后从button[4, 4]点调用本函数,也就是以(4,4)为中点,后面按照同样的原理进行运行。主要代码如下所示:
//判断点开的这个按钮周围个中有几个地雷
private int Getdilei(int row, int col)//x代表行,y代表列 {
int i, j;
int around = 0;
int minRow = (row == 0) ? 0 : row - 1; int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1; int maxCol = col + 2;
for (i = minRow; i < maxRow; i++) {
for (j = minCol; j < maxCol; j++) {
if (!(i >= 0 && i
continue;
if (button[i, j].Youlei == 1) around++;
11
} }
return around; }
//以下递归扫雷,向周围八个发散的递归查找 private void Saolei(int row, int col) {
int minrow1 = (row == 0) ? 0 : row - 1; int mincol1 = (col == 0) ? 0 : col - 1; int maxrow1 = row + 2; int maxcol1 = col + 2;
int leishuliang = Getdilei(row, col); if (leishuliang == 0) {
button[row, col].Enabled = false;
for (int m = minrow1; m < maxrow1; m++) {
for (int n = mincol1; n < maxcol1; n++) {
if (!(m >= 0 && m < hang && n >= 0 && n < lie)) continue;
if (!(m == row && n == col) && button[m, n].Enabled == true)
Saolei(m, n);
button[m, n].Enabled = false;
button[m, n].Text = Getdilei(m, n).ToString(); if (button[m, n].Text == \)
button[m, n].Text = string.Empty; }
} }
}
4.6复原功能
用户管理功能是通对当前控件和字段进行初始化或重置来完成的。当玩家点击切换难度或者点击中间笑脸时,触发复原函数,复原函数会删除对button控件的修改,会重新计时,会重新布雷,把显示的数据也改成一开始时候的状态。最后在将中间的笑脸
12
图案按钮背景图片重新换成笑脸。就完成了复原功能。主要代码如下所示:
//每次按开始按钮时,所有方块复原
public void Fuyuan() {
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
button[i, j].Tag = 0;
button[i, j].Enabled = true;
button[i, j].Text = string.Empty; button[i, j].BackgroundImage = null; if (button[i, j].Youlei == 1) button[i, j].Youlei = 0; }
}
Bulei(); yongshi = 0; over = false; restlie = leishu; timer1.Start();
label4.Text = \秒?\;
lei.Text = restlie.ToString() + \颗?\;
button1.BackgroundImage = Image.FromFile(xiaolian); }
4.6 闯关功能
闯关功能是通过一个简单的累加来呈现的,对于扫雷游戏来说,如果闯关模式设计成以雷的数量怎么或者限定时间来增加难度的话,就不会起到预期的作用,因为扫雷游戏本身就不适合,所以我另辟蹊径,以连胜来增加难度系数,初级难度因为很容易,所以需要玩家连胜10次才能获得惊喜大礼包,中级难度虽然不容易但也不难,连胜5次是个比较适中的次数,而高级难度由于其本身难度就很大,所以玩家很难连胜,2次真的已经够了。如图5所示:
13
图5闯关设计界面
14
5 软件功能调试
(1)对开发完成的扫雷游戏进行功能测试,检验是否实现了扫雷的主要功能
1)实现难度选择功能。 2)实现闯关功能。 3)实现左键踩雷功能。 4)实现右键标记功能。 5)实现复原功能。
(2)在扫雷游戏功能调试的过程中,我遇到了如下问题和解决方法:
1) 切换难度后一开始加载的部分有问题,说的清楚点就是窗体加载时默认加载初级难度,而如果切换成中级或者高级难度的话,雷区是在原有基础上生成的,也就是中级难度雷区包含了初级难度的雷区,而我当时调试事旧的雷区总是无法正常显示,但是新生成的雷区却能正常运行。我通过查阅大量资料和自己动手实验后,发现问题出在资源没有释放掉上,也就是如果重新利用雷区的话需要把旧有雷区所占用的资源释放掉。但是奈何技术不够硬,没有完美结果,只能使用笨方法来实现,最后虽然成功的解决了问题但这是在牺牲了大量系统运行资源上建立的。
2)在设计游戏时,我是仿照windos xp自带扫雷进行设计的,但是当时运行时报错,高级难度报错索引超出界限。我后来上网问人和百度查找还是没有发现问题出在哪里,但是初级难度和中级难度却能完美运行,我后来不断修改代码惊醒测试,只发现雷区是正方形就,没问题,否则就会报错,因为这个问题无法解决,所以最后布的不修改计划,将高级雷区设计成正方形。
3)我的扫雷游戏已经完成的差不多了,但是我的扫雷布局不好,而且窗体边框可以拖动,这会造成游戏变地很难看,我我查阅了资料后将窗体的AutoSizeMode属性设置成GrowOnly,并且指定窗体大小。
4)在多次修改后我的扫雷软件基本完成,但是没有鼠标左键+右键功能,虽然我知道这个功能很重要,但是经过我好几天的查阅资料和实验后,发现c#没有鼠标左右键事件,虽然有中键事件可以代替,但最终没有加上去是因为我发现button控件更本就无法实现扫雷游戏中左右键点击时的压下效果,因为这个问题根本无法解决,也找不到替代方案,所以最后只能舍弃掉这个重要的功能了。
5)在扫雷游戏完成后我开始附加模块的设计,我仔细考虑了很久,扫雷游戏是个特殊的游戏,他不能用一般游戏的难度设计来套用,如时间长短难度设计,雷数变化难度
15
设计。我决定另辟蹊径,利用连胜来增加游戏难度,而且我还设计了玩家完成后会获得一个惊喜大礼包。这更能调动玩家的兴趣。经过我的多次切身体会,初级难度游戏本身难度就不大,所以需要玩家连胜10次才能完成;中级难度比较容易,所以玩家只要连续完成5次就够了 ;高级难度本身就很难胜利,更何况是连胜能,所以2次足矣。
16
结论与谢辞
在我决定好毕业设计的课题之后,在宋老师的悉心指导下完成了整体设计。然后我就根据毕业设计任务书所计划的所要完成任务内容,认真的安排了自己的课余时间,并对所要实现的功能进行了详细的了解。然后便开始整个扫雷软件的设计。这次毕业设计的课题虽然难度不是很大,但是相对于我来说是有点困难的,要完成这份毕业设计是少不了学习及回顾所学的知识。工作量增加了不少,但是确实也让我把原先的专业知识重新巩固了一遍,也学习了很多原本没有学习到的知识。在设计与制作过程中,我充分利用自己所学的知识,也是因为原先本人就对本课题的设计进行了分析,在软件制作的过程中不断的分析问题,以及解决问题,让我觉得自己的对原本掌握的知识有了更深一步的了解,也对自己原先就不会的知识有了更多的了解。当然这个软件肯定存在着很多的不足,由于个人条件个人能力问题,这个软件还存在很多缺陷很多问题,光是一个界面美工就很粗糙,界面太过简陋,对于一个完善的游戏而言,我也只是完成了一部分功能,还有很多功能没有实现,但是对于我个人而言,这已经是我能力所能的极限了,所以虽然问题很多,但我对于自己还是很满意的。
这次毕业设计,我首先要特别感谢我指导老师,时刻关心着我,鼓励着我,并督促着我完成我们要完成的任务。还有感谢我们班的王梓轩同学帮助我修改论文,在我遇到问题的时候,细心的指导,在老师和同学的帮助下,我的毕业设计顺利完成了。
17
参考文献
[1] 王小科,徐薇.C#从入门到精通.清华大学出版社.2010-7.
[2] 丁宝康,董健全.数据库使用教程[M].北京.清华大学出版社,2003:12-210. [3] 李德奇.windons 程序设计案例教程(C#).大连理工大学出版社,2007-11. [4] 梁冰,吕双,王小科. C#程序开发范例宝典.人民邮电出版社,2009-10. [5]明日科技,C#从入门到精通[M],清华大学出版社2012-09.
18
附录1:主界面程序代码
在运行窗体中添加一个button控件,一个menuStrip控件,一个toolStrip控件,两个label控件,分别 用来计时和计算剩余的地雷数。 图片如下:
程序结构分布图
运行窗体的代码
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
19
using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging; //加入图片的命名空间
namespace 扫|?§雷¤?á {
public partial class Form2 : Form {
//定义失败时,地雷图片的路径
private string shibai = System.Environment.CurrentDirectory + \; //定义右键单击时,标记旗子图片的路径
private string flag = System.Environment.CurrentDirectory + \; //定义失败时,地雷炸开的路径
private string zhakai = System.Environment.CurrentDirectory + \; //定义开始按钮的图片路径
private string xiaolian = System.Environment.CurrentDirectory + \; //定义失败时,开始按钮图片路径
private string kulian = System.Environment.CurrentDirectory + \; //定义成功时,开始按钮图片路径
private string cheng = System.Environment.CurrentDirectory + \; //计时器
private Timer timer1 = new Timer(); //所用时间
public int yongshi = 0; //定义地雷数
private static int leishu;
public int Leishu {
get { return Form2.leishu; } set { Form2.leishu = value; } }
//游戏是否结束
public static bool over = false; //生成雷的行数 private int hang;
public int Hang {
get { return hang; } set { hang = value; } }
20
//生成雷的列数 private int lie;
public int Lie {
get { return lie; } set { lie = value; } }
//游戏过程中剩余的地雷数量 private int restlie; int ci = 1,zong;
//生成个按钮数组
private LeiButton[,] button = new LeiButton[32,32];
private void button1_Click(object sender, EventArgs e) {
Fuyuan(); }
public Form2() {
InitializeComponent(); }
private void Form2_Load(object sender, EventArgs e) {
start(10,9,9);
timer1.Tick += new EventHandler(timer1_Tick); timer1.Interval = 1000; zong = 10; fuli(); }
private void Leizheng() {
for (int i = 0; i < lie; i++) {
for (int j = 0; j < hang; j++) {
button[j, i] = new LeiButton();
21
button[j, i].Location = new Point(1 + i * 20, 55 + j * 20); //button[j,i].BackgroundImage= Image.FromFile(beijing); button[j, i].X = j; button[j, i].Y = i; button[j, i].Youlei = 0;
this.Controls.Add(button[j, i]);
//定义LeiButton按钮的鼠标事件,大家共享
button[j, i].MouseUp += new MouseEventHandler(bt_MouseUp); } } }
//定义鼠标单击事件,单击按钮时触发该事件
private void bt_MouseUp(object sender, MouseEventArgs e) {
if (!over) {
int x, y;
LeiButton b = (LeiButton)sender; x = b.X; y = b.Y;
switch (e.Button) { //鼠标左键触发事件 case MouseButtons.Left:
if (button[x, y].Youlei == 0) {
button[x, y].Enabled = false;
button[x, y].Text = Getdilei(x, y).ToString(); Saolei(x, y); if (Win()) {
//Showlei();
timer1.Enabled = false; over = true; }
} else {
button[x, y].BackgroundImage = Image.FromFile(zhakai);
timer1.Enabled = false;
button1.BackgroundImage = Image.FromFile(kulian); xianshi();
22
over = true; ci = 1; fuli(); } break;
//鼠标右键触发事件 case MouseButtons.Right:
button[x, y].BackgroundImage = Image.FromFile(flag); if (Convert.ToInt16(button[x, y].Tag) == 1) {
button[x, y].Tag = 0; restlie++;
button[x, y].BackgroundImage = null;
} else {
button[x, y].Tag = 1;
//button[x, y].Enabled = false; restlie--; }
lei.Text = restlie.ToString() + \颗?\; if (Win()) {
button1.BackgroundImage = Image.FromFile(cheng); timer1.Enabled = false; over = true; ci++; fuli(); } break;
} } else return;
}
//动态布置地雷,产生随机数布雷 private void Bulei() {
Random rand = new Random(); for (int i = 0; i < leishu; i++)
23
{
int position_x = rand.Next(hang); int position_y = rand.Next(lie);
if (button[position_x, position_y].Youlei == 0) {
button[position_x, position_y].Youlei = 1;
} else
i = i - 1; }
}
//判断点开的这个按钮周围8个中有几个地雷
private int Getdilei(int row, int col)//x代表行D,y代表列 {
int i, j; int around = 0;
int minRow = (row == 0) ? 0 : row - 1; int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1; int maxCol = col + 2;
for (i = minRow; i < maxRow; i++) {
for (j = minCol; j < maxCol; j++) {
if (!(i >= 0 && i
continue;
if (button[i, j].Youlei == 1) around++; } }
return around; }
//以下递归扫雷,向周围八个发散的递归查找 private void Saolei(int row, int col) {
int minrow1 = (row == 0) ? 0 : row - 1; int mincol1 = (col == 0) ? 0 : col - 1; int maxrow1 = row + 2;
24
int maxcol1 = col + 2;
int leishuliang = Getdilei(row, col); if (leishuliang == 0) {
button[row, col].Enabled = false; for (int m = minrow1; m < maxrow1; m++) {
for (int n = mincol1; n < maxcol1; n++) {
if (!(m >= 0 && m < hang && n >= 0 && n < lie)) continue;
if (!(m == row && n == col) && button[m, n].Enabled == true) Saolei(m, n);
button[m, n].Enabled = false;
button[m, n].Text = Getdilei(m, n).ToString(); if (button[m, n].Text == \) button[m, n].Text = string.Empty; }
} }
}
// 判断是否扫完地雷 private bool Win() {
int zongshu = 0;
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
if (button[i, j].Youlei == 1 && Convert.ToInt16(button[i, j].Tag) == 1) zongshu++;
}
}
if (zongshu == leishu) return true; else
return false;
}
25
//private void Showlei() //{
// for (int i = 0; i < hang; i++) // {
// for (int j = 0; j < lie; j++) // if (button[i, j].Youlei == 1) // {
// button[i, j].BackgroundImage = Image.FromFile(dileiimage); // }
// }
//}
private void xianshi() {
int l = 0;
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
if (button[i, j].Youlei == 1) {
button[i, j].BackgroundImage = Image.FromFile(shibai); l++;
//MessageBox.Show(button[i,j].Youlei.ToString()); } } }
}
//每次按开始按钮时所有方块复原- public void Fuyuan() {
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
button[i, j].Tag = 0; button[i, j].Enabled = true; button[i, j].Text = string.Empty; button[i, j].BackgroundImage = null; if (button[i, j].Youlei == 1)
26
button[i, j].Youlei = 0; }
} Bulei(); yongshi = 0; over = false; restlie = leishu; timer1.Start(); label4.Text = \秒?\;
lei.Text = restlie.ToString() + \颗?\;
button1.BackgroundImage = Image.FromFile(xiaolian); }
//定义timer组件的Tick事件
private void timer1_Tick(object sender, EventArgs e) {
yongshi++;
label4.Text = yongshi.ToString() + \秒?\; if (yongshi >= 60) timer1.Enabled = false; }
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) {
this.Close(); }
private void 中级ToolStripMenuItem_Click(object sender, EventArgs e) {
foreach (Button i in button) {
this.Controls.Remove(i); //i.Dispose(); }
start(40,16,16); ci = 1; zong = 5; fuli(); Fuyuan(); lei.Left=290; button1.Left = 150;
this.Size = new Size(330,433);
27
}
private void 初级ToolStripMenuItem_Click(object sender, EventArgs e) {
foreach (Button i in button) {
this.Controls.Remove(i); //i.Dispose(); }
start(10,9,9); ci = 1; zong = 5; fuli(); Fuyuan();
this.Size = new Size(190,293); }
private void 高级ToolStripMenuItem_Click(object sender, EventArgs e) {
foreach (Button i in button) {
this.Controls.Remove(i); //i.Dispose(); }
start(99,23,23); ci = 1; zong = 2; fuli();
lei.Left = 430; button1.Left =218; Fuyuan();
this.Size = new Size(470, 433); }
private void start(int a,int b,int c) {
restlie =Leishu=a; lie = b; hang = c;
label4.Text = \秒?\;
lei.Text = restlie.ToString() + \颗?\; timer1.Enabled = true;
button1.BackgroundImage = Image.FromFile(xiaolian); Leizheng(); Bulei();
28
this.Location = new Point(100, 100);
this.StartPosition = FormStartPosition.Manual; }
private void 开局ToolStripMenuItem_Click(object sender, EventArgs e) {
Fuyuan(); }
private void 关于扫|雷ToolStripMenuItem_Click(object sender, EventArgs e) {
MessageBox.Show(\这是基于c#语言开发的仿windos自带扫雷\, \制作人:陈俊\, MessageBoxButtons.OK); }
private void fuli() {
this.toolStripLabel1.Text = \第\ + ci+\+zong+ \次,完成有惊喜哟\; if (ci > zong) {
MessageBox.Show(\C?AV?¥3???è???o???o?????????????-?裤é?????720P.rmvb&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.publicbt.com:80&tr=udp://tracker.ccc.de:80&tr=udp://tracker.publicbt.com:80/announce\,\你懂的\); ci = 0; } } } }
附录2:LeiButtton类程序代码
程序中在定义一个LeiButton的类,继承于Button类 LeiButtton类的代码如下:
using System;
using System.Collections.Generic; using System.Linq; using System.Text;
using System.Windows.Forms;//引入Button的命名空间
namespace 扫雷
29
{
class LeiButton:Button {
//返回按钮所在的矩阵点,即二维数组的两个参数。在鼠标单击控件时可通过这两个变量的属性值返回得到,进而可确定扫雷函数(在窗体类中定义)的两个参数 private int x; private int y;
//0表示无地雷。1表示有地雷 private int youlei; //构造函数 public LeiButton() {
Tag = 0; /// 0表示该方块没有翻开,1表示该方块已经翻开 Size = new System.Drawing.Size(20,20);//定义控件大小 }
//定义属性 public int X { get
{ return x; } set
{ x = value; } }
public int Y { get
{ return y; } set
{ y = value; } }
public int Youlei { get
{ return youlei; } set
{ youlei = value; } } } }
30
正在阅读:
二年级奥数之 - 合理安排时间 - 图文02-26
第2章 循环系统疾病病人的护理05-18
七上生物基训答案05-11
试卷编号(2)01-04
2018年12月大学英语六级真题解析(仔细阅读卷二)11-12
小学生小升初数学常见简便计算总结09-20
电子邮箱安全管理制度09-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- C#
- 扫雷
- 程序设计
- 毕业论文
- 基于
- 开发
- 游戏
- 城市口号范文4篇
- 工作报告之顶岗实习报告1500字
- 圆柱坐标机械手毕业设计说明书
- 谈如何让幼儿在美术教学过程中体验快乐
- 婚姻法学作业
- 基层征兵工作调研报告
- 浅谈大润发超市仓储管理存在问题及对策
- 20070404区间箱式变电站技术规格书
- 项 目 立 项 文 本- 杭州电子科技大学 - 图文
- 2014年六年级下册品德与社会复习提纲
- 华科计算机学院团队与导师名单
- 文化创新的途径教学设计
- 专业人才继续教育沟通与协调能力-附答案96分全卷
- Tina Pro 实验 讲义
- 1.8《碰撞与动量守恒》单元测试
- 2008年电力行业研究报告
- 《基础会计学》大纲
- 化学必修2学案:第4章第1节 开发利用金属矿物和海水资源导学案(
- 苏教版小学四年级下学期语文第六单元测试题
- 04 溶液