GameRes游资网授权发布 无限续关类游戏(类似天天酷跑)是如何无限生成关卡的?其中运用了什么算法?
本人就个人理解和实践经验做一些归纳和解释,同时带上编程和设计思路:
1. 首先,关键就是随机。
这里提到的“无限”实际上就是一个随机的过程。随机保证不断有关卡出现在玩家眼前同时又让有玩家有新鲜感,造成“无限续关”的感觉(以下伪代码);
2. 解决了随机问题,接下来就是合理问题。
如何让新生成的关卡符合玩家之前的游玩体验,并且保证是可以通关的?可以用两种方式解决:
(1)约束,对新生成的元素(如怪物、地形等随机点)做出一定的限制,以使其符合之间设计的关卡通识。在此用Minecraft的生成算法举个例子,例如怪物只能在晚上出现(时间变量限制),只能在亮度低的地方出现(生成时若检测亮度数值不符合则不生成),例如沙砾会在水边生成(检测周围地格)等,这些附加条件都属于约束,以保证新生成出来的关卡与原来的关卡保持合理一致;
- 循环(地形生成周期)
- {
- 如果(条件合理 如:目前地形 == 沙漠)
- 生成沙砾();
- 或者(目前地形 == 海洋)
- 生成水面();
- }
复制代码
(2)模板,用固有的(或者可以调整某些参数的)关卡模板(一组预先定义好的生成函数)来生成新关卡。这种方式生成的关卡变化较小,但往往设计感较强。而且通过调整参数(怪物浓度、资源密度、水域宽度等)可以创造出具有相当差异的新关卡。同时这种方式对合理性的解决往往更加有效稳定,相比之下随机约束的方式有时考虑不周产生“坏关”或“卡关”的概率会高一些。不过模板法相对的对游戏设计的要求更高一些(以下伪代码)
- 循环(地形生成周期)
- {
- 整数 a = 随机正整数;
- 如果(a 等于 1)
- 随机生成();
- 或者(a 等于 2)
- 碎裂地形模板();
- }
- 碎裂地形模板(碎裂程度,砖块浓度)
- {
- 循环(地形生成周期)
- {
- 如果(条件合理 如:目前地形 == 沙漠)
- 每 砖块浓度
- 生成 碎裂程度的 砖块;
- }
- }
复制代码
这两种方法并不冲突,可以兼而有之。在跳跃游戏《涂鸦跳跃》(Doodle Jump)中,玩家既会遇到随机生成的跳板,也会遇到有预先设计好的跳板群(例如一条就塌需要连跳的一段关卡),可以说随机生成的部分考验了玩家的基本素质(底力),而模板部分考验了玩家的经验。两种方法结合,给玩家更佳全面的体验。
图左方的黄色跳板跳过之后便会开始碎裂,需要连续向上移动,是预先设计好的模板生成的。图右方的部分则是随机生成。
3.关于难度递增问题。
通过调整上述生成算法中的参数、环境值、变量等,难度会自然而然地提升。但是若要做到合理量化,这就涉及到数值策划的数学问题了,首先需要一个数学模型来说明“难度”这个目标量是如何随着“怪物浓度”、“可站地格”等数值变化的。这个模型应由设计者结合关卡结构和实际体验决定。
例如:
![]()
(α为难度值,β为怪物浓度,γ为可站地格)
其次,设定难度增长曲线。也就是难度随着时间、关数等增长的函数。
例如:
![]()
(α为难度值,λ为递增参数,χ为当前时间)
这是一个简单的难度增长曲线,难度随时间线性增长。
之后,根据难度增长曲线,确定变量随时间增长的函数
联立得
![]()
及
![]()
就是最终怪物浓度,和可站地格随时间和另一个参数变化的公式。
相关阅读:
跑酷游戏关卡设计怎么实现难度量化?