迷宫的故事

一个11字符的代码,如何重现同一座迷宫?

开始3D迷宫游戏
本页目录

每座迷宫都由浏览器根据一段短代码重新生成。墙壁和通道由浏览器直接创建,无需下载已保存的迷宫图,你和朋友也能玩到同一座迷宫。向全球排行榜提交记录时,迷宫代码会随记录一同保存。

本页介绍其中的原理:种子、迷宫代码和生成算法。虽然会出现一点数学,但写得很轻松,放心读。

种子 — 迷宫的起点

迷宫由随机数生成,但这个游戏的随机数并非真正随机,而是从一个叫种子的数字出发的伪随机数。只要种子相同,随机数序列每次都会分毫不差地重现。

因此,只要有种子和难度,整座迷宫 — 墙壁布局、起点、终点 — 都能原样重建。无论在哪个国家、哪台设备上打开,结果连一个比特都不差。为了不让浮点误差混进来,生成器只使用整数运算。

解剖迷宫代码

迷宫代码长这样:M1-7-03NQK8N5。去掉连字符后恰好11个字符:开头的 M、1位格式版本、1位难度、7位种子,以及最后1位校验字符。

字符使用名为 Crockford Base32 的字符集:数字0~9,加上去掉了 I、L、O、U 的大写字母。容易混淆的字母从一开始就被排除,抄写和口头念给别人都很方便;就算不小心写成 O,也会自动按 0 解读。小写、连字符、空格也都随意。

最后一个字符是校验和,由前面的字符按固定规则计算而来。它有助于发现常见的输入错误,但无法检测所有可能的错误。使用分享链接或二维码,就不必手动抄写代码。

迷宫如何生长

生成算法是 Growing Tree(生长树)。从一个格子出发,向相邻格子打通通道,像树一样不断生长——总是从最新的格子延伸,会长出又长又曲折的走廊;随机挑格子延伸,则会形成岔路密布的迷宫。难度决定这两种倾向的配比。

部分难度会从死胡同额外打通通道,形成环路和其他可选路线。第5至7级不添加这些通道,保持树枝状的分岔结构。环路会改变选路方式,但其比例并不是每升一级都会增加。

起点和终点选在迷宫边缘,通过搜索路径距离使两者相隔较远。如果正解路径短于该级别的目标,就最多重新生成8次,达到目标即停止;若仍未达到,则采用最后一次的结果。每座迷宫都有通往终点的路,生成规则固定,因此同一代码总会得到同一座迷宫。

难度1~20决定什么

难度会同时改变迷宫的大小和形态。第1级为8×8,第10级为40×40,第20级为60×60。规模和正解路径的目标长度会增加,而曲折通道、岔路和环路的组合则随级别变化。难度更高,并不代表每一种特征都会更多。

用短代码分享

分享链接和打印页上的二维码包含页面地址与迷宫代码,而不是整张墙壁布局图。接收方的浏览器会根据代码重建迷宫,因此即使是最大的60×60迷宫,也能用同一种11字符代码格式表示。

开始3D迷宫游戏