环境:Unity2021.1.14 语言:C#

总起

本文的源代码可以在以下网址的TestMaze中找到:

https://github.com/anguangzhihen/TestOdinInspector

《人工智能与游戏》关于PCG文章的末尾提供了一个生成迷宫的练习:

Maze, a Unity C# Tutorial

该练习对Unity中使用的常规技术讲解的十分详细,很适合刚接触Unity的新手,当然本文不会对Unity过多的展开。

该工程的主要代码在TestMaze中,游戏开始会启动一个协程,用于创建地板(Cell)和墙壁,我们主要聚焦的就是这生成步骤的实现。后续原文的实现中还会有装饰画、门、合并房间的内容,我这边就不继续了。

原文默认使用的生成算法是随机深度优先算法,这属于PCG算法中的树搜索内容(我们常用的A*是广度优先搜索的变种,所以A*也属于树搜索),而进化算法属于搜索算法的大类,但它们不过构建搜索树,只会从全局角度考虑完整的解决方案。

而本文主要介绍针对Maze生成常用的一些算法,主是树搜索算法,而运用到的一些原理会涉及图论的知识。

算法

随机深度优先算法

该算法会随机探索方向生成通路,直到四面没有生成空间,就会回溯之前生成节点继续随机探索。

最小生成树 Prim算法

算法实现原理其实跟随机深度优先算法类似,只不过没有回溯的过程,而是每次随机挑选已经生成Cell再随机选方向生成。

最小生成树算法除了Prim算法,Kruskal算法也能生成类似的迷宫。这类算法生成迷宫更加的破碎,而随机深度优先算法则会有很多长走廊。

均匀生成树 威尔逊随机游走擦除算法

该算法原理是随机挑选一个未生成Cell作为起始点,然后随机选择方向开始“游走”,直到碰到了已经生成Cell作为终点,走过的路径就作为通道进行生成。

它生成迷宫的破碎程度在上两个算法之间。

这个算法最大的问题在于效率很低,特别是生成特别大型的迷宫,它会在未走过的区域来回游走,导致一直连通不到已生成的路径(当然我们可以通过一些trick进行优化)。

Aldous-Broder算法也是通过均匀生成树来生成迷宫,但它的效率比威尔逊算法更差。

二叉树算法

该算法需要选择一个起点,并决定好方向,这边的方向是左上,因此整体迷宫会有左上的趋势,最终在右边和下边合为一整个迷宫。

通过该算法生成的迷宫结构上会比较类似,但好处是不需要额外的存储空间。

Eller算法

该算法可能是最神奇的算法,它不需要额外的存储空间,通过随机合并集合就能无限向下生成迷宫。

这个算法的实现我卡了一段时间,其实不复杂,关键在于先将所有的墙生成出来,然后通过砸墙的方式合并邻居。

其他算法

  1. 递归除法,该算法类似之前文章提到的空间分割法;
  2. 元胞自动机;
  3. Hunt and Kill算法,随机深度优先搜索的优化版本,舍弃栈结构。

参考

《人工智能与游戏》

Maze, a Unity C# Tutorial

https://en.wikipedia.org/wiki/Maze_generation_algorithm

【硬核干货】图论到底是个什么玩意儿?图论入门:树与生成树 (Graph Theory: Tree and Spanning Tree)_哔哩哔哩_bilibili

The Buckblog

https://en.wikipedia.org/wiki/Loop-erased_random_walk

Unity3D Maze 迷宫生成算法相关推荐

  1. c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析

    1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图:   ...

  2. [迷宫中的算法实践]迷宫生成算法——Prim算法

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...

  3. 迷宫生成算法和迷宫寻路算法

    迷宫生成算法和迷宫寻路算法 大学二年级的时候,作为对栈这个数据结构的复习,我制作了一个迷宫生成算法的小程序,当时反响十分好,过了几天我又用自己已经学的DirectX技术制作了DirectX版的程序.这 ...

  4. C#三大迷宫生成算法

    今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...

  5. 随机迷宫生成算法——深度优先算法

    迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...

  6. 随机迷宫生成算法——prime算法

    本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有. Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设 ...

  7. 随机迷宫生成算法浅析

    摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...

  8. PHP:Maze迷宫寻址算法(附完整源码)

    PHP:Maze迷宫寻址算法 <?php//迷宫一 for ($l = 0; $l <= 5; $l++) {for ($m = 0

  9. 迷宫生成算法---深度优先算法(基于python)

    迷宫生成算法---深度优先算法 总体的目录 版权及协议声明 更加舒服的阅读方式 一. 深度优先算法的原理与思路 二.迷宫的制作 迷宫的总体的创建. 三.代码的实现 总体的目录 版权及协议声明 本文章遵 ...

  10. HTML+CSS+JavaScript 迷宫生成算法 【建议收藏】

    最近发现很多人都在写算法类的博客,今天就献丑了使用HTML,CSS和JavaScript制作一个简单的迷宫生成小代码.证明了自己对一些简单的小算法还是可以驾驭的,基本功没有荒废. 迷宫生成有很多种算法 ...

最新文章

  1. linux 下安装MySQL
  2. 【前沿】MIT搞了个进取型机器人!能研究学习对象操纵的基础
  3. Quzrtz 使用oracle集群无法正常启动问题解决
  4. 服务器支持最大连接数,Horizon 连接服务器最大连接数和配置
  5. mysql 从库_mysql数据库主从配置
  6. postman使用过程中body中的form-data,x-www-form-urlencoded,raw,binary的简单记录
  7. 12月29日课程笔记 磁盘格式化与挂载与手动增加swap空间
  8. Python+OpenCV:二维直方图(2D Histograms)
  9. 10分钟掌握运输问题(一)
  10. 隐马尔可夫模型(Hidden Markov Model)
  11. 好用免费的web报表工具
  12. 对本课程的期望以及教学建议
  13. 8.5 Polytopes (多面体)
  14. Android Tag-Cloud (云标签) 效果
  15. HObject,unsigned char的相互转换
  16. 关于植物大战僵尸如何更改关卡与金币
  17. c语言用迭代法求最大公约数,用迭代法求两个数的最大公约数和最小公倍数
  18. Duplicate address
  19. 光学传感器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  20. 【转】女博士写实:为留校而读博

热门文章

  1. 字符串与整型的相互转换
  2. 字节跳动前端开发面试题总结,需要的小伙伴来看!
  3. 少爷秋游云台山:沿途风景为其绽放
  4. 使用python爬取App安卓应用商店评论并生成词云
  5. c语言质因数分解算法蓝桥杯,【算法】 蓝桥杯 基础练习 分解质因数
  6. linux ping 测试网速,怎么ping网速 ping命令简单测试网速方法【详解】
  7. php测线路网速,php 测试网速
  8. ImportError: Could not import
  9. epoint:TreeView
  10. Hive之同比环比的计算