走迷宫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;}
}
}
}

时间: 2024-11-08 18:58:54

走迷宫C#版(一)的相关文章

走迷宫C#版(二)

//窗体,调用... using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Threading; namespace MazeDemo{ /// <summary> /// Form1 的摘要说明. /// </summary> public cla

休闲益智游戏《管线迷宫石油版》全线限免

<管线迷宫石油版>是由经典益智接水管的改版,不过这次是接石油,而且要避开自来水管道. 游戏似乎没有时间的限制,少了些紧迫感,但是内容丰富,供水,供热,排污等等,多管齐下,共有60个关卡. 游戏名称:<PipeRoll Oil>价格:限免中iPhone版点击下载 iPad版点击下载游戏玩法相信朋友们知道,不过游戏的难度非常大,有三种难度模式.单是简单模式的要求便已经十分高,玩家需要在石油漏出水管前将水管布置好,增添了更多的紧迫感.玩家可以选择是走简单的路径或是额外的路径获得三星评价.

c语言-C 的走迷宫问题 实在找不出问题所在了。。。

问题描述 C 的走迷宫问题 实在找不出问题所在了... mice.txt文件内容24 24 1 1 24 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 00 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 00 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 00 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 00 0 0 0

java算法-关于Java的走迷宫问题

问题描述 关于Java的走迷宫问题 题目是这样的: 用户输入一个值,生成一个n*n的矩阵,然后每个符号之间用空格隔开,要求从A到B,如果当前位置的坐标是"+"那么下一个坐标则必须为"-",找出最短的路径的步数 我的代码是把所有的情况写出来,但是出错了,请各位大神看看哪里有问题 import java.util.ArrayList; import java.util.Scanner; public class Main { //矩阵的大小 static int n;

c语言走迷宫问题,输不出结果。。。

问题描述 c语言走迷宫问题,输不出结果... #include void print (int map[][10]); //打印迷宫 void walk (int map[][10], int x, int y); //走迷宫 void push (int x, int *stack); //进栈 void delet (); //出栈 int stackx[100]; //用来存放每一步的x值 int stacky[100]; //每一步的y值 int size = 0; //一共已经走的步数

队列 bfs 迷宫-用bfs走迷宫 队列是自己模拟的

问题描述 用bfs走迷宫 队列是自己模拟的 迷宫问题: 给定一个大小为N*M的迷宫,迷宫由通道和墙壁组成('#','.','S','G'分别表示墙.通道.起点和终点),每一步可以向邻接的上下左右四个方向移动.请给出从起点到终点所需的最小步数.假定起点一定可以到达终点. 没使用STL 我自己模拟队列运行 怎么运行都崩溃 源码 #include<iostream> #include<queue> using namespace std; struct point { int x; in

【重磅】Nature子刊 | 增强学习强化,混合脑生化鼠“走迷宫”能力大幅提升

神经科学和计算机科学的发展加强了大脑和机器之间的融合,现在可以用机械的方式对生物的感觉.记忆和运动机能进行增强或修复,科学家也做出了动物机器人和嵌入生物大脑的认知机器人.诸如此类的生物智能与人工智能相结合,使人不禁思考:这样的混合系统是否比单独的生物系统更加智能? 为了解决这个问题,浙江大学吴朝晖课题组的研究人员率先进行了这样的实验,他们使用采用了机器学习规则的计算系统增强小鼠的大脑,然后观察这样的混合系统是否在学习走迷宫的任务中具有更强的学习能力. 论文摘要:混合脑机系统的迷宫学习 摘要 推动

基于C语言实现简单的走迷宫游戏_C 语言

本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #include <cstdio> #include <deque> #include <windows.h> using namespace std; class node { public: int x,y; int lastOpt; }; deque<node> sta

老鼠走迷宫程序实例

/*--------------------------------------------------------------------------------------------//文件名称:MazeMouse.cpp//功    能:找出走出迷宫的所有路径,以及最短路径.//作    者:晒晒周--------------------------------------------------------------------------------------------*//*