连连看主程序

来源:互联网 发布:手机超星怎么看网络课 编辑:程序博客网 时间:2024/06/07 02:44
public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        /// <summary>        /// 图像的总数        /// </summary>        private int PicCount;        /// <summary>        /// 方格的边长        /// </summary>        private int BoxWidth;        /// <summary>        /// 容器一行中方格的个数        /// </summary>        private int RowCount;        /// <summary>        /// 容器一列中方格的个数        /// </summary>        private int ColumnCount;        /// <summary>        /// 容器中第一个方格的X坐标        /// </summary>        private int BoxStarX;        /// <summary>        /// 容器中第一个方格的Y坐标        /// </summary>        private int BoxStarY;        /// <summary>        /// 主数组        /// </summary>        private int[,] ArrayPanel;        /// <summary>        /// 削除方格的类型        /// </summary>        private RemoveType RType;        /// <summary>        /// Coord队列 没有找到Count=0,找到为经历的关键 Coord队列        /// </summary>        Queue<Coord> qu = new Queue<Coord>();        private void Form1_Load(object sender, EventArgs e)        {            PicCount=15;            RowCount = 14;            BoxWidth = 50;            ColumnCount = 10;            ArrayPanel = new int[RowCount + 2, ColumnCount + 2];            BoxStarX = (panel1.Width - RowCount * BoxWidth) / 2;            BoxStarY = (panel1.Height - ColumnCount * BoxWidth) / 2;            DrowBox();            Rand();            FillArray();            comboBox1.SelectedIndex = 0;        }        //提示        private void button1_Click(object sender, EventArgs e)        {            Coord crd;            foreach (llkBox llkbox in panel1.Controls)            {                crd = new Coord(llkbox.Name);                AutoFind(crd, llkbox.Text);                if (qu.Count != 0)                {                    break;                }            }            while (qu.Count != 0)            {                crd = qu.Dequeue();                if (panel1.Controls[crd.ToString()] != null)                {                    llkBox lk = (llkBox)panel1.Controls[crd.ToString()];                    lk.IsClickTemp = true;                }                //crd = qu.Dequeue();                //if (panel1.Controls[crd.ToString()]             }        }        //重新排列        private void button2_Click(object sender, EventArgs e)        {            Rand();            FillArray();        }        private void button3_Click(object sender, EventArgs e)        {            panel1.Controls.Clear();            DrowBox();            Rand();            FillArray();            comboBox1.SelectedIndex = 0;        }        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)        {            switch (comboBox1.Text)            {                 case "None":                    RType = RemoveType.None;                    break;                case "X":                    RType = RemoveType.X;                    break;                case "Y":                    RType = RemoveType.Y;                    break;                case "XY":                    RType = RemoveType.XY;                    break;                case "YX":                    RType = RemoveType.YX;                    break;                //case "Diffuse":                //    RType = RemoveType.YX;                //    break;                //case "Shrink":                //    RType = RemoveType.YX;                //    break;            }        }        /// <summary>        /// 左·右方格所对应的Coord        /// </summary>        Coord lcrd, rcrd;        int count = 0;        private void bt_Click(object sender, EventArgs e)        {            llkBox bt = (llkBox)sender;            switch (count)            {                case 0:                    bt.IsClick = true;                    lcrd = new Coord(bt.Name);//textBox1.Text = bt.Text + "--" + bt.Name + "---" + ArrayPanel[lcrd.Xcrd, lcrd.Ycrd].ToString();                    count++;                    break;                case 1:                    if (!bt.IsClick)                    {                        bt.IsClick = false;                        count = 0;                        lcrd = null;                    }                    else                    {                        count = 0;                        bt.IsClick = true;                        rcrd = new Coord(bt.Name);                        //textBox1.Text = lcrd.ToString() + "---" + rcrd.ToString();                        llkBox llkbox = (llkBox)panel1.Controls[lcrd.ToString()];//textBox2.Text = llkbox.Text + "--" + llkbox.Name;                        if (bt.Text == llkbox.Text)                        {                            //找到                            AutoFind(lcrd, bt.Text, rcrd);                            //找到移除                                                        if (qu.Count != 0)                            {                                //画路径//textBox3.Text += "--" + qu.Dequeue().ToString();//qu.Dequeue();                                Coord crd;                                int x, y;                                Point[] points1 = new Point[qu.Count];                                int i = 0;                                while (qu.Count != 0)                                {                                    crd = qu.Dequeue();                                    x = BoxStarX + crd.Xcrd * BoxWidth - BoxWidth / 2;                                    y = BoxStarY + crd.Ycrd * BoxWidth - BoxWidth / 2;                                    points1[i].X = x; points1[i].Y = y;                                    i++;                                }                                using (Graphics g = this.panel1.CreateGraphics())                                {                                    g.DrawLines(new Pen(Color.Blue, 2), points1);                                    System.Threading.Thread.Sleep(100); ;//程序暂停0.1秒                                    g.Clear(this.panel1.BackColor);                                }                                //移除控件                                RemoveBox(lcrd, rcrd, RType);                                if (panel1.Controls.Count == 0)                                {                                    MessageBox.Show("游戏结束!");                                    return;                                }                                //查看有没有可以消除的方格,如果没有刷新                                while (!isrefresh()) ;                            }                        }                        llkbox.IsClick = false;                        lcrd = null;                        bt.IsClick = false;                        rcrd = null;                    }                    break;            }        }        private void UnderMoveBox(Coord lcrd, Coord rcrd, int endmuber)        {            Coord crd;            llkBox box;            llkBox lbox = (llkBox)panel1.Controls[lcrd.ToString()];            int x = lcrd.Xcrd;            int y = lcrd.Ycrd;            for (int l = y - 1; l > endmuber; l--)            {                crd = new Coord(x, l);                if (crd == rcrd) continue;                if (panel1.Controls[crd.ToString()] != null)                {                    box = (llkBox)panel1.Controls[crd.ToString()];                    SwapBox(box, lbox);                    lbox = (llkBox)panel1.Controls[crd.ToString()];                }                else                    break;            }            crd = new Coord(lbox.Name);            ArrayPanel[crd.Xcrd, crd.Ycrd] = 0;            panel1.Controls.Remove(lbox);        }        private void UpMoveBox(Coord lcrd, Coord rcrd, int endmuber)        {            Coord crd;            llkBox box;            llkBox lbox = (llkBox)panel1.Controls[lcrd.ToString()];            int x = lcrd.Xcrd;            int y = lcrd.Ycrd;            for (int l = y + 1; l <= endmuber; l++)            {                crd = new Coord(x, l);                if (crd == rcrd) continue;                if (panel1.Controls[crd.ToString()] != null)                {                    box = (llkBox)panel1.Controls[crd.ToString()];                    SwapBox(box, lbox);                    lbox = (llkBox)panel1.Controls[crd.ToString()];                }                else                    break;            }            crd = new Coord(lbox.Name);            ArrayPanel[crd.Xcrd, crd.Ycrd] = 0;            panel1.Controls.Remove(lbox);        }        private void RightMoveBox(Coord lcrd, Coord rcrd, int endmuber)        {            Coord crd;            llkBox box;            llkBox lbox = (llkBox)panel1.Controls[lcrd.ToString()];            int x = lcrd.Xcrd;            int y = lcrd.Ycrd;            for (int l = x - 1; l > endmuber; l--)            {                crd = new Coord(l, y);                if (crd == rcrd) continue;                if (panel1.Controls[crd.ToString()] != null)                {                    box = (llkBox)panel1.Controls[crd.ToString()];                    SwapBox(box, lbox);                    lbox = (llkBox)panel1.Controls[crd.ToString()];                }                else                    break;            }            crd = new Coord(lbox.Name);            ArrayPanel[crd.Xcrd, crd.Ycrd] = 0;            panel1.Controls.Remove(lbox);        }        private void LeftMoveBox(Coord lcrd, Coord rcrd, int endmuber)        {            Coord crd;            llkBox box;            llkBox lbox = (llkBox)panel1.Controls[lcrd.ToString()];            int x = lcrd.Xcrd;            int y = lcrd.Ycrd;            for (int l = x + 1; l <= endmuber; l++)            {                crd = new Coord(l, y);                if (crd == rcrd) continue;                if (panel1.Controls[crd.ToString()] != null)                {                    box = (llkBox)panel1.Controls[crd.ToString()];                    SwapBox(box, lbox);                    lbox = (llkBox)panel1.Controls[crd.ToString()];                }                else                    break;            }            crd = new Coord(lbox.Name);            ArrayPanel[crd.Xcrd, crd.Ycrd] = 0;            panel1.Controls.Remove(lbox);        }        enum RemoveType { None, Y, X, XY, YX, Diffuse, Shrink };        private void RemoveBox(Coord lcrd, Coord rcrd,RemoveType type)        {            Coord crd;            llkBox box;            int x, y;            llkBox lbox = (llkBox)panel1.Controls[lcrd.ToString()];            llkBox rbox = (llkBox)panel1.Controls[rcrd.ToString()];            switch (type)            {                #region RemoveType.None                case RemoveType.None:                    panel1.Controls.Remove(panel1.Controls[lcrd.ToString()]);                    ArrayPanel[lcrd.Xcrd, lcrd.Ycrd] = 0;                    panel1.Controls.Remove(panel1.Controls[rcrd.ToString()]);                    ArrayPanel[rcrd.Xcrd, rcrd.Ycrd] = 0;                    break;                #endregion                #region RemoveType.Y                case RemoveType.Y:                    UnderMoveBox(lcrd, rcrd, 0);                    UnderMoveBox(rcrd, lcrd, 0);                    break;                #endregion                #region RemoveType.X                case RemoveType.X:                    LeftMoveBox(lcrd, rcrd, RowCount);                    LeftMoveBox(rcrd, lcrd, RowCount);                    break;                #endregion                #region RemoveType.XY                case RemoveType.XY:                    if (lcrd.Xcrd > RowCount / 2)                        RightMoveBox(lcrd, rcrd, RowCount / 2);                    else                        LeftMoveBox(lcrd, rcrd, RowCount / 2);                    if (rcrd.Xcrd > RowCount / 2)                        RightMoveBox(rcrd, lcrd, RowCount / 2);                    else                        LeftMoveBox(rcrd, lcrd, RowCount / 2);                    break;                #endregion                #region RemoveType.YX                case RemoveType.YX:                    if (lcrd.Ycrd > ColumnCount / 2)                        UnderMoveBox(lcrd, rcrd, ColumnCount / 2);                    else                        UpMoveBox(lcrd, rcrd, ColumnCount / 2);                    if (rcrd.Ycrd > ColumnCount / 2)                        UnderMoveBox(rcrd, lcrd, ColumnCount / 2);                    else                        UpMoveBox(rcrd, lcrd, ColumnCount / 2);                    break;                #endregion                //case RemoveType.Diffuse:                //    LeftUpMoveBox(lcrd, rcrd);                //    LeftUpMoveBox(rcrd, lcrd);                //    break;                //case RemoveType.Shrink:                //    break;                default :                    break;            }        }        //交换两个Box        private void SwapBox(llkBox lbox,llkBox rbox)        {            llkBox boxtemp = new llkBox();            Coord lcrd = new Coord(lbox.Name);            Coord rcrd = new Coord(rbox.Name);                        boxtemp = lbox;            int arr = ArrayPanel[lcrd.Xcrd, lcrd.Ycrd];            ArrayPanel[lcrd.Xcrd, lcrd.Ycrd] = ArrayPanel[rcrd.Xcrd, rcrd.Ycrd];            ArrayPanel[rcrd.Xcrd, rcrd.Ycrd] = arr;            string text = lbox.Text;            lbox.Text = rbox.Text;            rbox.Text = text;            bool isclick = lbox.IsClick;            lbox.IsClick = rbox.IsClick;            rbox.IsClick = isclick;            bool isclicktemp = lbox.IsClickTemp;            lbox.IsClickTemp = rbox.IsClickTemp;            rbox.IsClickTemp = isclicktemp;        }        //是否需要刷新        private bool isrefresh()        {            bool refresh = false;            Coord crd;            foreach (llkBox lbox in panel1.Controls)            {                crd = new Coord(lbox.Name);                AutoFind(crd, lbox.Text);                if (qu.Count != 0)                {                    refresh = true;                    break;                }            }            if (qu.Count != 0) qu.Clear();            else            {                Rand();                FillArray();            }            return refresh;        }        private void AutoFind(Coord crd, string name, Coord Aimcrd)        {            if (qu.Count != 0) qu.Clear();            //1            Coord crdqu;            Queue<Coord> Xqu = new Queue<Coord>();            Queue<Coord> Yqu = new Queue<Coord>();            qu = FindCoord(crd, name, Xqu, Yqu, Aimcrd, Find.XY);            if (qu.Count != 0)                return;            //2            Queue<Coord> Xququ = new Queue<Coord>();            Queue<Coord> Yququ = new Queue<Coord>();            while (Xqu.Count != 0)            {                crdqu = Xqu.Dequeue();                qu = FindCoord(crdqu, name, Xququ, Yququ, Aimcrd, Find.Y);                if (qu.Count != 0)                {                    qu.Enqueue(crd);                    return;                }            }            while (Yqu.Count != 0)            {                crdqu = Yqu.Dequeue();                qu = FindCoord(crdqu, name, Xququ, Yququ, Aimcrd, Find.X);                if (qu.Count != 0)                {                    qu.Enqueue(crd);                    return;                }            }            //3            Queue<Coord> Xquququ = new Queue<Coord>();            Queue<Coord> Yquququ = new Queue<Coord>();            while (Xququ.Count != 0)            {                crdqu = Xququ.Dequeue();                qu = FindCoord(crdqu, name, Xquququ, Yquququ, Aimcrd, Find.Y);                if (qu.Count != 0)                {                    Coord cd = new Coord(crd.Xcrd, crdqu.Ycrd);                    qu.Enqueue(cd);                    qu.Enqueue(crd);                    return;                }            }            while (Yququ.Count != 0)            {                crdqu = Yququ.Dequeue();                qu = FindCoord(crdqu, name, Xquququ, Yquququ, Aimcrd, Find.X);                if (qu.Count != 0)                {                    Coord cd = new Coord(crdqu.Xcrd, crd.Ycrd);                    qu.Enqueue(cd);                    qu.Enqueue(crd);                    return;                }            }        }        private void AutoFind(Coord crd, string name)        {            if (qu.Count != 0) qu.Clear();            //1            Coord crdqu;            Queue<Coord> Xqu = new Queue<Coord>();            Queue<Coord> Yqu = new Queue<Coord>();            qu = FindCoord(crd, name, Xqu, Yqu, Find.XY);            if (qu.Count != 0)                return;            //2            Queue<Coord> Xququ = new Queue<Coord>();            Queue<Coord> Yququ = new Queue<Coord>();            while (Xqu.Count != 0)            {                crdqu = Xqu.Dequeue();                qu = FindCoord(crdqu, name, Xququ, Yququ, Find.Y);                if (qu.Count != 0)                {                    qu.Enqueue(crd);                    return;                }            }            while (Yqu.Count != 0)            {                crdqu = Yqu.Dequeue();                qu = FindCoord(crdqu, name, Xququ, Yququ, Find.X);                if (qu.Count != 0)                {                    qu.Enqueue(crd);                    return;                }            }            //3            Queue<Coord> Xquququ = new Queue<Coord>();            Queue<Coord> Yquququ = new Queue<Coord>();            while (Xququ.Count != 0)            {                crdqu = Xququ.Dequeue();                qu = FindCoord(crdqu, name, Xquququ, Yquququ, Find.Y);                if (qu.Count != 0)                {                    Coord cd = new Coord(crd.Xcrd, crdqu.Ycrd);                    qu.Enqueue(cd);                    qu.Enqueue(crd);                    return;                }            }            while (Yququ.Count != 0)            {                crdqu = Yququ.Dequeue();                qu = FindCoord(crdqu, name, Xquququ, Yquququ, Find.X);                if (qu.Count != 0)                {                    Coord cd = new Coord(crdqu.Xcrd, crd.Ycrd);                    qu.Enqueue(cd);                    qu.Enqueue(crd);                    return;                }            }        }        enum Find { X, Y, XY };        private Queue<Coord> FindCoord(Coord crd, string name, Queue<Coord> Xqu, Queue<Coord> Yqu, Coord Aimcrd, Find find)        {            if (find == Find.X || find == Find.XY)            {                if (LeftFindBox(crd, name, Xqu, Aimcrd))                {                    return Xqu;                }                if (RightFindBox(crd, name, Xqu, Aimcrd))                {                    return Xqu;                }            }            if (find == Find.Y || find == Find.XY)            {                if (UpFindBox(crd, name, Yqu, Aimcrd))                {                    return Yqu;                }                if (UnderFindBox(crd, name, Yqu, Aimcrd))                {                    return Yqu;                }            }            return new Queue<Coord>();        }        private Queue<Coord> FindCoord(Coord crd, string name, Queue<Coord> Xqu, Queue<Coord> Yqu, Find find)        {            if (find == Find.X || find == Find.XY)            {                if (LeftFindBox(crd, name, Xqu,null))                {                    return Xqu;                }                if (RightFindBox(crd, name, Xqu,null))                {                    return Xqu;                }            }            if (find == Find.Y || find == Find.XY)            {                if (UpFindBox(crd, name, Yqu,null))                {                    return Yqu;                }                if (UnderFindBox(crd, name, Yqu,null))                {                    return Yqu;                }            }            return new Queue<Coord>();        }        //向左搜索        private bool LeftFindBox(Coord crd, string name, Queue<Coord> qu, Coord Aimcrd)        {            bool aimcrd;            for (int i = crd.Xcrd - 1; i >= 0; i--)            {                Coord crdqu = new Coord(i, crd.Ycrd);                if (object.Equals(Aimcrd,null))                    aimcrd = (ArrayPanel[i, crd.Ycrd].ToString() == name);                else                    aimcrd = (ArrayPanel[i, crd.Ycrd].ToString() == name && crdqu == Aimcrd);                if (aimcrd)                {                    qu.Clear();                    qu.Enqueue(crdqu);                    qu.Enqueue(crd);                    return true;                }                else if (ArrayPanel[i, crd.Ycrd] != 0)                {                    return false;                }                else                {                    qu.Enqueue(crdqu);                }            }            return false;        }        //向右搜索        private bool RightFindBox(Coord crd, string name, Queue<Coord> qu, Coord Aimcrd)        {            bool aimcrd;            for (int i = crd.Xcrd + 1; i < RowCount + 2; i++)            {                Coord crdqu = new Coord(i, crd.Ycrd);                if (object.Equals(Aimcrd, null))                    aimcrd = (ArrayPanel[i, crd.Ycrd].ToString() == name);                else                    aimcrd = (ArrayPanel[i, crd.Ycrd].ToString() == name && crdqu == Aimcrd);                if (aimcrd)                {                    qu.Clear();                    qu.Enqueue(crdqu);                    qu.Enqueue(crd);                    return true;                }                else if (ArrayPanel[i, crd.Ycrd] != 0)                {                    return false;                }                else                {                    qu.Enqueue(crdqu);                }            }            return false;        }        //向上搜索        private bool UpFindBox(Coord crd, string name, Queue<Coord> qu, Coord Aimcrd)        {            bool aimcrd;            for (int i = crd.Ycrd - 1; i >= 0; i--)            {                Coord crdqu = new Coord(crd.Xcrd, i);                if (object.Equals(Aimcrd, null))                    aimcrd = (ArrayPanel[crd.Xcrd, i].ToString() == name);                else                    aimcrd = (ArrayPanel[crd.Xcrd, i].ToString() == name && crdqu == Aimcrd);                if (aimcrd)                {                    qu.Clear();                    qu.Enqueue(crdqu);                    qu.Enqueue(crd);                    return true;                }                else if (ArrayPanel[crd.Xcrd, i] != 0)                {                    return false;                }                else                {                    qu.Enqueue(crdqu);                }            }            return false;        }        //向下搜索        private bool UnderFindBox(Coord crd, string name, Queue<Coord> qu, Coord Aimcrd)        {            bool aimcrd;            for (int i = crd.Ycrd + 1; i < ColumnCount + 2; i++)            {                Coord crdqu = new Coord(crd.Xcrd, i);                if (object.Equals(Aimcrd, null))                    aimcrd = (ArrayPanel[crd.Xcrd, i].ToString() == name);                else                    aimcrd = (ArrayPanel[crd.Xcrd, i].ToString() == name && crdqu == Aimcrd);                if (aimcrd)                {                    qu.Clear();                    qu.Enqueue(crdqu);                    qu.Enqueue(crd);                    return true;                }                else if (ArrayPanel[crd.Xcrd, i] != 0)                {                    return false;                }                else                {                    qu.Enqueue(crdqu);                }            }            return false;        }        //画图,随即得到成对的方格        private void DrowBox()        {            llkBox bt;            Random rdom=new Random();            string Boxstr;            for (int i = 1; i < ColumnCount+1; i++)            {                for (int j = 1; j < RowCount+1; j++)                {                    Boxstr = rdom.Next(1, PicCount + 1).ToString();                    bt = new llkBox();                    bt.Name = "X" + (j).ToString() + "|Y" + (i).ToString();                    bt.Location = new Point(BoxStarX + (j - 1) * BoxWidth, BoxStarY + (i - 1) * BoxWidth);                    bt.Width = BoxWidth;                    bt.Height = BoxWidth;                    bt.Text = Boxstr; //bt.Name;                    bt.Click +=new EventHandler(bt_Click);                    panel1.Controls.Add(bt);                    j++;                    bt = new llkBox();                    bt.Name = "X" + (j).ToString() + "|Y" + (i).ToString();                    bt.Location = new Point(BoxStarX + (j - 1) * BoxWidth, BoxStarY + (i - 1) * BoxWidth);                    bt.Width = BoxWidth;                    bt.Height = BoxWidth;                    bt.Text = Boxstr; //bt.Name;                    bt.Click += new EventHandler(bt_Click);                    panel1.Controls.Add(bt);                }            }        }        //随即变化        private void Rand()        {            string Boxstr;            Random rdom = new Random();            llkBox rbt;            foreach (llkBox bt in panel1.Controls)            {                bt.PicChang = true;                Boxstr = bt.Text;                rbt = (llkBox)panel1.Controls[rdom.Next(panel1.Controls.Count)];                bt.Text = rbt.Text;                rbt.Text = Boxstr;            }        }        //填充数组        private void FillArray()        {            ArrayPanel.Initialize();            llkBox rbt;            Coord crd;            foreach (llkBox bt in panel1.Controls)            {                crd = new Coord(bt.Name);                ArrayPanel[crd.Xcrd, crd.Ycrd] = Convert.ToInt32(bt.Text);            }        }    }