文/兔四

概述:文章基于一种基础的地图,来讨论三套不同的地图生成方案。

文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案。其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样,适合自己游戏的才是最好的)。

根据方案生成地图之后,还可以加上一些静态分布来丰富地图表现,大家就自行发挥啦!

地图基础

地图的形式很多,这里我使用的地图是以tile块为单位分割的地图,地图上的tile块形式很多,但主要分成三种:

A:陆地,可以在上面分布一些角色啦物件啦;

B:过渡,根据物理框可以在上面移动,不过一般不会分布物件;

C:水域,不可移动的区域,可以理解成为迷宫的“墙”;

image001.png (266.48 KB, 下载次数: 31)

2017-6-15 14:16 上传

在后文的迷宫生成方案里,会以水域作为分割,主要围绕陆地的分布来设计迷宫,过渡的地块根据游戏实际需要再去生成。如果你不希望地图用水域来分割,那只需要把水域改成传统的墙壁即可。

本文用来展示的地图,面积都比较小,方便表达迷宫的生成规则。在实际游戏制作时,按需求去铺量就行。

方案一:主路扭曲型

1、首先,按照下图的间隔规则来生成基础的大地图,1为陆地,0为水域。

image003.png (104.04 KB, 下载次数: 40)

2017-6-15 14:16 上传

2、然后,选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向,斜边不算)。找到就把他们联通,即把两个1之间的0变成陆地,这里用红色来表示。

image005.png (104.33 KB, 下载次数: 37)

2017-6-15 14:16 上传

3、把上一步“终”的格子作为新的一个“起”格子,不停循环第二步的过程,直到找不到周围有黄色的1。

image007.png (104.82 KB, 下载次数: 32)

2017-6-15 14:16 上传

4、这时候,原路往回走(即不停去找前一个格子),直到找到一个格子,这个格子周围有黄色的1,那么从这个格子开始重复前两个步骤。

image009.png (104.48 KB, 下载次数: 32)

2017-6-15 14:16 上传

5、接下来就是不停重复上面的步骤,找到就联通,找不到就往回走。

image011.png (105.61 KB, 下载次数: 31)

2017-6-15 14:16 上传

image013.png (106.71 KB, 下载次数: 38)

2017-6-15 14:16 上传

6、填充完整个地图之后,迷宫就算是制作完成了,根据需求加上终点即可。

image015.png (108.03 KB, 下载次数: 36)

2017-6-15 14:16 上传

总结一下,这种方案生成的迷宫会有一条明显的主路,即一条特别长、贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。

方案二:自然分岔型

这个方案的雏形来自于随机prim算法,具体步骤如下:

1、跟方案一一样,生成一个基础地图。格子先用黄色1和灰色0来表示,暂时不区分水陆。

2、随机取一个地图边缘的黄色1,把它标记为红色1,即变成陆地。然后把它旁边的灰色0标记成蓝色0,表示“待定”。(注意的是,大地图四周的灰色0固定不变,作为地图边缘而存在)

image017.png (98.57 KB, 下载次数: 39)

2017-6-15 14:16 上传

3、敲黑板了!!这里是重点!!!

随机选一个蓝色的0(这一步很重要,会使这个方案明显区别于上一个方案),然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1:

如果是,则把对面的黄色1标记成红色1,即变成陆地,然后把蓝色0变成红色的0,即也变成陆地;

如果不是,就把这个蓝色的0变成灰色的0。

最后,把新创建的红色1周围的灰色0,标记成蓝色0。

image019.png (98.17 KB, 下载次数: 34)

2017-6-15 14:16 上传

4、继续重复上面的步骤

image021.png (99.19 KB, 下载次数: 29)

2017-6-15 14:16 上传

image023.png (98.89 KB, 下载次数: 36)

2017-6-15 14:16 上传

5、对比上图和下图,这里取一个蓝色0生成一个红色1之后,新生成的红色1旁边,有两个蓝色0的两边都是红色1了,那么就根据第三步的规则,在稍后取到这些蓝色0时,就会把他们变成灰色0。

image025.png (97.92 KB, 下载次数: 39)

2017-6-15 14:16 上传

6、继续重复上述步骤,直到整个地图没有蓝色0了,地图就生成完毕。

image027.png (105.25 KB, 下载次数: 41)

2017-6-15 14:16 上传

image029.png (104.6 KB, 下载次数: 42)

2017-6-15 14:16 上传

总结一下,对比方案一,这套方案不会出现明显的主路,迷宫相对比较自然,但迷宫的分岔路会比较多,所以迷宫可能会更复杂,即玩家需要做选择的次数可能比较多。

方案三:块状分割型

上述两个方案有个共同的特点,就是道路永远都是1个格子宽,如果游戏需要给地图创造一些小型地块或者更宽的道路,需要在迷宫生成之后再用各种分布的规则来丰富迷宫。

而第三个方案则以小型地块作为出发点来设计迷宫,这套方案的雏形来自于国外大神Bob Nystrom,有兴趣的可以去查看他个人主页。

1、首先,在大地图(还是之前那个大地图)上生成若干小型地形,保证边长是奇数且不重合就好(示意图全部使用了正方形,实际上可以做成长方形让地图更加自然)。注意顶点要在黄色1格子上即可,这里我用橙色1来表示这些小型地块。

image031.png (101.88 KB, 下载次数: 31)

2017-6-15 14:16 上传

2、然后,根据之前方案一的迷宫生成方案,在非小型地块的区域里,用迷宫来填充。这一步完成之后,迷宫和小型地形是分隔开来的。

