日期:2013-03-03  浏览次数:20702 次

//迷宫类相关

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>
/// 走一迷宫中的一个格