基于随机区块的地图生成设计 - illusion 的实现

在地图 illusion 中实现了通过预先保存的结构进行局内地形随机生成,以实现每场对局的地形都不同的效果。

效果示例

20241210155654

实现思路

随机数生成

20241210162601

JE: 原版实现随机数生成 中,我们实现了在 Minecraft JE 中通过 UUID 生成随机数的方法,并基于此实现了随机数生成器。

区块类型

首先,局内地图被分为了以下几种区块:

  • 大门区块
  • 固定区块
  • 淘汰区块
  • 供奉区块
  • 主要/次要建筑
  • 随机区块

其中,大门区块与固定区块不参与随机生成。

  • 大门区块
    包含开启大门的烛台,用于逃生者逃脱
  • 固定区块
    不被刷新或随机更改的区域
  • 淘汰区块
    场上有 3 个作为淘汰区块的区域,生成地图时会随机选择 2 个区块作为淘汰区块,另一个作为固定建筑刷新
    该区块类型为唯一区块,位置随机,但地图中必定包含所有种类的该区块
  • 供奉区块
    场上有 7 个供奉区块,其中 5 个区块中含有供奉箱(另外两个在主要/次要建筑中)
    该区块类型为唯一区块,位置随机,但地图中必定包含所有种类的该区块
  • 主要/次要建筑
    场上有 1 个主要建筑和 1 个次要建筑,在该区块中必定会刷新一个供奉箱
    该区块位置固定,但有两种刷新情况,不同情况下门、窗、供奉箱位置不同
  • 随机区块
    场上有若干随机区块,刷新时将从 32 个模板区块中随机选择一项进行刷新
    随机区块刷新情况不固定,不唯一,且可能一次刷新中不包含某些区块

区块刷新

20241210163351

通过结构方块预先保存了多种区块模板,在刷新时通过随机数生成器生成随机数进行选择。

唯一区块刷新

20241210164157

20241210163855

使用随机数选择列表中的区块进行刷新,刷新后该项将被标记,再次步进到此将跳过

如图中所示,标记 将一直向左边传送,默认未刷新的区块将以石头表示。

执行随机数操作后 标记 向左步进随机数次数,当 标记 步进至铁块上时,回到最右方起点

步进结束后,将所在方块设置为红石块(并执行了命令方块内的指令)

如果下次步进结束后所在位置为红石块,将步过(跳过)该位置至下一个位置

20241210165157

此处 标记 指代 Minecraft JE 中的实体 Marker (标记),下同。

随机区块刷新

遍历所有带有指定 Tag 的 标记,作为 标记 在自身的位置执行生成函数

execute as @e[type=marker,tag=随机区块,tag=!随机区块.done] at @s run function 生成随机区块

20241210224003

主要/次要建筑刷新

指定 标记 在自身的位置执行生成函数

execute as @e[type=marker,tag=主要建筑,tag=!主要建筑.done] at @s run function 生成主要建筑