一个简单的Roguelike地图算法

前言
       
首先说一下为什么这次没有把他新启一个分类放在算法里面,因为这个是我刚刚学习实现的一个基于Unity 的roguelike地图生成器。只是单纯的实现了需求,
所以我觉得还谈不上算法。工程源码我已经上传到了 
https://github.com/FantasyTianyu/A-Simple-RogueLike
         其实在我小时候就玩过不可思议迷宫系列(千万别跟我说最近上线的国产手游:不可思议迷宫。我说的是日本出的不可思议迷宫系列,让我再次鄙视下国内
游戏公司,各种山寨什么的就不说了),比较著名的是风来的西林,特鲁尼克大冒险。但是我一直不知道这些游戏其实属于一种游戏,名字叫做roguelike,其实
这类游戏很早以前在命令行时代的电脑上就已经出现了。而这类游戏最有意思的地方救市每次进入迷宫的地图都不一样,这也让我产生了好奇心,那就是这是如何
做到的,所以我才去学习了一下这个roguelike地图算法。

正文
       
在我在网上查询资料的时候发现了国内的一个不错的网站:indienova,上面有不少独立游戏开发的教程,而我最关心的也是上面有不少人分享的roguelike
地牢生成算法。这其中有各式各样的,通常来说有两种,一种是通道房间式的(也是我所实现的方式),还有一种是洞穴式的。前者的特点是房间一般是四方的,
夹杂着通向各个房间的通道,后者则更像是毫无规律的迷宫,可以行走的范围几乎没有规则的生成,路线较为宽广,分散。由于我实现的是第一种,那么我下面就说
一下我在写这个算法时候的思考过程。
         首先,为了方便管理地图,我们创建一个二维数组,里面全部填充上墙壁,比如可以使用枚举类型来放入二位数组中存储,最后在遍历整个二位数组,根据
枚举类型创建对应的元素:地板,宝箱,楼梯,怪物等。接下来的方式我一开始是这么想的:创建一定量的房间使他们互相不回叠加,然后再创建几个通道使他们
相互连接,这个用语言表达起来似乎没什么问题,但是我在实际实现中发现有很多不好解决的问题,所以最后我推翻了这个想法,结合我在indienova上看到的文章
,而采用了下面的实现思路:
         1.随机生成一个房间
         2.随机选择一个方向来决定用这个房间对应方向的随机一面墙,但不能是整个地图的边缘
         3.基于这个方向和这面墙检索是否能向这个方向创建一个随机长度的通道,并且在这个通道尽头再创建一个房间,如果可以那就创建,否则回到第二步
         其实以上的三点是我这次实现的核心的思想,其中2 和 3写在了一个while循环中,而循环的条件是是否达到了我需要创建的房间数,当然这个房间数我也是
随机生成的,但是这样也暴漏了我的实现方式的缺点,那就是我的房间的大小不能太大,房间数量不能太多,不然无论如何不能达到目的。也就是说我现在的实现
还有一定的局限性,所以这个主循环在更好的算法里应该是这样:房间的创建是整个地图大笑作为标准的,应该创建到创建不下为止。而且我现在的过道都是直线
没有转弯,显得很单一,所以之后如果有时间,我还是会继续去indienova上拜读大神的文章和源码,好好的学习一下,实现出更好的算法。也许那时再开个算法
分类去说,但是这次就先扯这么多啦。

 

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1