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

来源:互联网 发布:矩阵化为行最简形 编辑:程序博客网 时间:2024/06/05 11:07

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

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

结束!

欢迎关注我的微信个人订阅号
这里写图片描述
每天多学一点0.0

0 0
原创粉丝点击