北落师门

让我们的生活更美好
走迷宫C#版(一)
转自:www.chinacs.net  2004-08-10  中文C#技术站


//迷宫类相关

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

}

posted on 2005-04-17 17:34  北落师门  阅读(378)  评论(0)    收藏  举报