分享
 
 
 

走迷宫C#版(一)

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

//迷宫类相关

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

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有