迷宫的故事

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

这个游戏并不保存迷宫。你玩到的每一座迷宫,都是从一段短代码当场重新生成的 — 服务器既不存储也不传输迷宫数据,你和朋友却能看到一模一样的迷宫,秘密就在这里。

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

种子 — 迷宫的起点

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

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

解剖迷宫代码

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

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

最后一个字符是校验和 — 它会与按固定规则从前面字符算出的值比对,能捕捉所有单字符错误和相邻两字符写反的失误。绝不会因为代码打错而打开一座莫名其妙的迷宫。

迷宫如何生长

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

高难度下还会打通一部分死胡同的墙,制造环路。这样一来,一只手扶着墙一直走总能到出口的经典攻略就失灵了。

起点和终点选在迷宫边缘上相距最远的两个格子。如果生成的迷宫正解路径短于该难度的标准,就按固定规则重新生成 — 连重试本身都是确定性的,同一代码永远得到同一座迷宫。每座迷宫必定有解,这一点也在生成阶段就得到保证。

难度1~20决定什么

难度同时决定迷宫的大小和性格。第1级是8×8格的小巧迷宫,第10级是40×40,到第20级则是足足60×60格。不只是大小,走廊的曲折程度、岔路频率、环路比例、正解路径的最短长度也会一起上升。

零流量的分享

分享迷宫时传递的只有11个字符的代码。分享链接和打印页上的二维码,装的也不是迷宫数据,而只是一个带代码的网址。接收方的浏览器会根据代码当场重建迷宫,所以哪怕是最大的60×60迷宫,也只需11个字符就能送达。