📄 form2.cs
字号:
//迷宫类相关
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
namespace MazeDemo{ /// <summary> /// 迷宫类 /// </summary>
public class CMaze { bool[,] mg; //地图格子
Stack stack; //堆栈
Point in_p; //入口点
Point out_p; //出口点
Point start_p; //绘制迷时候的起始点
Size boxsize; //每个格子的大小
int step_count; //共走多少步
public CMaze() {
stack=new Stack();
this.start_p=new Point(0,0);
this.boxsize=new Size(50,50);
step_count=0;
}
public CMaze(bool[,] _mg):this()
{ this.mg=_mg; }
public CMaze(bool[,] _mg,Point _in,Point _out):this()
{ this.mg=_mg;
this.in_p=_in;
this.out_p=_out;
Stack way=this.Test(this.in_p,_in);
stack.Push(new CCoor(this.in_p,way));
this.step_count++; }
/// <summary> /// 绘制迷宫时窗口的起始坐标 /// </summary> ///
public Point StartPoint {
set{this.start_p=value;}
get{return this.start_p;}
}
/// <summary> /// 当前迷宫共走多少步 /// </summary> ///
public int StepCount { get{return this.step_count;} }
/// <summary> /// 迷宫格子大小 /// </summary> ///
public Size BoxSize { set{this.boxsize=value;} get{return this.boxsize;} }
/// <summary> /// 堆栈数据个数 /// </summary> ///
public int StackCount { get{return this.stack.Count;} }
/// <summary> /// 绘制迷宫 /// </summary> /// <param name="g"></param> ///
public void DrawBox(Graphics g)
{
for(int i=0;i<mg.GetLength(0);i++)
{
for(int j=0;j<mg.GetLength(1);j++)
{
Point pp=new Point((j*BoxSize.Width)+StartPoint.X,(i*BoxSize.Height)+StartPoint.Y); //位置
SolidBrush brush;
Rectangle rect=new Rectangle(pp,BoxSize);
if(mg[i,j])
brush=new SolidBrush(Color.Green);
else
brush=new SolidBrush(Color.Red);
g.FillRectangle(brush,rect);
}
}
}
/// <summary> /// 绘制所走线路 /// </summary> /// <param name="g"></param> ///
public void DrawPath(Graphics g)
{
IEnumerator myEnumerator = stack.GetEnumerator();
while ( myEnumerator.MoveNext() )
{
CCoor c=new CCoor();
c=(CCoor)myEnumerator.Current;
Point pp=new Point((c.CurrentPoint.Y*BoxSize.Width)+StartPoint.X,(c.CurrentPoint.X*BoxSize.Height)+StartPoint.Y);
SolidBrush brush=new SolidBrush(Color.Blue);
Rectangle rect=new Rectangle(pp,BoxSize);
g.FillRectangle(brush,rect);
}
}
/// <summary> /// 绘制当前位置的可行路径 /// </summary> /// <param name="g"></param> ///
///
public void DrawNextPath(Graphics g)
{
CCoor c=(CCoor)this.stack.Peek();
Stack s=c.WayPath;
IEnumerator myEnumerator=s.GetEnumerator();
while(myEnumerator.MoveNext())
{
Point p=(Point)myEnumerator.Current;
Point pp=new Point((p.Y*BoxSize.Width)+StartPoint.X,(p.X*BoxSize.Height)+StartPoint.Y);
SolidBrush brush=new SolidBrush(Color.Yellow);
Rectangle rect=new Rectangle(pp,BoxSize);
g.FillRectangle(brush,rect);
}
}
/// <summary> /// 判断迷宫是否走完 /// </summary> /// <returns></returns> ///
public bool IsEnd()
{
CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息
if( coor.CurrentPoint.X==this.out_p.X && coor.CurrentPoint.Y==this.out_p.Y )
return true;
else
return false;
}
/// <summary> /// 走一迷宫中的一个格子 /// </summary> /// <returns>数字状态</returns> ///
public int Step()
{
CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息 //是否到达出口
if(!(coor.CurrentPoint.X==this.out_p.X&&coor.CurrentPoint.Y==this.out_p.Y))
{
Stack ss=coor.WayPath;
if(ss.Count==0)
{
this.stack.Pop();
return 0;
}
Point p=(Point)ss.Pop(); //当前位置可继续移动的下一个位置
if(p.X==this.out_p.X&&p.Y==this.out_p.Y)
{
this.stack.Push(new CCoor(p,new Stack()));
return 0;
}
Stack st=this.Test(p,coor.CurrentPoint); //得到下一个可移动位置的所有可移动位置
if(st.Count==0)
{
return 0;
}
CCoor newcoor=new CCoor(p,st); //建立新的位置信息
this.stack.Push(newcoor); //压入堆栈
this.step_count++; //所走步骤加1
return 0; }
else
return 1;
}
/// <summary> /// 走迷宫 /// </summary> ///
public void Run() {
while(this.Step()!=1);
}
/// <summary> /// 回复到迷宫起点 /// </summary> ///
public void Reset()
{
this.stack.Clear();
Stack way=this.Test(this.in_p,this.in_p);
stack.Push(new CCoor(this.in_p,way));
this.step_count=1;
}
/// <summary> /// 探测可行路线 /// 探测顺序 右->前->左->后 /// 左 /// | /// 后--+-->前 /// | /// 右 /// </summary> /// <param name="p">从当前点查询四周是否有可行路线</param> /// <param name="perv_p">先前的路线</param> /// <returns>可行路线堆栈</returns> ///
public Stack Test(Point p,Point perv_p) {
Stack stack_way=new Stack(); //该点可行位置堆栈
int x,y;
//后
x=p.X;
y=p.Y-1;
this.Signpost(x,y,stack_way,perv_p);
//左
x=p.X-1;
y=p.Y;
this.Signpost(x,y,stack_way,perv_p);
//前
x=p.X;
y=p.Y+1;
this.Signpost(x,y,stack_way,perv_p);
//右
x=p.X+1;
y=p.Y;
this.Signpost(x,y,stack_way,perv_p);
return stack_way;
}
/// <summary> /// 判断该方向是否可行,可行则将信息压入堆栈,只在Test()函数中调用 /// </summary> /// <param name="x">x坐标</param> /// <param name="y">y坐标</param> /// <param name="s">堆栈</param> /// <param name="perv_p">来时候的方向</param> ///
private void Signpost(int x,int y,Stack s,Point perv_p)
{
if( (x>=0 && x<this.mg.GetLength(0)) && (y>=0 && y<this.mg.GetLength(1)) )
{ if(this.mg[x,y]&&!(x==perv_p.X&&y==perv_p.Y))
s.Push(new Point(x,y));
}
}
/// <summary> /// 迷宫简图 /// </summary> /// <returns>字符地图</returns> ///
public override string ToString()
{
string str="";
for(int i=0;i<mg.GetLength(0);i++)
{
for(int j=0;j<mg.GetLength(1);j++)
{ if(this.mg[i,j])
str+="□";
else
str+="■";
}
str+="\n";
}
return str;
}
}
/// <summary> /// 当前坐标信息,和可走方向坐标 /// </summary> ///
public class CCoor {
private Point curr_p; //当前坐标
private Stack way; //可走方向坐标
public CCoor() { //...
}
public CCoor(Point p,Stack w)
{
curr_p=p; way=w;
}
public Point CurrentPoint { get{return this.curr_p;} set{this.curr_p=value;} }
public Stack WayPath { set{this.way=value;} get{return this.way;} } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -