通过布局生成器传递一个种子生成器
创建一个种子伪随机生成器并将其传递到每个生成函数中,而不是在不相关的帮助程序中调用 Math.random。 MDN 指出,Math.random 的初始种子无法由用户选择或重置,因此它本身无法提供可重播的种子。将种子存储在生成的关卡或其错误报告旁边。如果稍后添加或重新排序随机抽取,相同的种子可能会产生不同的布局;当精确的长期重播很重要时,对生成器进行版本控制或记录生成的地图。
尽可能按用途分开选择:一条流用于房间形状,另一条用于装饰,另一条用于敌人放置。然后添加装饰性绘图不会自动移动敌人图案。
生成、验证然后呈现
建造房间后,在展示房间之前进行结构检查:存在入口和出口,所需的钥匙适合可行走的瓷砖,寻路算法可以在收集必需物品的同时到达出口。如果布局失败,请使用有限数量的新种子重试,然后使用已知的后备空间或显示明显的生成失败。记录被拒绝的种子和失败的不变量,以便可以在本地重播意外的布局。
测试一小组精心选择的种子,包括种子解析器接受的类似边界的值,以及普通种子的样本。这并不能证明所有可能的种子都是有效的。这是练习确定性再现和生成器拒绝路径的实用方法。
将种子与难度声明分开
可复制的房间并不一定是公平的房间。播放生成的示例并询问危险是否可见以及预期路线是否留有足够的时间做出反应。在公平性审查中将该审查与分布分析分开。当发现缺陷时,种子让团队讨论一种精确的布局,而不是根据记忆描述近似的排列。
关于种子随机关卡生成的常见问题
我可以使用 Math.random 和保存的数字重现关卡吗?
不是通过重置 Math.random 的内置状态; MDN 表示无法选择或重置其初始种子。使用由你控制种子的伪随机数生成器,并让所有生成选择都通过该生成器完成。
种子是否能保证每个生成的关卡都是可解决的?
不,种子会复制选择序列;它不会验证生成的地图。检查可达性和所需对象规则,然后拒绝或修复失败的布局。
延伸阅读
发现信息过时了? 报告需要更正的内容