有闲情就试着写了一个扫雷的小游戏,但是很多Bug。哈哈哈

一、准备工作

       首先我们了解一下扫雷的游戏规则:

  1.  扫雷游戏由雷、棋盘、空格、数字等基本属性组成;
  2. 当鼠标点击棋子时棋子为雷时,游戏结束;;
  3. 当鼠标点击棋子,棋子不为雷时则以该棋子为原点辐射至以该棋子为中心组成的九宫中查找雷,除去棋子自身九宫内有几颗雷,棋子的数字则显示该数量。
  4. 当鼠标点击棋子,棋子不为雷且九宫内无雷时,发生爆炸效应,将以该棋子为原点辐射周边所有为空的棋子,一一爆开。
  5. 当所有不为雷的棋子全部翻开时,游戏胜利

        好了我们了解了大致的规则之后就可以开始构思该游戏了!

       首先我们需要建立一个棋盘、棋盘大小在选择难度等级时确定。而后我们就要在棋盘上生成一些随机的坐标来代表雷的位置,再后来我们就可以依据已有的雷的坐标来确定每一个棋子在期盼中应该是数字亦或是空白棋子了。怎么样是不是非常简单!加纳接下来就是代码的实现。走起。

二、代码实现

   开发环境没有什么要求,因为我的电脑上只装了vs 2012。所以就近原则,我们就用winform来开发一款扫雷桌面小游戏吧!

第一步:

1. 【创建难度等级窗口】

        首先我们需要一个类似于登录的窗口来选择游戏难度,所以我们创建了一个窗体命名为Seting;让后添加了一个lable、一个ComboBox用来存放难度、一个按钮调出游戏棋盘;

2.【为下拉框赋值】

        随后我们需要为下拉框添加一些元素,你可以在窗体load时写到代码里头,这里我们直接在属性的items集合中添加难度选项;          

 

3. 【呼出棋盘】

        再添加难度后我们双击开始游戏按钮,在单单击事件中呼出棋盘(别忘了添加一个棋盘窗体);

 

 第二步:

1.  【创建公共对象类】

        加纳!容器我们有了,所有现在我们要为容器添加棋盘。还记得在Seting窗口添加的难度下拉框吗?我们要在棋盘窗体引用他门,所以我们不得不创建一个存放公共对象、以及公共方法的类了。右击程序集添加一个类并命名为BaseDataObject,其内我们声明如下对象;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ToolsCollection
{
    public static class BaseDataObject
    {
        //游戏规则:
        //我们看序号 1 ,以我们画圈的哪个数字 1为中心画一个九宫格,此时九宫格内只有一个方块,而我们这个中心数字又
        //是 1,表明以这个数字为中心的九宫格内的八个方块里有一个雷,并且,此时这个九宫格内只有一个方块还没有点开,
        //其他地方都点开了并且显示了数字说明不是雷,因此这一个方块里一定是雷,我们插上小旗表明已经排除此处是雷。

        //我们再来看序号 2,同样以我们画圈的那个数字 1 为中心画一个九宫格,但由于九宫格最底下那一行已经超出了游戏
        //范围,因此在边界线上的数字为中心画九宫格只需要考虑九宫格边界线以内的情况就可以。同理,此时中心数字是 1 
        //表明现在这个九宫格内的八个方块有一个一定是雷,由于只有一个方块没有排除,其他均已排除并显示数字表明不是
        //雷,只有这最有一个方块没排除,因此一定是雷。    

        //最后,如果中心数字是 2  哪以中心数字 2 为九宫格内的八个方块内一定有两个雷,其他数字同理。
        //现在,应该没有人不会了吧。

        /// <summary>
        /// 游戏难度
        /// </summary>
        public static int GameLevl { get; set; }
        /// <summary>
        /// 游戏难度对应的按钮行、列数量;雷的数量
        /// </summary>
        public static int[] arrGameLevl = new int[] { 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45 };
        /// <summary>
        /// 雷的坐标
        /// </summary>
        public static int[,] BoomIndex = new int[45, 2];
        /// <summary>
        /// 存放雷、数字、空板的位置信息:key为坐标,values为雷之类的
        /// </summary>
        public static Dictionary<string, string> DicItemTypeAndValue = new Dictionary<string, string>();

        /// <summary>
        /// 存放雷、数字、空板的状态信息:key为坐标,values是否翻开的
        /// </summary>
        public static Dictionary<string, string> DicItemViewState = new Dictionary<string, string>();

        /// <summary>
        /// 回发。
        /// </summary>
        public static bool IsBackPost { get; set; }

        /// <summary>
        /// 游戏状体枚举:0默认状态、1游戏胜利、2游戏失败(1、2都为游戏结束)
        /// </summary>
        public  enum GameStae
        {
            deauft = 0,
            Victory = 1,
            GameOver = 2
        }
        /// <summary>
        /// 监听游戏状态
        /// </summary>
        public static Queue<GameStae> ListenGameState =new Queue<GameStae>();
        /// <summary>
        /// 监听空白按钮
        /// </summary>
        public static Queue<string> ListenEmptyButton = new Queue<string>();


        public static Form form { get; set; }
        public static Label lb { get; set; }
         

    }
}

2. 【创建棋盘】

        好了现在我们有了公共对象,接下来就是声明公共方法类了。右击程序集添加类并命名为Functions,打开它在这里我们可以声明创建棋盘的方法。创建棋盘的思路为:根据选择的难度的基础上进行嵌套循环,生成棋盘的x、y轴。又因生成棋子时需要辐射棋子为中心的九宫的内容,所以我们要在以上基础上加多两行两列。但是,该两行两列并不作为正式棋盘上的组成部分,所以在窗体加载时将其大小设置为一个像素,起到隐藏的效果;

