C#扫雷(9*9阉割版)

首先写一个类,用来保存每个格子可以携带的信息

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;
        }

    }

结束!

欢迎关注我的微信个人订阅号
C#扫雷(9*9阉割版)_第1张图片
每天多学一点0.0

你可能感兴趣的:(C#,扫雷)