image033.png (97.39 KB, 下载次数: 36)

2017-6-15 14:16 上传

3、在橙色1的小型地形周围,随机取点以连接黄色1,连接点的数量可以根据需要来确定,建议是不要吝啬连接点的个数,因为这种地图之下,分岔路远比前两种方案要少。

image035.png (93.28 KB, 下载次数: 32)

2017-6-15 14:16 上传

4、接下来是简化地图,目的是去掉一些死胡同,因为这种方案的核心在于小型地块,没有必要让玩家在迷宫的路上绕。方法是把一些3边都是灰色0的黄色1去掉即可,具体数量也根据游戏需求来制定,我这里只去掉了一部分。

image037.png (98.2 KB, 下载次数: 34)

2017-6-15 14:16 上传

5、最后,给地图加上出口和入口,地图就做完啦!

image039.png (99.07 KB, 下载次数: 34)

2017-6-15 14:16 上传

总结一下,这种方案比前两种多了小型地块,这一点比较适合设计玩家的阶段性反馈。同时地图的分岔路明显减少,玩家在这种方案下的选择次数会明显降低。另外,由于这个方案的步骤相对多且独立,所以对于设计者来讲会比较容易控制地图的结构。

相关阅读:

二维数组随机生成地图迷宫_经验分享:三套简单的迷宫地图生成方案相关推荐

  1. python二维数组随机取行,组成新的数组

    python二维数组随机取行,组成新的数组 ```python **import numpy as np # 创建一个5*2的数组,并随机从这个数组里面取两行 array = np.arange(10 ...

  2. java二维数组随机赋值_java 二维数组随机赋值

    java 二维数组随机赋值 [2021-01-31 00:08:55]  简介: 目的:使用二维数组打印一个 10 行杨辉三角.(视频教程推荐:java课程)思路:1. 第一行有 1 个元素, 第 n ...

  3. 二维数组存放多个字符串_二维数组中输出多个最值及其下标。(仅供参考)

    //求二维数组的最大值最小值及最值所在的下标(含多个最值) #include <stdio.h> #include <stdlib.h> #include <time.h ...

  4. php 二维数组 随机排序_php二维数组排序—默认自然排序

    什么是二维数组?二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩阵称变方阵.对称矩阵a ...

  5. php 二维数组 随机排序_PHP二维数组排序简单实现方法

    本文实例讲述了PHP二维数组排序简单实现方法.分享给大家供大家参考,具体如下: function multi_compare($a, $b) { $val_arr = array( 'gold'=&g ...

  6. java二维数组数字数显次数_【每日一题】118.数组中数字出现的次数

    关注我们获取更多计算机考研信息 ? 今日习题 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] ...

  7. 数据分析之np.random.choice()补充【从二维数组随机选择n行一维数组】

    相关参数 size:从元组,列表,数组中取多少个数据,不写,默认为1个 replace:是否可以取相同元素:True:可以,False:不可以,默认是True p:实际是个数组,大小与数组相同,用来规 ...

  8. php 二维数组 随机排序_php二维数组排序方法(array_multisort usort)

    例如像下面的数组: $users = array( array('name' => 'tom', 'age' => 20), array('name' => 'anny', 'age ...

  9. java求二维数组每行的最大值_用JAVA输入一个二维数组a[3][4]的元素值,求输出其元素最大值...

    展开全部 这个简单啊,把所有元素遍历一边62616964757a686964616fe58685e5aeb931333335343963 代码: import java.util.Scanner; p ...

  10. python随机生成二维列表_对python产生随机的二维数组实例详解

    对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...

最新文章

  1. 爬取王垠的博客并生成pdf
  2. 配置 LBaaS - 每天5分钟玩转 OpenStack(121)
  3. jenkins gitlab php,jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)...
  4. JavaScript this 小结
  5. Java—stream以及集合框架使用
  6. th:text=“${user?.name}“ ${?.}
  7. mysql对应systables_mysql5.7中的sys表详解(转)
  8. 【2020牛客寒假基础算法训练营】第二场总结
  9. by mysql 按每分钟group_MySQL group by 统计每5分钟数据量
  10. Python 调试Webservice接口
  11. 职场智慧:君子应处木雁之间,当有龙蛇之变
  12. 微信公众号vue接入高德地图定位逆解析
  13. 驱动学习(九)字符设备的非阻塞操作
  14. c++调用python详细教程
  15. 屏幕录制软件 Camstudio
  16. vi/vim中复制粘贴命令
  17. 2021ICPC沈阳游记及2021年度总结
  18. 实战|QUIC协议在蚂蚁集团落地
  19. 指针,指针变量,指针变量指向的一些理解
  20. python 人像素描_python如何将图片转换素描画

热门文章

  1. ubuntu邮件服务器,Ubuntu下搭建mail邮件服务器的方法教程
  2. FreeSWITCH折腾笔记9——使用FS做一个i-SBC
  3. 太阳高度角方位角计算
  4. php怎么给图片添加文字,使用php怎么给图片添加文字水印
  5. [DataAnalysis]基于统计假设检验的机器学习模型性能评估——泛化误差率的统计检验
  6. 【贪玩巴斯】理工类科技检索(三)——「科技检索中的课题主题分析与例题全解」
  7. 后台网站首页设计过程
  8. 电视剧:我的团长我的团
  9. 抖音招商团长入驻条件
  10. failed shard on node [XXX], failed recovery, failure RecoveryFailedException