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