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