编写思路:1.创建地图 地图的方块用button按钮 设置button的属性如:背景、tag为0、位置(x,y)、按钮的宽高度、注册按钮的鼠标点击事件。 二维数组来保存每行每列的button按钮并且把全部的二维数组的赋值为0。创建list<Button> 泛型 方便后面可以单独指定某个按钮。
//创建button按钮
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
intArray[i, j] = 0;
Button button = new Button();
button.Width = 60;
button.Height = 60;
button.Text = "";
button.Name = (i*10+j).ToString();
button.Location = new Point(j*60, i*60);
button.BackgroundImage = Resources.背面;
button.BackgroundImageLayout = ImageLayout.Stretch;
button.MouseDown += new MouseEventHandler(button_MouseDown);
this.Controls.Add(button);
list.Add(button);//list<Button>泛型
}
}
2.设置雷数并且随机放置到button按钮上 设置好后把二维数组的值改为1。
//设置雷的个数 并 随机设置放在button按钮上 按钮的二维数组值为1
Random rd = new Random();
int num = 0;
while (num<10)
{
int i= rd.Next(0,10);
int j = rd.Next(0,10);
if (intArray[i, j] != 1)
{
intArray[i, j] = 1;
num++;
Console.WriteLine(i + "," + j + "\r\n");
}
}
3.每个按钮鼠标点击事件分为:单击左键和单击右键。
单击右键: 单击右键表示会有标记和问号还有还原。鼠标右键点击某个button按钮根据指定的button按钮的属性tag来判断这个是否已经被点击过,若被点击过为标记 ,那再次点击就为问号 ,再点击就还原。未被点击过那第一次为标记,再点击此按钮就为问号依次类推。
//判断右键点击
else if (e.Button == MouseButtons.Right)
{
//第一次标记
//第二次问号
//第三次为空
if (Convert.ToInt32(((Button)sender).Tag) == 0)
{
((Button)sender).BackgroundImage = Resources.标记;
((Button)sender).BackgroundImageLayout = ImageLayout.Stretch;
((Button)sender).Tag = 1;
}
else if (Convert.ToInt32(((Button)sender).Tag) == 1)
{
((Button)sender).BackgroundImage = Resources.问号;
((Button)sender).BackgroundImageLayout = ImageLayout.Stretch;
((Button)sender).Tag = 2;
}
else
{
((Button)sender).BackgroundImage = Resources.背面;
((Button)sender).BackgroundImageLayout = ImageLayout.Stretch;
((Button)sender).Tag = 0;
}
单击左键:单击左键表示显示这个按钮,若这个按钮的二维数组为1那就说明踩到地雷游戏Game Over。若这个按钮的二维数组为0那就恭喜您没有踩到地雷。然后根据扫雷的规则判断(扫雷规则:以点击的这个按钮为中心正方形形式扫描附近的8个按钮是否有雷,若有显示雷的个数,没有就依次以这个按钮的上、下、左、右的按钮为中心一直扫下去直到扫到为止。)附近是否有雷。若有雷则在此按钮上显示雷的个数。若没有就此按钮就为空然后依次以这个按钮的上下左右的按钮为中心一直扫。显示按钮为空和数字的都要取消按钮的鼠标单击事件。(下图的扫雷规则代码有点多就没贴代码)
//判断左键单击按钮二维数组的值为1还是为0.
if (e.Button == MouseButtons.Left)
{
//MessageBox.Show("左键单击:"+((Button)sender).Name);
int buttonName =Convert.ToInt32(((Button)sender).Name);
if (intArray[Convert.ToInt32(buttonName / 10), Convert.ToInt32(buttonName % 10)] == 0)
{
ButtonGet(Convert.ToInt32(buttonName / 10), Convert.ToInt32(buttonName % 10));//扫雷的规则判断
if (count != 0)
{
//返回个数
switch (count)
{
case 1:
((Button)sender).BackgroundImage = Resources._1;
break;
case 2:
((Button)sender).BackgroundImage = Resources._2;
break;
case 3:
((Button)sender).BackgroundImage = Resources._3;
break;
case 4:
((Button)sender).Text = "4";
break;
case 5:
((Button)sender).Text = "5";
break;
case 6:
((Button)sender).Text = "6";
break;
case 7:
((Button)sender).Text = "7";
break;
case 8:
((Button)sender).Text = "8";
break;
default:
break;
}
}
else
{
//返回0 继续判断周围的格子
// . . .
// . . .
// . . .
listnumber = new List<int>();
((Button)sender).BackgroundImage = Resources.空白;
ButtonGetlist(Convert.ToInt32(buttonName / 10), Convert.ToInt32(buttonName % 10));//扫雷的规则判断
}
((Button)sender).BackgroundImageLayout = ImageLayout.Stretch;
((Button)sender).MouseDown -= new MouseEventHandler(button_MouseDown);
((Button)sender).Enabled = false;
}
else
{
MessageBox.Show("Game over");
}
}
4.判断游戏是否胜利 雷是否已被扫完。获取已点完没有雷的按钮个数+获取已标记为红旗的个数=总的按钮个数。 若这个公式成立则游戏胜利。
//每单击个按钮都要做判断
controlnumber = 0;
Imagenumber = 0;
foreach (Button item in this.Controls)
{
if (item.Enabled == false)
{
controlnumber++;
}
if (intArray[Convert.ToInt32(item.Name) / 10, Convert.ToInt32(item.Name) % 10] == 1)
{
if (item.Enabled == true)
{
if (Convert.ToInt32(item.Tag) == 1)
{
Imagenumber++;
}
}
}
}
if (Imagenumber + controlnumber == 100)
{
MessageBox.Show("You Win");
}
附效果图:
附代码下载链接:https://download.csdn.net/download/qq_35319925/10737977 以上就是我个人总结的扫雷游戏的编写思路,由于时间比较匆忙其中有点小细节未被处理还请给位老爷包涵一二。