首先写一个类,用来保存每个格子可以携带的信息
class FK
{
//是否是雷
public bool lei;
public bool Lei
{
get { return lei; }
set { lei = value; }
}
//如果不是雷,它的周围有几颗雷
public int num;
public int Num
{
get { return num; }
set { num = value; }
}
//第一次右击
public bool first;
public bool First
{
get { return first; }
set { first = value; }
}
//第二次右击
private bool second;
public bool Second
{
get { return second; }
set { second = value; }
}
//被鼠标点击的次数
private int cli_num;
public int Cli_num
{
get { return cli_num; }
set { cli_num = value; }
}
}
然后进入主程序
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
FK[] fk = new FK[81]; //方块信息,携带方块的各种信息
int[] nn = new int[9]; //有雷的方块的标记
Button[] bu = new Button[81]; //可点击方块
Random r = new Random(); //随机数
int ss; //记录剩余雷(玩家认为的)的个数
Label lei = new Label(); //显示 ss
private void Form1_Load(object sender, EventArgs e)
{
//对游戏界面初始化
start();
}
private void start()
{
this.Width = 800;
this.Height = 600;
this.Top = this.Left = 50;
this.BackColor = Color.Black;
//初始设置剩余9个雷
ss = 9;
//定义一个Lable,记录标记了多少个方块是 雷
lei.Top = 20;
lei.Left = 700;
lei.Width = 50;
lei.Height = 20;
lei.Text = ss.ToString();
lei.BackColor = Color.Red;
lei.ForeColor = Color.White;
this.Controls.Add(lei);
//生产 雷 的方块记号
ran_num();
//做方块
int k = 0;
for (int i = 0; i < 81; i++)
{
fk[i] = new FK();
if (i == nn[k]) //如果是 雷
{
//避免数组 越界
if (k <= 7)
{
k++;
}
fk[i].Cli_num = -1; //雷 的初始点击次数为-1
fk[i].Lei = true; //是 雷
fk[i].Num = -1; //雷 的周围有多少 雷 初始设为-1
}
else
{
fk[i].Cli_num = 0; //不是雷 的初始点击次数为0
fk[i].Lei = false; //不是雷
fk[i].Num = 0; //方块周围有多少雷 初始设为0
}
fk[i].First = false; //初始没有单击鼠标右键
fk[i].Second = false; //初始没有第二次单击鼠标右键
bu[i] = new Button();
bu[i].Height = bu[i].Width = 50;
//利用坐标关系,就爱那个方块9*9排列
bu[i].Top = i / 9 * 50 + 100;
bu[i].Left = i % 9 * 50 + 30;
bu[i].FlatStyle = FlatStyle.Standard;
bu[i].BackColor = Color.Red;
bu[i].Tag = i; //利用Tag将类fk与方块绑定
bu[i].MouseDown += new MouseEventHandler(lb_MouseDown);
this.Controls.Add(bu[i]);
}
//将每个 雷 的周围方块加入提示信息
for (int i = 0; i < 81; i++)
{
if (fk[i].Lei)
{
make_num(i);
}
}
}
//每个雷处于9*9中心,其四周方块判断这里有雷,提示有雷(Num+1)
private void make_num(int i)
{
if (i %9 != 8)
{
fk[i + 1].Num++;
}
if (i %9 != 0)
{
fk[i - 1].Num++;
}
if (i <72)
{
fk[i + 9].Num++;
}
if (i >=9)
{
fk[i - 9].Num++;
}
if (i >= 9 && i % 9 != 8)
{
fk[i - 8].Num++;
}
if (i >= 9 && i % 9 != 0)
{
fk[i - 10].Num++;
}
if (i < 72 && i % 9 != 0)
{
fk[i + 8].Num++;
}
if (i < 72 && i % 9 != 8)
{
fk[i + 10].Num++;
}
}
//鼠标单机事件
void lb_MouseDown(object sender, MouseEventArgs e)
{
Button lb = (Button)sender;
int ii = (int)lb.Tag;
//如果左击且不处于右键单击情况下
if (e.Button == MouseButtons.Left&&fk[ii].Second==false&&fk[ii].First==false)
{
//是雷
if (fk[ii].Lei)
{
lb.Text = "雷";
lb.MouseDown -= new MouseEventHandler(lb_MouseDown);
//游戏结束
MessageBox.Show("失败");
//游戏重新开始
this.Controls.Clear();
start();
}
//不是 雷
else if(fk[ii].Num > 0)
{
fk[ii].Cli_num++; //单击次数+1
lb.MouseDown -= new MouseEventHandler(lb_MouseDown);
lb.Text = fk[ii].Num.ToString(); //将其周围有多烧 雷 显示出来
}
else if(fk[ii].Num == 0 && fk[ii].Lei==false)
{
//如果方块周围没有 雷
down0(ii);
}
}
// 右键单击方块
else if(e.Button==MouseButtons.Right)
{
//第一次右键单击,表示玩家认为这里是 雷
if (fk[ii].First == false && fk[ii].Second == false)
{
fk[ii].First = true;
lb.Text = "旗旗";
ss--;
}
//第二次右键单击,表示玩家怀疑这里是 雷
else if (fk[ii].First == true && fk[ii].Second == false)
{
fk[ii].Second = true;
lb.Text = "?";
ss++;
}
//第三次右键单击,表示玩家取消以上两种状态
else if (fk[ii].First == true && fk[ii].Second == true)
{
fk[ii].First = fk[ii].Second= false;
lb.Text = "";
}
lei.Text = ss.ToString();
}
//判断是否游戏成功
if (suc())
{
MessageBox.Show("成功");
this.Controls.Clear();
start();
}
}
//产生9个在1~81之间的互不相同的随机数
void ran_num()
{
//产生随机数
for (int i = 0; i < 9; i++)
{
nn[i] = r.Next(1, 82);
for (int j = 0; j <i; j++)
{
//保证互不相同
if (nn[i] == nn[j])
{
i--;
break;
}
}
}
//将这些随机数排序(冒泡排序)
int temp;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8 - i; j++)
{
if (nn[j] > nn[j + 1])
{
temp = nn[j + 1];
nn[j + 1] = nn[j];
nn[j] = temp;
}
}
}
}
//如果左键点击到方块
int down0(int i)
{
fk[i].Cli_num++; //单击次数+1
bu[i].BackColor = Color.White;
bu[i].MouseDown -= new MouseEventHandler(lb_MouseDown);
//开始向周围扩散
//直到遇到周围的方块是 雷,或者这个方块的周围有雷
if (i + 9 < 81 )
{
if (fk[i + 9].Num > 0)
{
fk[i+9].Cli_num++;
bu[i+9].Text= fk[i + 9].Num.ToString();
}
if (fk[i + 9].Num == 0 && bu[i + 9].BackColor != Color.White)
{
//利用 递归 继续向周围扩散
down0(i+9);
}
}
if (i - 9 >= 0)
{
if (fk[i - 9].Num > 0)
{
fk[i-9].Cli_num++;
bu[i - 9].Text = fk[i - 9].Num.ToString();
}
if (fk[i - 9].Num == 0 && bu[i - 9].BackColor != Color.White)
{
down0(i - 9);
}
}
if (i % 9 != 0)
{
if (fk[i - 1].Num > 0)
{
fk[i-1].Cli_num++;
bu[i - 1].Text = fk[i - 1].Num.ToString();
}
if (fk[i - 1].Num == 0 && bu[i - 1].BackColor != Color.White)
{
down0(i - 1);
}
}
if (i % 9 != 8)
{
if (fk[i + 1].Num > 0)
{
fk[i+1].Cli_num++;
bu[i + 1].Text = fk[i + 1].Num.ToString();
}
if (fk[i + 1].Num == 0 && bu[i + 1].BackColor != Color.White)
{
down0(i + 1);
}
}
if (i - 9 >= 0 && i % 9 != 0)
{
if (fk[i - 10].Num > 0)
{
fk[i-10].Cli_num++;
bu[i - 10].Text = fk[i - 10].Num.ToString();
}
if (fk[i - 10].Num == 0 && bu[i - 10].BackColor != Color.White)
{
down0(i - 10);
}
}
if (i - 9 >= 0 && i % 9 != 8)
{
if (fk[i - 8].Num > 0)
{
fk[i-8].Cli_num++;
bu[i - 8].Text = fk[i - 8].Num.ToString();
}
if (fk[i - 8].Num == 0 && bu[i - 8].BackColor != Color.White)
{
down0(i - 8);
}
}
if (i < 72 && i % 9 != 0)
{
if (fk[i + 8].Num > 0)
{
fk[i+8].Cli_num++;
bu[i + 8].Text = fk[i + 8].Num.ToString();
}
if (fk[i + 8].Num == 0 && bu[i + 8].BackColor != Color.White)
{
down0(i + 8);
}
}
if (i < 72 && i % 9 != 8)
{
if (fk[i + 10].Num > 0)
{
fk[i+10].Cli_num++;
bu[i + 10].Text = fk[i + 10].Num.ToString();
}
if (fk[i + 10].Num == 0 && bu[i + 10].BackColor != Color.White)
{
down0(i + 10);
}
}
return 0;
}
//判断是否游戏成功
bool suc()
{
int k = 0;
int j = 0;
for (int i=0; i < 81; i++)
{
//所有的雷没有被左键单击过
if (fk[i].Cli_num == -1)
{
k++;
}
//所有不是雷的方块被单机过
if (fk[i].Cli_num > 0)
{
j++;
}
}
//满足9个雷,72个不是雷
if (k == 9 && j == 72)
{
for (int i = 0; i < 81;i++)
{
//将所有有雷的格子自动标记
if (fk[i].Lei)
{
bu[i].Text = "旗旗";
}
}
return true;
}
return false;
}
}
结束!