/// <summary>
        /// 生成棋盘
        /// </summary>
        /// <param name="count"></param>
        private void CreateButton(int count)
        {
            for (int row = 0; row < count + 2; row++)
            {
                for (int col = 0; col < count + 2; col++)
                {
                    if (row > 0 && row < count + 1 && col > 0 && col < count + 1)
                    {
                        Button btn = new Button();
                        btn.Margin = new Padding(0);
                        btn.Location = new System.Drawing.Point(1 + (row * 31), 26 + (col * 31));
                        btn.Name = "btn_" + col + row;
                        btn.Size = new System.Drawing.Size(30, 30);
                        btn.TabIndex = int.Parse(col + "" + row);
                        btn.Text = "";
                        btn.TextAlign = ContentAlignment.MiddleCenter;
                        btn.UseVisualStyleBackColor = true;
                        this.Controls.Add(btn);
                    }
                    else
                    {
                        Button btn = new Button();
                        btn.Margin = new Padding(0);
                        btn.Location = new System.Drawing.Point(1 + (row * 31), 26 + (col * 31));
                        btn.Name = "btn_" + col + row;
                        btn.Size = new System.Drawing.Size(1, 1);
                        btn.TabIndex = int.Parse(col + "" + row);
                        btn.Text = "";
                        btn.TextAlign = ContentAlignment.MiddleCenter;
                        btn.UseVisualStyleBackColor = true;
                        this.Controls.Add(btn);
                    }


                }
            }
        }

3.【创建雷】

         有了棋盘我们为棋盘生成一些雷,雷的数量默认为难度等级。生成雷我们需要两个random随机数对象,用来在棋盘行和列中随机生成雷的坐标(x,y)。该方法传入难度等级来确定生成几颗雷,生成之后将雷放入一个二维数组保存。在循环执行之后判断是否有重复的雷(坐标重复)生成如果有则进行递归再次生成;

        /// <summary>
        /// 创建雷的坐标
        /// </summary>
        /// <returns></returns>
        public static void CreateBoomIndex(int levl)
        {
            Random xindex = new Random();
            Thread.Sleep(1000);
            Random yindex = new Random();
            for (int i = 0; i < levl; i++)
            {
                int x = xindex.Next(1, levl + 1);
                int y = yindex.Next(1, levl + 1);
                BaseDataObject.BoomIndex[i, 0] = x;
                BaseDataObject.BoomIndex[i, 1] = y;
            }
            if (GetDistnand(levl) > 0) { CreateBoomIndex(levl); }
        }
        /// <summary>
        /// 判断是否有重复的两个雷
        /// </summary>
        /// <returns></returns>
        public static int GetDistnand(int levl)
        {
            int result = 0;
            for (int i = 0; i < levl; i++)
            {
                for (int j = 0; j < levl; j++)
                {
                    if (i != j && (BaseDataObject.BoomIndex[i, 0] == BaseDataObject.BoomIndex[j, 0] && BaseDataObject.BoomIndex[i, 1] == BaseDataObject.BoomIndex[j, 1]))
                    {
                        result += 1;
                    }
                }
            }
            return result;
        }

 4.【创建棋子类型与棋子状态】

        现在我们回顾一下,我们有了棋盘的容器,创建了棋盘,又创建了棋盘上的雷,接下来就差根据雷的位置生成数字和空白棋子这一步了!那么我们要如何去算出各个除去雷之后棋子背后应该是数字还是空白呢?很简单,我们只需要从第一行第一列开始进行循环,以每行每列为九宫中心,行和列各减一位再循环三次,每次获得的(x,y)组合于保存雷的数组中进行比对,将棋子类型如以下代码中的逻辑保存到字典中,值得一说的是我们的坐标恰恰是要作为字典中的Key来进行保存的,棋子的类型则是Value;除此之外我们还需要为其添加一个翻开还是未翻开的状态属性,实现放肆与棋子类型的保存方式如出一辙,所以我们就在生成棋子类型是一并生成棋子状态了,待到点击事件时将其重新赋值;

        /// <summary>
        /// 根据已经随机生成的雷,算出每个按钮应该是什么,数字或者空白亦或是雷,并将其添加进字典中;
        /// 另外将不是雷的坐标绑定到是否翻开的字典中去,默认为Close 未翻开
        /// </summary>
        /// <param name="index"></param>
        public static void GetItemType(int levl)
        {
            for (int row = 1; row < levl + 1; row++)
            {

                for (int col = 1; col < levl + 1; col++)
                {
                    int boomCount = 0;
                    bool b = true;
                    for (int g = 0; g < levl; g++)
                    {
                        if (col == BaseDataObject.BoomIndex[g, 0] && row == BaseDataObject.BoomIndex[g, 1])
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, "Boom");
                            b = false;
                            break;

                        }
                    }
                    if (b)
                    {
                        for (int y = row - 1; y < row + 2; y++)
                        {
                            for (int x = col - 1; x < col + 2; x++)
                            {
                                for (int g = 0; g < levl; g++)
                                {
                                    if (x == BaseDataObject.BoomIndex[g, 0] && y == BaseDataObject.BoomIndex[g, 1])
                                    {
                                        boomCount += 1;
                                    }
                                }

                            }

                        }
                        if (boomCount > 0)
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, boomCount + "");
                            BaseDataObject.DicItemViewState.Add(row + "" + col, "Close");
                        }
                        else
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, "Empty");
                            BaseDataObject.DicItemViewState.Add(row + "" + col, "Close");
                        }
                    }


                }
            }

        }

 第三步:

