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);
}
}
}
连连看主程序
最新推荐文章于 2023-01-03 20:56:09 发布