//迷宫类相关
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
namespace MazeDemo
{
///
/// 迷宫类
///
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++;
}
///
/// 绘制迷宫时窗口的起始坐标
///
public Point StartPoint
{
set{this.start_p=value;}
get{return this.start_p;}
}
///
/// 当前迷宫共走多少步
///
public int StepCount
{
get{return this.step_count;}
}
///
/// 迷宫格子大小
///
public Size BoxSize
{
set{this.boxsize=value;}
get{return this.boxsize;}
}
///
/// 堆栈数据个数
///
public int StackCount
{
get{return this.stack.Count;}
}
///
/// 绘制迷宫
///
///
public void DrawBox(Graphics g)
{
for(int i=0;i { for(int j=0;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); } } } /// /// 绘制所走线路 /// /// 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); } } /// /// 绘制当前位置的可行路径 /// /// 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); } } /// /// 判断迷宫是否走完 /// /// 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; } /// /// 走一迷宫中的一个格子 /// /// 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; } /// /// 走迷宫 /// public void Run() { while(this.Step()!=1); } /// /// 回复到迷宫起点 /// 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; } /// /// 探测可行路线 /// 探测顺序 右->前->左->后 /// 左 /// | /// 后--+-->前 /// | /// 右 /// /// 从当前点查询四周是否有可行路线 /// 先前的路线 /// 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; } /// /// 判断该方向是否可行,可行则将信息压入堆栈,只在Test()函数中调用 /// /// x坐标 /// y坐标 /// 堆栈 /// 来时候的方向 private void Signpost(int x,int y,Stack s,Point perv_p) { if( (x>=0 && x { if(this.mg[x,y]&&!(x==perv_p.X&&y==perv_p.Y)) s.Push(new Point(x,y)); } } /// /// 迷宫简图 /// /// public override string ToString() { string str=""; for(int i=0;i { for(int j=0;j { if(this.mg[i,j]) str+="□"; else str+="■"; } str+="\n"; } return str; } } /// /// 当前坐标信息,和可走方向坐标 /// 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;} } } }