1.【刷新容器】

        有了上面的方法作为基石,相信你已经清楚接下来要干什么了,没错就是刷新棋盘的容器,将棋盘棋子都添加到容器中并显示出来。我们创建一个空白窗体命名为BoomGame,将窗体FormBorderStlye属性设置为None。以防待会儿生成棋盘时,窗体边框影响我们的布局。方法中我们根据棋子的大小加上棋子Magin的大小乘以难度等级+2就得到了我们希望的容器的大小;在这之前我们添加一个Panel存放lable、Button等提示和操作的控件。在容器Load事件中调用该方法,具体方法如下;

​
        /// <summary>
        /// 刷新棋盘
        /// </summary>
        public void RefreshForm()
        {

            //根据难度加载窗体大小
            rccount = BaseDataObject.arrGameLevl[BaseDataObject.GameLevl];
            this.Width = (31 * (rccount + 2)) + 1;
            this.Height = (31 * (rccount + 2)) + 26;
            //添加窗体头部
            Panel p = new Panel();
            p.Name = "P_Top";
            p.Size = new System.Drawing.Size((31 * (rccount + 2)) - 1, 25);
            p.Margin = new Padding(0);
            p.Location = new System.Drawing.Point(1, 1);
            p.BackColor = Color.CadetBlue;
            this.Controls.Add(p);
            //添加窗体名称的label
            Label lb = new Label();
            lb.Name = "lb";
            lb.Text = "仙逆扫雷";
            lb.ForeColor = Color.Black;
            lb.Location = new System.Drawing.Point(1, 7);
            p.Controls.Add(lb);
            BaseDataObject.lb = lb;

            //关闭窗口退出游戏
            Button btn = new Button();
            btn.Margin = new Padding(0);
            btn.Location = new System.Drawing.Point(p.Width - 40, 2);
            btn.Name = "btn_Exit";
            btn.Size = new System.Drawing.Size(30, 20);
            btn.TabIndex = 1000;
            btn.BackColor = Color.Red;
            btn.ForeColor = Color.Red;
            btn.Text = "X";
            btn.TextAlign = ContentAlignment.MiddleCenter;
            btn.UseVisualStyleBackColor = true;          
            //绑定鼠标单击关闭按钮的单击事件
            btn.Click += (object o, EventArgs e) =>
            {
                this.Close();
                Seting s = new Seting();
                s.Show();
            };
            p.Controls.Add(btn);
            //创建棋盘
            CreateButton(rccount);
            //创建雷
            Functions.CreateBoomIndex(BaseDataObject.arrGameLevl[BaseDataObject.GameLevl]);
            //创建棋子类型、棋子状态
            Functions.GetItemType(BaseDataObject.arrGameLevl[BaseDataObject.GameLevl]);       
            //让第三人获得焦点
            BaseDataObject.lb.Focus();



        }

