[转]三种迷宫生成算法概述

参考连接:https://www.jianshu.com/p/f643b0a0b887web

 

1. Randomized Prim's algorithm(随机Prim算法)

随机Prim算法属于打通墙壁生成迷宫的算法,下面我将以集合的角度来描述此算法。算法

  1. 首先是初始化,创建一个全部单元格都被墙隔开的迷宫。
    以8*8的迷宫为例,将每一个单元格进行编号。使用集合表示路径,集合中的元素就是单元格的编号,表示这条路径通过了哪些单元格。
    假设咱们从1开始,按从左到右从上到下的顺序依次对单元格进行编号。又假设迷宫的入口为左上角的单元格,编号为1,出口为右下角的单元格,编号为64。编程


     
    初始化迷宫
  2. 因此最开始有64条路径,每条路径只有一个单元格。咱们用P_{i}表示路径i的集合,其中i为集合中元素的最小值(这个约定对编程来说意义不大,只是方便后面的描述)。初始时有:P_{1}=\{1\},P_{2}=\{2\},\cdots,P_{64}=\{64\}
  3. 而后随机选择一个内部的墙壁,假设墙壁两边的单元格编号为i,j,i\in P_{m},j\in P_{n}
    m=n,表示墙壁两边的单元格属于同一路径,则不必打通该墙壁,以后重复步骤3.
    m\ne n,表示两单元格不在同一路径,则打通该墙壁,连通相邻的两路径,连通路径对应为集合的合并。P_{min(m,n)}=P_{m}\cup P_{n}以后重复步骤3。
  4. 直至最终合并为一个集合P_{1}=\{1,2,\cdots,64\},就将全部的单元格归入到一个可达路径中,即对于入口单元格1来讲其它任意单元格都是可达的。不过咱们并不须要必定合并到一个集合为止,只要当1,64\in P_{1}时,代表入口和出口之间已有可达路径,就能够中止合并了。
     
    全连通迷宫

    若是编程实在没思路能够参考下面的伪码描述,不然能够跳过。
  • 创建单元格矩阵,下标对应编号,元素值对应集合,值相同单元格表明属于同一集合,初始时全部值都不一样。
  • 创建两个向量,分别表示全部单元格的右上(也但是左下等等)墙壁,下标对应单元格,值表示墙是否被打通,初始时全部墙未被打通。
  • 随机选择两个向量中的一堵未被打通的墙(非边缘),找到矩阵中此墙邻接的两单元格。判断元素值是否相等,相等则不打通,而后重复当前步骤;若元素值不等,则打通该墙壁,将矩阵中两集合的元素值统一,而后重复当前步骤。

2. Recursive backtracker ( 递归回溯)

一样是属于打通墙壁生成迷宫的算法,也叫深度优先算法(不撞南墙不回头,哈哈)。dom

  1. 首先是初始化,创建一个全部单元格都被墙隔开的迷宫。
  2. 随机选择一个单元格做为起始点,以此单元格开始打通墙壁。
  3. 以当前单元格为基准,随机选择一个方向,若此方向的邻接单元格没有被访问过,则打通这两个单元格之间的墙壁,并将此邻接单元格做为当前单元格,重复步骤3。
  4. 若当前单元格的四个邻接单元格都已经被访问过,则退回到进入当前单元格的邻接单元格,且以此单元格为当前当前单元格,重复步骤3,4。
  5. 直到起始点单元格被退回,则算法结束。

3. Recursive division(递归分割法)

属于构造墙壁生成迷宫的算法。
在空白空间随机生成十字墙壁,将空间分割为四个子空间,而后在三面墙上各自选择一个随机点挖洞,保证四个子空间的连通。以后继续对子空间作分割,直至空间不足以继续分割为止。orm

引用一下别人的总结:这三种算法分别适合不一样的迷宫状况,递归回溯适合于那种主线支线明显的游戏(如RPG),而递归分割则适合转角较少的游戏(如FPS和ACT),至于Prim,彷佛适合最标准的迷宫游戏(随机Prim算法生成的迷宫分支较多,总体上更复杂也更天然)。递归

做者:M_lear 连接:https://www.jianshu.com/p/f643b0a0b887 来源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
相关文章
相关标签/搜索