最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > asp教程

born again让单机版的扫雷跑起来

日期:03-29    来源:中国设计秀    作者:cnwebshow.com

今天的主要任务就是把单击版的搞定,这是过渡到网络版的必备过程。akI中国设计秀
akI中国设计秀
如果没有玩过扫雷的,建议先去体验一下;体验完后,自己尝试写出扫雷的算法;经过思考揣摩推敲才能有收获。不建议一上来就下载源码剖析,跟踪代码!akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
现在我来说下我的思路,如果有更优雅的算法,欢迎大家分享------竞争引发技术进步,分享推动技术进步!akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
【一】单机版扫雷划为两层akI中国设计秀
akI中国设计秀
第一层为Button,Button盖在Lable上,Lable被隐藏在Button下面;akI中国设计秀
akI中国设计秀
第二层为Lable,  Lable上的背景图片改成地雷图案表示有雷。akI中国设计秀
akI中国设计秀
雷区的大家我定为20*20.akI中国设计秀
akI中国设计秀
        PRivate const int Xcount = 20;akI中国设计秀
        private const int Ycount = 20;akI中国设计秀
添加Lable的代码如下:akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1  private Label[] labels2 = new Label[Xcount * Ycount];akI中国设计秀
2  private Label[,] labels = new Label[Xcount, Ycount];akI中国设计秀
3         int indexOfLable = 0;akI中国设计秀
4         private void CreateLable()akI中国设计秀
5         {akI中国设计秀
6             int[] ints = new int[400];akI中国设计秀
7             Random rd = new Random();akI中国设计秀
8             for (int i = 0; i < 400; i++)akI中国设计秀
9             {akI中国设计秀
10                akI中国设计秀
11                 ints[i] = rd.Next(1, 400);akI中国设计秀
12             }akI中国设计秀
13             for (int i = 0; i < Xcount; i++)akI中国设计秀
14             {akI中国设计秀
15                 for (int j = 0; j < Ycount; j++)akI中国设计秀
16                 {akI中国设计秀
17                     Label lb = new Label();akI中国设计秀
18                     lb.Location = new Point(i * 30, 30 * j);akI中国设计秀
19                     lb.Size = new Size(30, 30);akI中国设计秀
20                     lb.BorderStyle = BorderStyle.Fixed3D;akI中国设计秀
21                     this.Controls.Add(lb);akI中国设计秀
22                     labels[i, j] = lb;akI中国设计秀
23                     labels2[indexOfLable] = lb;akI中国设计秀
24                     indexOfLable++;akI中国设计秀
25                 }akI中国设计秀
26             }akI中国设计秀
27             for (int i = 0; i < ints.Length; i++)akI中国设计秀
28             {akI中国设计秀
29                 if (ints[i] < 40)akI中国设计秀
30                 {akI中国设计秀
31                     labels2[i].Image = Properties.Resources.标准地雷;akI中国设计秀
32                 }akI中国设计秀
33             }akI中国设计秀
34         }akI中国设计秀
akI中国设计秀
akI中国设计秀
添加Button的代码如下:akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1    private Button[,] buttons = new Button[Xcount, Ycount];     akI中国设计秀
2         private void AddButton()akI中国设计秀
3         {akI中国设计秀
4             for (int i = 0; i < Xcount; i++)akI中国设计秀
5             {akI中国设计秀
6                 for (int j = 0; j < Ycount; j++)akI中国设计秀
7                 {akI中国设计秀
8                     Button btn = new Button();akI中国设计秀
9                     btn.Click += new EventHandler(btn_Click);akI中国设计秀
10                     //btn.Click +=new EventHandler(btn_MouseDown);akI中国设计秀
11                     btn.MouseUp += new MouseEventHandler(btn_MouseUp);akI中国设计秀
12                     btn.Location = new Point(i * 30, 30 * j);akI中国设计秀
13                     btn.Size = new Size(30, 30);akI中国设计秀
14                     this.Controls.Add(btn);akI中国设计秀
15                     //利用Tag使按钮和坐标建立联系akI中国设计秀
16                     Point pt = new Point(i, j);akI中国设计秀
17                     btn.Tag = pt;akI中国设计秀
18                     buttons[i, j] = btn;akI中国设计秀
19                 }akI中国设计秀
20             }akI中国设计秀
21         }akI中国设计秀
akI中国设计秀
akI中国设计秀
实现按钮注册的事件,代码如下:akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1    void btn_MouseUp(object sender, MouseEventArgs e)akI中国设计秀
2         {akI中国设计秀
3             if (e.Button == MouseButtons.Right)akI中国设计秀
4             {akI中国设计秀
5                 Button btn = (Button)sender;akI中国设计秀
6                 if (btn.BackgroundImage == null)akI中国设计秀
7                 {akI中国设计秀
8                     btn.BackgroundImage = Properties.Resources.挖雷工兵;akI中国设计秀
9                 }akI中国设计秀
10                 elseakI中国设计秀
11                 {akI中国设计秀
12                     btn.BackgroundImage = null;akI中国设计秀
13                 }akI中国设计秀
14             }akI中国设计秀
15         }akI中国设计秀
16 akI中国设计秀
17 akI中国设计秀
18  void btn_Click(object sender, EventArgs e)akI中国设计秀
19         {akI中国设计秀
20             Button btn = (Button)sender;akI中国设计秀
21             this.Controls.Remove(btn);akI中国设计秀
22             Point pt = (Point)btn.Tag;akI中国设计秀
23             x = pt.X;akI中国设计秀
24             y = pt.Y;akI中国设计秀
25             if (labels[x, y].Image != null)akI中国设计秀
26             {akI中国设计秀
27                 MessageBox.Show("游戏结束,果然是踩雷高手");akI中国设计秀
28                 ReStart();akI中国设计秀
29                 return;akI中国设计秀
30             }akI中国设计秀
31             CheckLable(x, y);akI中国设计秀
32         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
单击Button按钮判断在其下面的Lable上的图像是否为地雷,图像为空------递归寻找,图像不为空------游戏失败!akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1     void btn_Click(object sender, EventArgs e)akI中国设计秀
2         {akI中国设计秀
3             Button btn = (Button)sender;akI中国设计秀
4             this.Controls.Remove(btn);akI中国设计秀
5             Point pt = (Point)btn.Tag;akI中国设计秀
6             x = pt.X;akI中国设计秀
7             y = pt.Y;akI中国设计秀
8             if (labels[x, y].Image != null)akI中国设计秀
9             {akI中国设计秀
10                 MessageBox.Show("游戏结束,果然是踩雷高手");akI中国设计秀
11                 ReStart();akI中国设计秀
12                 return;akI中国设计秀
13             }akI中国设计秀
14             CheckLable(x, y);akI中国设计秀
15         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
【二】单击的后果akI中国设计秀
akI中国设计秀
这里是指左键的单击,右键的很简单,仅仅改变一下Button的背景图片而已,表示你任务下面有地雷。akI中国设计秀
akI中国设计秀
左键单击后------1.移除被单击的按钮(大家都知道!)akI中国设计秀
akI中国设计秀
1    void btn_Click(object sender, EventArgs e)akI中国设计秀
2         {akI中国设计秀
3             Button btn = (Button)sender;akI中国设计秀
4             this.Controls.Remove(btn);akI中国设计秀
5         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
              ------2.判断周围8格有没有雷,如果有---计算出有多少个,显示在lable上,并且自动判断周围的8格中没有地雷的单格的周围8格是否有地雷,一直递归下去!akI中国设计秀
akI中国设计秀
                                                     如果没有---则移除周围8个button,并自动判断周围的8格的周围8格是否有地雷,一直递归下去!akI中国设计秀
akI中国设计秀
上面两句虽然很绕口,但也是扫雷的核心算法。akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
【三】遍历周围8格akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1     private void CheckLable(int x, int y)akI中国设计秀
2         {akI中国设计秀
3             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
4             {akI中国设计秀
5                 num = 0;akI中国设计秀
6                 num = GetCount(x, y);akI中国设计秀
7                 if (num == 8)akI中国设计秀
8                 {akI中国设计秀
9                     num = 0;akI中国设计秀
10                     string tag = buttons[x, y].Tag.ToString();akI中国设计秀
11                     buttons[x, y].Tag = 0;akI中国设计秀
12                     if (labels[x, y].Image == null && tag != "0")akI中国设计秀
13                     {akI中国设计秀
14                         x++;akI中国设计秀
15                         RemoveButton(x, y);akI中国设计秀
16                         y++;akI中国设计秀
17                         RemoveButton(x, y);akI中国设计秀
18                         x--;akI中国设计秀
19                         RemoveButton(x, y);akI中国设计秀
20                         x--;akI中国设计秀
21                         RemoveButton(x, y);akI中国设计秀
22                         y--;akI中国设计秀
23                         RemoveButton(x, y);akI中国设计秀
24                         y--;akI中国设计秀
25                         RemoveButton(x, y);akI中国设计秀
26                         x++;akI中国设计秀
27                         RemoveButton(x, y);akI中国设计秀
28                         x++;akI中国设计秀
29                         RemoveButton(x, y);akI中国设计秀
30                         if (tag != "0")akI中国设计秀
31                         {akI中国设计秀
32                             num = 0;akI中国设计秀
33                             Recursion(x, y);akI中国设计秀
34                         }akI中国设计秀
35                     }akI中国设计秀
36                 }akI中国设计秀
37                 elseakI中国设计秀
38                 {akI中国设计秀
39                     if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
40                     {akI中国设计秀
41                         labels[x, y].Text = (8 - num).ToString();akI中国设计秀
42 akI中国设计秀
43                         num = 0;akI中国设计秀
44                         return;akI中国设计秀
45                     }akI中国设计秀
46                 }akI中国设计秀
47             }akI中国设计秀
48         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
【四】计算雷的个数akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1   private int GetCount(int x, int y)akI中国设计秀
2         {akI中国设计秀
3 akI中国设计秀
4             temp2 = 0;akI中国设计秀
5             x++;akI中国设计秀
6             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
7             {akI中国设计秀
8                 if (labels[x, y].Image == null)akI中国设计秀
9                 {akI中国设计秀
10                     temp2++;akI中国设计秀
11                 }akI中国设计秀
12             }akI中国设计秀
13             elseakI中国设计秀
14             { temp2++; }akI中国设计秀
15 akI中国设计秀
16             y++;akI中国设计秀
17             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
18             {akI中国设计秀
19                 if (labels[x, y].Image == null)akI中国设计秀
20                 {akI中国设计秀
21                     temp2++;akI中国设计秀
22                 }akI中国设计秀
23             }akI中国设计秀
24             elseakI中国设计秀
25             { temp2++; }akI中国设计秀
26 akI中国设计秀
27             x--;akI中国设计秀
28             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
29             {akI中国设计秀
30                 if (labels[x, y].Image == null)akI中国设计秀
31                 {akI中国设计秀
32                     temp2++;akI中国设计秀
33                 }akI中国设计秀
34             }akI中国设计秀
35             elseakI中国设计秀
36             { temp2++; }akI中国设计秀
37             x--;akI中国设计秀
38             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
39             {akI中国设计秀
40                 if (labels[x, y].Image == null)akI中国设计秀
41                 {akI中国设计秀
42                     temp2++;akI中国设计秀
43                 }akI中国设计秀
44             }akI中国设计秀
45             elseakI中国设计秀
46             { temp2++; }akI中国设计秀
47             y--;akI中国设计秀
48             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
49             {akI中国设计秀
50                 if (labels[x, y].Image == null)akI中国设计秀
51                 {akI中国设计秀
52                     temp2++;akI中国设计秀
53                 }akI中国设计秀
54             }akI中国设计秀
55             elseakI中国设计秀
56             { temp2++; }akI中国设计秀
57             y--;akI中国设计秀
58             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
59             {akI中国设计秀
60                 if (labels[x, y].Image == null)akI中国设计秀
61                 {akI中国设计秀
62                     temp2++;akI中国设计秀
63                 }akI中国设计秀
64             }akI中国设计秀
65             elseakI中国设计秀
66             { temp2++; }akI中国设计秀
67             x++;akI中国设计秀
68             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
69             {akI中国设计秀
70                 if (labels[x, y].Image == null)akI中国设计秀
71                 {akI中国设计秀
72                     temp2++;akI中国设计秀
73                 }akI中国设计秀
74             }akI中国设计秀
75             elseakI中国设计秀
76             { temp2++; }akI中国设计秀
77             x++;akI中国设计秀
78             if (x < Xcount && x >= 0 && y >= 0 && y < Ycount)akI中国设计秀
79             {akI中国设计秀
80                 if (labels[x, y].Image == null)akI中国设计秀
81                 {akI中国设计秀
82                     temp2++;akI中国设计秀
83                 }akI中国设计秀
84             }akI中国设计秀
85             elseakI中国设计秀
86             { temp2++; }akI中国设计秀
87 akI中国设计秀
88             return temp2;akI中国设计秀
89         }akI中国设计秀
akI中国设计秀
akI中国设计秀
    akI中国设计秀
akI中国设计秀
【五】递归akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1    private void Recursion(int x, int y)akI中国设计秀
2         {akI中国设计秀
3             CheckLable(x, y);akI中国设计秀
4             y++;akI中国设计秀
5             CheckLable(x, y);akI中国设计秀
6             y++;akI中国设计秀
7             CheckLable(x, y);akI中国设计秀
8             x--;akI中国设计秀
9             CheckLable(x, y);akI中国设计秀
10             x--;akI中国设计秀
11             CheckLable(x, y);akI中国设计秀
12             y--;akI中国设计秀
13             CheckLable(x, y);akI中国设计秀
14             y--;akI中国设计秀
15             CheckLable(x, y);akI中国设计秀
16             x++;akI中国设计秀
17             CheckLable(x, y);akI中国设计秀
18 akI中国设计秀
19         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
【六】重新来一盘akI中国设计秀
akI中国设计秀
代码 akI中国设计秀
1    public void ReStart()akI中国设计秀
2         {akI中国设计秀
3             this.Controls.Clear();akI中国设计秀
4             InitializeComponent();akI中国设计秀
5             temp2 = 0;akI中国设计秀
6             x = 0;akI中国设计秀
7             y = 0;akI中国设计秀
8             indexOfLable = 0;akI中国设计秀
9             num = 0;akI中国设计秀
10             AddButton();akI中国设计秀
11             CreateLable();akI中国设计秀
12         }akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
akI中国设计秀
留两件事情给大家做,一改成用户控件,二给Lable添加双击事件(左右键一起按)!源码下载 ==> /Files/zhanglei644213943/单机版扫雷.rarakI中国设计秀
akI中国设计秀
 akI中国设计秀

本文引用地址:/bc/article_46186.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明