​

 做完上面几步我们点击运行可以得到如下效果打开难度选择窗口选择难度后点击开始游戏,弹出容器;

 2.【绑定单击事件】

        没错如你所想仅仅有了页面是远远不够滴,我们要去给每个棋子绑定控件,来监视玩家的行为,以获得当前点击的棋子的对象从而对其进行操作;在方法中我们传入窗体、以及窗体的Contol.controls对象进行遍历,如果该Control对象为Button则给他绑定单击事件,事件判断该控件是否是当前焦点对象,是的话则将其坐标放入棋子类型与坐标的字典中进行匹配;并更新该控件的状态;

        /// <summary>
        /// 设置按钮背景图片
        /// </summary>
        /// <param name="controls"></param>
        public static void SetButtnImage(Control.ControlCollection controls, int levl, Form f)
        {
            foreach (Control c in controls)
            {
                if (c is Button)
                {
                    c.Click += (object sender, EventArgs e) =>
                    {
                        if (c.Focused && BaseDataObject.DicItemTypeAndValue.Keys.Count > 0)
                        {
                            string key = c.Name.Split('_')[1].ToString();
                            string value = BaseDataObject.DicItemTypeAndValue[key];
                            switch (value)
                            {
                                case "Boom":
                                    Button Boom = c as Button;
                                    Boom.BackgroundImageLayout = ImageLayout.Zoom;
                                    Boom.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\Boom.bmp");
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.GameOver);
                                    break;
                                case "1":
                                    Button a = c as Button;
                                    a.BackgroundImageLayout = ImageLayout.Zoom;
                                    a.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\1.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "2":
                                    Button b = c as Button;
                                    b.BackgroundImageLayout = ImageLayout.Zoom;
                                    b.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\2.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "3":
                                    Button d = c as Button;
                                    d.BackgroundImageLayout = ImageLayout.Zoom;
                                    d.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\3.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "4":
                                    Button eeee = c as Button;
                                    eeee.BackgroundImageLayout = ImageLayout.Zoom;
                                    eeee.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\4.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "5":
                                    Button fff = c as Button;
                                    fff.BackgroundImageLayout = ImageLayout.Zoom;
                                    fff.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\5.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "6":
                                    Button g = c as Button;
                                    g.BackgroundImageLayout = ImageLayout.Zoom;
                                    g.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\6.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "7":
                                    Button h = c as Button;
                                    h.BackgroundImageLayout = ImageLayout.Zoom;
                                    h.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\7.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "8":
                                    Button i = c as Button;
                                    i.BackgroundImageLayout = ImageLayout.Zoom;
                                    i.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\8.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "Empty":
                                    BoomEmpty(key, levl);
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;

                            }


                            if (BaseDataObject.ListenGameState != null && BaseDataObject.ListenGameState.Count > 0)
                            {
                                BaseDataObject.GameStae state = BaseDataObject.ListenGameState.Dequeue();
                                switch (state)
                                {
                                    case BaseDataObject.GameStae.deauft:
                                        break;
                                    case BaseDataObject.GameStae.GameOver:
                                        DialogResult dresult;
                                        dresult = MessageBox.Show("你已道消!!! 继续游戏点Yes,点NO退出游戏。", "失败!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                                        if (dresult == DialogResult.Yes)
                                        {
                                            BaseDataObject.DicItemViewState.Clear();
                                            BaseDataObject.ListenEmptyButton.Clear();
                                            BaseDataObject.DicItemTypeAndValue.Clear();
                                            BoomGame boomgame = new BoomGame();
                                            boomgame.BeginInvoke(new Action(() => {
                                                boomgame.RefreshForm();
                                            }),null);
                                            
                                          
                                        }
                                        else
                                        {
                                            BaseDataObject.form.Close();

                                        }

                                        break;
                                }



                            }

                        }

                    };

                }
            }

        }

 3.【互乘起爆符】        

        么的错就是集中一点进行爆破的术法,我愿称之为禁术。嗯。这个术的作用就是当你点击到一个空白棋子的时候,跟他相邻近的空白棋子会顺带爆开。这个功能的核心思路就是集中一点进行爆破!获取到一个空白棋子后判断他是否为空,如果为空则以该坐标为起点,向行的上下限进行索引,为空则将其坐标放入一个队列中,直至不为空为止。而后回到该坐标,判断左右是否为空,为空则向左向右递归直到左右也都不为空为止。注意递归时设置好标记,不要出现无限循环之类的情况导致报错;

        /// <summary>
        /// 当前点击的按钮如果是空白,则将其旁边所有空白一起带出
        /// </summary>
        /// <param name="index"></param>
        public static void BoomEmpty(string index, int levl)
        {
            for (int row = int.Parse(index.Substring(0, 1)); row > 0; row--)
            {
                if (BaseDataObject.DicItemTypeAndValue[row + index.Substring(1, 1)] == "Empty")
                {
                    BaseDataObject.ListenEmptyButton.Enqueue(row + index.Substring(1, 1));
                    BaseDataObject.DicItemViewState[row + index.Substring(1, 1)] = "Open";
                }
                else
                {
                    break;
                }
            } for (int row = int.Parse(index.Substring(0, 1)) + 1; row < levl + 1; row++)
            {
                if (BaseDataObject.DicItemTypeAndValue[row + index.Substring(1, 1)] == "Empty")
                {
                    BaseDataObject.ListenEmptyButton.Enqueue(row + index.Substring(1, 1));
                    BaseDataObject.DicItemViewState[row + index.Substring(1, 1)] = "Open";
                }
                else
                {
                    break;
                }
            }
            if (!left && int.Parse(index.Substring(1, 1)) - 1 > 0 && BaseDataObject.DicItemTypeAndValue[index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) - 1)] == "Empty")
            {
                string Leftindex = index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) - 1);
                BoomEmpty(Leftindex, levl);
                left = true;
            }
            else
            {
                left = true;
            }
            if (!right && int.Parse(index.Substring(1, 1)) + 1 < levl + 1 && BaseDataObject.DicItemTypeAndValue[index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) + 1)] == "Empty")
            {
                string Rightindex = index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) + 1);
                BoomEmpty(Rightindex, levl);
                right = true;
            }
            else
            {
                right = true;
            }

        }

 4.【创建线程】

        撒!当你做到这里,你会发现你的游戏依然无法跑起来。没错你猜对了!就是因为万有引力引不动释迦牟尼的兰博基尼。你还差了最后一步,也就是让诸如设置棋子背景图片、捕获单击事件等动作自行跑起来的狗腿子,对就是线程跑腿的事情就让他们去干吧。在这之前我们在容器的Load事件中将公共对象的IsBackPost属性赋值为ture(模拟回发),之所以这么干是为了防止在窗体刚刚加载的时候程序出点BUG导致我们尴尬!然后在容器Shown事件中将其改为false。好了开始线程的创建;

        private Thread threadSetbtnimg;
        private Thread threadSetEmptyBtn;
        private Thread threadGameState;
        /// <summary>
        /// 动态设置棋盘相应坐标的图片
        /// </summary>
        private void Thread_SetButtnImage()
        {

            while (true)
            {
                if (!BaseDataObject.IsBackPost)
                {
                    Functions.SetButtnImage(this.Controls, BaseDataObject.arrGameLevl[BaseDataObject.GameLevl], this);
                }

                Thread.Sleep(200);
            }

        }
        /// <summary>
        /// 爆开空白按钮附近的空白按钮
        /// </summary>
        private void Thread_ListenEmptyBtn()
        {
            while (true)
            {
                if (!BaseDataObject.IsBackPost && BaseDataObject.ListenEmptyButton.Count > 0)
                {
                    string index = BaseDataObject.ListenEmptyButton.Dequeue();
                    Functions.SetButtnImage(this.Controls, index);
                }

                Thread.Sleep(10);
            }

        }
        /// <summary>
        /// 监听游戏状态
        /// </summary>
        private void Thread_ListenGameState()
        {

            while (true)
            {
                if (!BaseDataObject.IsBackPost)
                {
                    int count = 0;
                    for (int i = 0; i < BaseDataObject.DicItemViewState.Count; i++)
                    {
                        if (BaseDataObject.DicItemViewState.Values.ToList()[i] == "Close")
                        {
                            count += 1;
                        }

                    }
                    if (count == 0)
                    {
                        DialogResult dresult;
                        dresult = MessageBox.Show("Victory!!! 继续游戏点Yes,点NO退出游戏。", "胜利!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                        if (dresult == DialogResult.Yes)
                        {
                            BaseDataObject.DicItemViewState.Clear();
                            BaseDataObject.ListenEmptyButton.Clear();
                            BaseDataObject.DicItemTypeAndValue.Clear();
                            BeginInvoke(new Action(() =>
                            {
                                RefreshForm();
                            }), null);
                        }
                        else
                        {
                            this.Close();
                        }
                    }
                }


                Thread.Sleep(10);
            }

        }

        /// <summary>
        /// 游戏加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BoomGame_Load(object sender, EventArgs e)
        {
            BaseDataObject.form = this;
            BaseDataObject.IsBackPost = true;
            RefreshForm();
            threadSetbtnimg = new Thread(Thread_SetButtnImage);
            threadSetbtnimg.Start();
            threadSetEmptyBtn = new Thread(Thread_ListenEmptyBtn);
            threadSetEmptyBtn.Start();
            threadGameState = new Thread(Thread_ListenGameState);
            threadGameState.Start();


        }

 5.最后不要将你创建的线程在窗体关闭或游戏结束后残忍的杀死哦!游戏大体思路就是如此了。什么?你说上班摸鱼怕被发现?我的建议是不妨试着写几个游戏自己玩,哈哈哈~

最后附上源码

BaseDataObject.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ToolsCollection
{
    public static class BaseDataObject
    {
        //游戏规则:
        //我们看序号 1 ,以我们画圈的哪个数字 1为中心画一个九宫格,此时九宫格内只有一个方块,而我们这个中心数字又
        //是 1,表明以这个数字为中心的九宫格内的八个方块里有一个雷,并且,此时这个九宫格内只有一个方块还没有点开,
        //其他地方都点开了并且显示了数字说明不是雷,因此这一个方块里一定是雷,我们插上小旗表明已经排除此处是雷。

        //我们再来看序号 2,同样以我们画圈的那个数字 1 为中心画一个九宫格,但由于九宫格最底下那一行已经超出了游戏
        //范围,因此在边界线上的数字为中心画九宫格只需要考虑九宫格边界线以内的情况就可以。同理,此时中心数字是 1 
        //表明现在这个九宫格内的八个方块有一个一定是雷,由于只有一个方块没有排除,其他均已排除并显示数字表明不是
        //雷,只有这最有一个方块没排除,因此一定是雷。    

        //最后,如果中心数字是 2  哪以中心数字 2 为九宫格内的八个方块内一定有两个雷,其他数字同理。
        //现在,应该没有人不会了吧。

        /// <summary>
        /// 游戏难度
        /// </summary>
        public static int GameLevl { get; set; }
        /// <summary>
        /// 游戏难度对应的按钮行、列数量;雷的数量
        /// </summary>
        public static int[] arrGameLevl = new int[] { 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45 };
        /// <summary>
        /// 雷的坐标
        /// </summary>
        public static int[,] BoomIndex = new int[45, 2];
        /// <summary>
        /// 存放雷、数字、空板的位置信息:key为坐标,values为雷之类的
        /// </summary>
        public static Dictionary<string, string> DicItemTypeAndValue = new Dictionary<string, string>();

        /// <summary>
        /// 存放雷、数字、空板的状态信息:key为坐标,values是否翻开的
        /// </summary>
        public static Dictionary<string, string> DicItemViewState = new Dictionary<string, string>();

        /// <summary>
        /// 回发。
        /// </summary>
        public static bool IsBackPost { get; set; }

        /// <summary>
        /// 游戏状体枚举:0默认状态、1游戏胜利、2游戏失败(1、2都为游戏结束)
        /// </summary>
        public  enum GameStae
        {
            deauft = 0,
            Victory = 1,
            GameOver = 2
        }
        /// <summary>
        /// 监听游戏状态
        /// </summary>
        public static Queue<GameStae> ListenGameState =new Queue<GameStae>();
        /// <summary>
        /// 监听空白按钮
        /// </summary>
        public static Queue<string> ListenEmptyButton = new Queue<string>();


        public static Form form { get; set; }
        public static Label lb { get; set; }
         

    }
}

 Functions.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;

namespace ToolsCollection
{
    public static class Functions
    {

        private static bool b = false;
        /// <summary>
        /// 创建雷的坐标
        /// </summary>
        /// <returns></returns>
        public static void CreateBoomIndex(int levl)
        {
            Random xindex = new Random();
            Thread.Sleep(1000);
            Random yindex = new Random();
            for (int i = 0; i < levl; i++)
            {
                int x = xindex.Next(1, levl + 1);
                int y = yindex.Next(1, levl + 1);
                BaseDataObject.BoomIndex[i, 0] = x;
                BaseDataObject.BoomIndex[i, 1] = y;
            }
            if (GetDistnand(levl) > 0) { CreateBoomIndex(levl); }
        }
        /// <summary>
        /// 判断是否有重复的两个雷
        /// </summary>
        /// <returns></returns>
        public static int GetDistnand(int levl)
        {
            int result = 0;
            for (int i = 0; i < levl; i++)
            {
                for (int j = 0; j < levl; j++)
                {
                    if (i != j && (BaseDataObject.BoomIndex[i, 0] == BaseDataObject.BoomIndex[j, 0] && BaseDataObject.BoomIndex[i, 1] == BaseDataObject.BoomIndex[j, 1]))
                    {
                        result += 1;
                    }
                }
            }
            return result;
        }

        /// <summary>
        /// 根据已经随机生成的雷,算出每个按钮应该是什么,数字或者空白亦或是雷,并将其添加进字典中;
        /// 另外将不是雷的坐标绑定到是否翻开的字典中去,默认为Close 未翻开
        /// </summary>
        /// <param name="index"></param>
        public static void GetItemType(int levl)
        {
            for (int row = 1; row < levl + 1; row++)
            {

                for (int col = 1; col < levl + 1; col++)
                {
                    int boomCount = 0;
                    bool b = true;
                    for (int g = 0; g < levl; g++)
                    {
                        if (col == BaseDataObject.BoomIndex[g, 0] && row == BaseDataObject.BoomIndex[g, 1])
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, "Boom");
                            b = false;
                            break;

                        }
                    }
                    if (b)
                    {
                        for (int y = row - 1; y < row + 2; y++)
                        {
                            for (int x = col - 1; x < col + 2; x++)
                            {
                                for (int g = 0; g < levl; g++)
                                {
                                    if (x == BaseDataObject.BoomIndex[g, 0] && y == BaseDataObject.BoomIndex[g, 1])
                                    {
                                        boomCount += 1;
                                    }
                                }

                            }

                        }
                        if (boomCount > 0)
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, boomCount + "");
                            BaseDataObject.DicItemViewState.Add(row + "" + col, "Close");
                        }
                        else
                        {
                            BaseDataObject.DicItemTypeAndValue.Add(row + "" + col, "Empty");
                            BaseDataObject.DicItemViewState.Add(row + "" + col, "Close");
                        }
                    }


                }
            }

        }
        private static bool left = false;
        private static bool right = false;
        /// <summary>
        /// 当前点击的按钮如果是空白,则将其旁边所有空白一起带出
        /// </summary>
        /// <param name="index"></param>
        public static void BoomEmpty(string index, int levl)
        {
            for (int row = int.Parse(index.Substring(0, 1)); row > 0; row--)
            {
                if (BaseDataObject.DicItemTypeAndValue[row + index.Substring(1, 1)] == "Empty")
                {
                    BaseDataObject.ListenEmptyButton.Enqueue(row + index.Substring(1, 1));
                    BaseDataObject.DicItemViewState[row + index.Substring(1, 1)] = "Open";
                }
                else
                {
                    break;
                }
            } for (int row = int.Parse(index.Substring(0, 1)) + 1; row < levl + 1; row++)
            {
                if (BaseDataObject.DicItemTypeAndValue[row + index.Substring(1, 1)] == "Empty")
                {
                    BaseDataObject.ListenEmptyButton.Enqueue(row + index.Substring(1, 1));
                    BaseDataObject.DicItemViewState[row + index.Substring(1, 1)] = "Open";
                }
                else
                {
                    break;
                }
            }
            if (!left && int.Parse(index.Substring(1, 1)) - 1 > 0 && BaseDataObject.DicItemTypeAndValue[index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) - 1)] == "Empty")
            {
                string Leftindex = index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) - 1);
                BoomEmpty(Leftindex, levl);
                left = true;
            }
            else
            {
                left = true;
            }
            if (!right && int.Parse(index.Substring(1, 1)) + 1 < levl + 1 && BaseDataObject.DicItemTypeAndValue[index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) + 1)] == "Empty")
            {
                string Rightindex = index.Substring(0, 1) + (int.Parse(index.Substring(1, 1)) + 1);
                BoomEmpty(Rightindex, levl);
                right = true;
            }
            else
            {
                right = true;
            }

        }
        public static void SetButtnImage(Control.ControlCollection controls, string index)
        {
            foreach (Control c in controls)
            {
                if (c is Button)
                {
                    Button Empty = c as Button;
                    if (Empty.Name.Split('_')[1] == index)
                    {
                        Empty.BeginInvoke(new Action(() =>
                        {
                            Empty.BackgroundImageLayout = ImageLayout.Zoom;
                            Empty.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\Empty.bmp");
                        }));
                        break;
                    }

                }
            }


        }

        /// <summary>
        /// 设置按钮背景图片
        /// </summary>
        /// <param name="controls"></param>
        public static void SetButtnImage(Control.ControlCollection controls, int levl, Form f)
        {
            foreach (Control c in controls)
            {
                if (c is Button)
                {
                    c.Click += (object sender, EventArgs e) =>
                    {
                        if (c.Focused && BaseDataObject.DicItemTypeAndValue.Keys.Count > 0)
                        {
                            string key = c.Name.Split('_')[1].ToString();
                            string value = BaseDataObject.DicItemTypeAndValue[key];
                            switch (value)
                            {
                                case "Boom":
                                    Button Boom = c as Button;
                                    Boom.BackgroundImageLayout = ImageLayout.Zoom;
                                    Boom.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\Boom.bmp");
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.GameOver);
                                    break;
                                case "1":
                                    Button a = c as Button;
                                    a.BackgroundImageLayout = ImageLayout.Zoom;
                                    a.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\1.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "2":
                                    Button b = c as Button;
                                    b.BackgroundImageLayout = ImageLayout.Zoom;
                                    b.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\2.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "3":
                                    Button d = c as Button;
                                    d.BackgroundImageLayout = ImageLayout.Zoom;
                                    d.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\3.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "4":
                                    Button eeee = c as Button;
                                    eeee.BackgroundImageLayout = ImageLayout.Zoom;
                                    eeee.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\4.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "5":
                                    Button fff = c as Button;
                                    fff.BackgroundImageLayout = ImageLayout.Zoom;
                                    fff.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\5.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "6":
                                    Button g = c as Button;
                                    g.BackgroundImageLayout = ImageLayout.Zoom;
                                    g.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\6.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "7":
                                    Button h = c as Button;
                                    h.BackgroundImageLayout = ImageLayout.Zoom;
                                    h.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\7.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "8":
                                    Button i = c as Button;
                                    i.BackgroundImageLayout = ImageLayout.Zoom;
                                    i.BackgroundImage = Image.FromFile(Application.StartupPath + "\\..\\..\\Img\\8.bmp");
                                    BaseDataObject.DicItemViewState[key] = "Open";
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;
                                case "Empty":
                                    BoomEmpty(key, levl);
                                    BaseDataObject.ListenGameState.Enqueue(BaseDataObject.GameStae.deauft);
                                    break;

                            }


                            if (BaseDataObject.ListenGameState != null && BaseDataObject.ListenGameState.Count > 0)
                            {
                                BaseDataObject.GameStae state = BaseDataObject.ListenGameState.Dequeue();
                                switch (state)
                                {
                                    case BaseDataObject.GameStae.deauft:
                                        break;
                                    case BaseDataObject.GameStae.GameOver:
                                        DialogResult dresult;
                                        dresult = MessageBox.Show("你已道消!!! 继续游戏点Yes,点NO退出游戏。", "失败!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                                        if (dresult == DialogResult.Yes)
                                        {
                                            BaseDataObject.DicItemViewState.Clear();
                                            BaseDataObject.ListenEmptyButton.Clear();
                                            BaseDataObject.DicItemTypeAndValue.Clear();
                                            BoomGame boomgame = new BoomGame();
                                            boomgame.BeginInvoke(new Action(() => {
                                                boomgame.RefreshForm();
                                            }),null);
                                            
                                          
                                        }
                                        else
                                        {
                                            BaseDataObject.form.Close();

                                        }

                                        break;
                                }



                            }

                        }

                    };

                }
            }

        }

    }
}

 BoomGame.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ToolsCollection
{
    public partial class BoomGame : Form
    {
        public BoomGame()
        {
            InitializeComponent();
        }
        private int rccount;
        private Thread threadSetbtnimg;
        private Thread threadSetEmptyBtn;
        private Thread threadGameState;
        /// <summary>
        /// 动态设置棋盘相应坐标的图片
        /// </summary>
        private void Thread_SetButtnImage()
        {

            while (true)
            {
                if (!BaseDataObject.IsBackPost)
                {
                    Functions.SetButtnImage(this.Controls, BaseDataObject.arrGameLevl[BaseDataObject.GameLevl], this);
                }

                Thread.Sleep(200);
            }

        }
        /// <summary>
        /// 爆开空白按钮附近的空白按钮
        /// </summary>
        private void Thread_ListenEmptyBtn()
        {
            while (true)
            {
                if (!BaseDataObject.IsBackPost && BaseDataObject.ListenEmptyButton.Count > 0)
                {
                    string index = BaseDataObject.ListenEmptyButton.Dequeue();
                    Functions.SetButtnImage(this.Controls, index);
                }

                Thread.Sleep(10);
            }

        }
        /// <summary>
        /// 监听游戏状态
        /// </summary>
        private void Thread_ListenGameState()
        {

            while (true)
            {
                if (!BaseDataObject.IsBackPost)
                {
                    int count = 0;
                    for (int i = 0; i < BaseDataObject.DicItemViewState.Count; i++)
                    {
                        if (BaseDataObject.DicItemViewState.Values.ToList()[i] == "Close")
                        {
                            count += 1;
                        }

                    }
                    if (count == 0)
                    {
                        DialogResult dresult;
                        dresult = MessageBox.Show("Victory!!! 继续游戏点Yes,点NO退出游戏。", "胜利!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                        if (dresult == DialogResult.Yes)
                        {
                            BaseDataObject.DicItemViewState.Clear();
                            BaseDataObject.ListenEmptyButton.Clear();
                            BaseDataObject.DicItemTypeAndValue.Clear();
                            BeginInvoke(new Action(() =>
                            {
                                RefreshForm();
                            }), null);
                        }
                        else
                        {
                            this.Close();
                        }
                    }
                }


                Thread.Sleep(10);
            }

        }

        /// <summary>
        /// 游戏加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BoomGame_Load(object sender, EventArgs e)
        {
            BaseDataObject.form = this;
            BaseDataObject.IsBackPost = true;
            RefreshForm();
            threadSetbtnimg = new Thread(Thread_SetButtnImage);
            threadSetbtnimg.Start();
            threadSetEmptyBtn = new Thread(Thread_ListenEmptyBtn);
            threadSetEmptyBtn.Start();
            threadGameState = new Thread(Thread_ListenGameState);
            threadGameState.Start();


        }

        /// <summary>
        /// 刷新棋盘
        /// </summary>
        public void RefreshForm()
        {

            //根据难度加载窗体大小
            rccount = BaseDataObject.arrGameLevl[BaseDataObject.GameLevl];
            this.Width = (31 * (rccount + 2)) + 1;
            this.Height = (31 * (rccount + 2)) + 26;
            //添加窗体头部
            Panel p = new Panel();
            p.Name = "P_Top";
            p.Size = new System.Drawing.Size((31 * (rccount + 2)) - 1, 25);
            p.Margin = new Padding(0);
            p.Location = new System.Drawing.Point(1, 1);
            p.BackColor = Color.CadetBlue;
            this.Controls.Add(p);
            //添加窗体名称的label
            Label lb = new Label();
            lb.Name = "lb";
            lb.Text = "仙逆扫雷";
            lb.ForeColor = Color.Black;
            lb.Location = new System.Drawing.Point(1, 7);
            p.Controls.Add(lb);
            BaseDataObject.lb = lb;

            //关闭窗口退出游戏
            Button btn = new Button();
            btn.Margin = new Padding(0);
            btn.Location = new System.Drawing.Point(p.Width - 40, 2);
            btn.Name = "btn_Exit";
            btn.Size = new System.Drawing.Size(30, 20);
            btn.TabIndex = 1000;
            btn.BackColor = Color.Red;
            btn.ForeColor = Color.Red;
            btn.Text = "X";
            btn.TextAlign = ContentAlignment.MiddleCenter;
            btn.UseVisualStyleBackColor = true;          
            //绑定鼠标单击关闭按钮的单击事件
            btn.Click += (object o, EventArgs e) =>
            {
                this.Close();
                Seting s = new Seting();
                s.Show();
            };
            p.Controls.Add(btn);
            //创建棋盘
            CreateButton(rccount);
            //创建雷
            Functions.CreateBoomIndex(BaseDataObject.arrGameLevl[BaseDataObject.GameLevl]);
            //创建棋子类型、棋子状态
            Functions.GetItemType(BaseDataObject.arrGameLevl[BaseDataObject.GameLevl]);       
            //让第三人获得焦点
            BaseDataObject.lb.Focus();



        }

        /// <summary>
        /// 清空棋盘
        /// </summary>
        private void SetBtnTextAndTabIndex()
        {
            foreach (Control contr in this.Controls)
            {
                if (contr is Panel)
                {
                    foreach (Button btn in contr.Controls)
                    {
                        btn.Text = string.Empty;
                    }
                }
            }

        }
        /// <summary>
        /// 生成棋盘
        /// </summary>
        /// <param name="count"></param>
        private void CreateButton(int count)
        {
            for (int row = 0; row < count + 2; row++)
            {
                for (int col = 0; col < count + 2; col++)
                {
                    if (row > 0 && row < count + 1 && col > 0 && col < count + 1)
                    {
                        Button btn = new Button();
                        btn.Margin = new Padding(0);
                        btn.Location = new System.Drawing.Point(1 + (row * 31), 26 + (col * 31));
                        btn.Name = "btn_" + col + row;
                        btn.Size = new System.Drawing.Size(30, 30);
                        btn.TabIndex = int.Parse(col + "" + row);
                        btn.Text = "";
                        btn.TextAlign = ContentAlignment.MiddleCenter;
                        btn.UseVisualStyleBackColor = true;
                        this.Controls.Add(btn);
                    }
                    else
                    {
                        Button btn = new Button();
                        btn.Margin = new Padding(0);
                        btn.Location = new System.Drawing.Point(1 + (row * 31), 26 + (col * 31));
                        btn.Name = "btn_" + col + row;
                        btn.Size = new System.Drawing.Size(1, 1);
                        btn.TabIndex = int.Parse(col + "" + row);
                        btn.Text = "";
                        btn.TextAlign = ContentAlignment.MiddleCenter;
                        btn.UseVisualStyleBackColor = true;
                        this.Controls.Add(btn);
                    }


                }
            }
        }


        private void BoomGame_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (threadSetbtnimg != null)
            {
                threadSetbtnimg.Abort();
            }
            if (threadSetEmptyBtn != null)
            {
                threadSetEmptyBtn.Abort();
            }
            if (threadGameState != null)
            {
                threadGameState.Abort();
            }
            BaseDataObject.DicItemViewState.Clear();
            BaseDataObject.ListenEmptyButton.Clear();
            BaseDataObject.DicItemTypeAndValue.Clear();
            Application.Exit();
        }

        private void BoomGame_Shown(object sender, EventArgs e)
        {
            BaseDataObject.IsBackPost = false;
        }

        private void BoomGame_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (threadSetbtnimg != null)
            {
                threadSetbtnimg.Abort();
            }
            if (threadSetEmptyBtn != null)
            {
                threadSetEmptyBtn.Abort();
            }
            if (threadGameState != null)
            {
                threadGameState.Abort();
            }
            BaseDataObject.DicItemViewState.Clear();
            BaseDataObject.ListenEmptyButton.Clear();
            BaseDataObject.DicItemTypeAndValue.Clear();
            Application.Exit();
        }


    }
}

 

 Seting.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ToolsCollection
{
    public partial class Seting : Form
    {
        public Seting()
        {
            InitializeComponent();
        }

        private void Btn_Start_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Cbx_Levl.Text))
            {
                BaseDataObject.GameLevl = Cbx_Levl.SelectedIndex;
                BoomGame f = new BoomGame();
                this.Hide();
                f.ShowDialog();
            }
            else {
                MessageBox.Show("请选择难度", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            
        }

        private void Seting_FormClosing(object sender, FormClosingEventArgs e)
        {
            Application.Exit();
        }

        private void Seting_Load(object sender, EventArgs e)
        {

        }
    }
}

 Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ToolsCollection
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Seting());
        }
    }
}

 

 

 

 

 

 

  • 34
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值