游戏常用算法:四种迷宫生成算法
简介
所谓迷宫生成算法,就是用以生成随机的迷宫的算法
迷宫生成算法是处于这样一个场景:
一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的
要求在网格地图边缘,也就是网格的边上打通2面墙
所有网格都至少保证网格周围至少有一堵墙打通
所有网格都能通过打通的墙能形成一条通路
博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简要的介绍
基于Unity的迷宫生成算法代码实现
Github链接
递归回溯算法
复杂度
空间:O(n),时间:O(n),n为迷宫节点数row*col
原理
以一个栈作为辅助的数据结构,用以记录打通区域的顺序,用以回溯
一开始随机在地图中选择一个区域,加入栈。
之后在之前选择的区域周围随机选择一个未打通的区域,将新选择的区域和之前选择区域的墙打通,并把新的区域的加入栈
如果四周的区域都打通,就让栈出栈,将当期所选择的区域设置栈新的栈顶,表示回退到上一个区域
之后递归的按之前的步骤选择下一个区域买二手手机直到所有区域都被打通
缺点
这种算法实现思路极为简单,但通路过于明显,甚至有可能会出现上图中的迷宫,很尴!!!
递归分割算法
复杂度
递归空间复杂度:O(row*col),最好时间复杂度:O(lgrow+lgcol),最坏时间复杂度O(row*col)
原理
将矩形地图用十字分成四个小矩阵
在四个小矩形相邻的四个面上各随机打通一面墙,使通路导通。
然后对所有小矩形重复之前分割操作
如果矩阵已经无法分割了,也就是行数或列数为一时,就将矩阵内部的墙全部打通
优缺点
生成的迷宫有明显的矩形成分,不自然,适合简单如FPS,ACT等游戏
随机Prim算法
复杂度
空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col-1))
原理
随机选择一个区域作为当前区域
将区域四周未打通的墙加入列表中
while(列表不为空)
随机从列表选择一面墙
如果墙两边区域存在一区域未被打通,就打通这面墙,并将这面墙两边区域附近未打通的墙加入列表
从列表中移除这面墙
优缺点
自然的迷宫,很难走,适合真正的迷宫游戏
Kruskal+并查集
复杂度
空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col-1))
原理
这个算法巧妙的使用了并查集,运用并查集判断整个迷宫的导通问题
- 把所有墙加入墙列表中
- while(墙列表不为空)
- 随机从墙列表选择一堵墙,用并查集判断墙两边区域是否导通
-
- 不导通就打通这堵墙
-
- 从墙列表中移除这堵墙
复制代码
游戏常用算法:四种迷宫生成算法相关推荐
- 随机迷宫生成算法浅析
摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...
- 迷宫生成算法和迷宫寻路算法
迷宫生成算法和迷宫寻路算法 大学二年级的时候,作为对栈这个数据结构的复习,我制作了一个迷宫生成算法的小程序,当时反响十分好,过了几天我又用自己已经学的DirectX技术制作了DirectX版的程序.这 ...
- C#三大迷宫生成算法
今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...
- c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析
1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图: ...
- 随机迷宫生成算法——深度优先算法
迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...
- 迷宫生成算法---深度优先算法(基于python)
迷宫生成算法---深度优先算法 总体的目录 版权及协议声明 更加舒服的阅读方式 一. 深度优先算法的原理与思路 二.迷宫的制作 迷宫的总体的创建. 三.代码的实现 总体的目录 版权及协议声明 本文章遵 ...
- bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...
JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...
- php四种基础排序算法的运行时间比较
/*** php四种基础排序算法的运行时间比较* @authors Jesse (jesse152@163.com)* @date 2016-08-11 07:12:14*/ //冒泡排序法 func ...
- [迷宫中的算法实践]迷宫生成算法——Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...
- 五分钟让你搞懂Nginx负载均衡原理及四种负载均衡算法
前言 今天这篇文章介绍了负载均衡的原理以及对应的四种负载均衡算法,当然还有对应的指令及实战,欢迎品尝.有不同意见的朋友可以评论区留言! 负载均衡 所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游 ...
最新文章
- fir.im Weekly - iOS 保持界面流畅的技巧
- 【必懂概念】一文详解什么是空洞卷积?
- FastDFS图片服务器
- python画笔初始位置_turtle绘画-移动落笔点(改变初始原点)
- java poi 需要jar_Java 之 POI各Jar包作用
- linux php和java环境变量配置_Linux下Java环境变量的安装与配置
- (OS X) OpenCV架构x86_64的未定义符号:错误(OpenCV Undefined symbols for architecture x86_64: error)...
- 数据库与数据库管理系统
- JavaScript基础5——关于ECMAscript的函数
- (素材源码)猫猫学IOS(十)UI之_NSTimer_ios计时器
- DOC命令小问题~~+理解
- 手机游戏连接计算机屏幕,手机怎么投屏到电脑?简单几个步骤就能实现,看电影玩游戏爽爆了...
- 【约束优先级问题二】动态高度cell
- 更易用的OceanBase|生态工具征文大赛正式开启!
- 优秀课程案例:使用Scratch图形化编程工具做一个见缝插针游戏!
- [渗透教程]-006-渗透测试-Metasploit以及实战教程
- 开发者出海跨境收款——如何完美解决限额问题?
- 智能化软件开发沙龙优秀学者报告·第1期PPT分享(张天翼 普渡大学)
- Swift之高德地图的调用
- SVM文本分类-在《红楼梦》作者鉴别的应用上(python实现)