采用一个雷控件
游戏进行中
总结本次小程序方法 开始游戏 根据设置动态创建雷控件 触雷或点开所有非雷区游戏结束
总结本次小程序有几个地方值得记录,也是写出这个程序的关键
1.布雷
使用一个int型二维数组储存各个坐标下是否有雷的信息
private int[,] map;//1表示有雷
//布雷 将是否有雷的信息记录到map[,]中
private void BuildLeiqu(int x, int y, int mines)
{
map= new int[x, y];
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
map[i, j] = 0;
}
}
Random random = new Random();
int[,] temp=new int[x,y];
//保证布mines个雷
for (int i = 0; i < mines; i++)
{
while (true)
{
int mx = random.Next() % x;//值将会是从0都x-1中的一个
int my = random.Next() % y;//值将会是从0到y-1中的一个
if (temp[mx, my] != 1)
{
map[mx, my] = 9; //9 - mine
temp[mx, my] = 1;
break;
}
}
}
}
2.统计某个坐标周围有多少累
private int Tongji(int i, int j, int x, int y)//i j为坐标 x y为行数和列数用以处理越界的问题
{
int sum = 0;
for (int tempi = i - 1; tempi <= i + 1; tempi++)//一行一行地进行统计
{
//越界则进入下一次循环
if (tempi < 0 || tempi >= x)
continue;
for (int tempj = j - 1; tempj <= j + 1; tempj++)
{
//越界进入下一次循环
if (tempj < 0 || tempj >= y)
continue;
if (map[tempi, tempj] == 9)
sum++;
}
}
return sum;
}
3.鼠标点中空白打开一大片的递归函数
//打开坐标i j周围的空白区域 以及边缘的数字
private void OpenWhites(int i,int j)
{
if (i < 0 || i >= row_count || j < 0 || j >= col_count)//越界
return;
if (map[i, j]==0)
{
map[i, j] = -1;//已打开
OpenWhites(i - 1, j - 1);
OpenWhites(i - 1, j);
OpenWhites(i - 1, j + 1);
OpenWhites(i + 1, j - 1);
OpenWhites(i + 1, j);
OpenWhites(i + 1, j + 1);
OpenWhites(i, j + 1);
OpenWhites(i, j - 1);
}
buttons[i, j].Unseal();//开启这个控件 buttons[i,j]为动态创建的雷控件
map[i, j] = -1;
}