附上全文连接:
[Algorithm]Maze Prim算法与A*寻路算法(上)
[Algorithm]Maze Prim算法与A*寻路算法(中)
[Algorithm]Maze Prim算法与A*寻路算法(下)
文章中的所有源码下载链接附在“[Algorithm]Maze Prim算法与A*寻路算法(上) ”文章中。
上一篇中大致讲了下内容,接下来将要讲的是Maze Prim算法。
先附上一段Wiki的讲解:https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_Prim.27s_algorithm
其实算法是思路很简单就是不断的找墙拆墙的过程。大致流程如下:
1. 让迷宫所有节点均为墙,即没有路可走。
2. 选择一个偶数列和偶数行的节点设置为通路,然后把它的邻节点(邻墙)(上下左右,不要斜对角的=。=)存入邻节点列表中。
3. 如果邻节点列表中有数据,则执行以下循环。
——1. 从列表中随机选择一个邻节点,如果它相对与对应通路节点的对面节点不是通路的话,则执行以下循环。
————1.把该节点和对面节点设置为通路。
————2.把对面节点的邻节点加入列表。
——2.如果对面的节点已经是通路,则将其移除列表。
程序的大致流程如上,接下来就源码讲解,因为C# 控制台的版本可以直接运行,则以这个工程讲解。
“MazeCSharpTest”工程中只用看“Program.cs”即可,所有实现均在这个文件中。
需要定义节点类型枚举“WallType”和节点信息类“WallInfo”。
public enum WallType
{
None = 0,
Up = 1,
Down = 2,
Left = 4,
Right = 8,
UpDown = 3,
LeftRight = 12,
LeftUp = 5,
LeftDown = 6,
RightUp = 9,
RightDown = 10,
LeftUpRight = 13,
UpRightDown = 11,
RigthDownLeft = 14,
DownLeftUp = 7,
LeftUpRightDown = 15
}
public class WallInfo
{
public int x = -1;
public int y = -1;
/// <summary>
/// 是否有墙
/// </summary>
public bool hasWall = true;
/// <summary>
/// 是否是寻路路径点
/// </summary>
public bool isFindRoad = false;
/// <summary>
/// 墙的类型
/// </summary>
public WallType type = WallType.None;
/// <summary>
/// 状态
/// </summary>
public int flag = 0;
public void Set(int x, int y, bool hasWall =