CSDN博客

img lovered

走迷宫C#版(一)

发表于2004/6/29 15:30:00  1280人阅读

//迷宫类相关

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

0 0

相关博文

我的热门文章

img
取 消
img