迷路のはなし

11文字のコードひとつで、どうやって同じ迷路をもう一度作れるのでしょう?

このゲームは迷路を保存しません。あなたが遊ぶすべての迷路は、短いコードからその場で作り直されます — サーバーに迷路データを保管も送信もしていないのに、友だちと自分がまったく同じ迷路を見られるのはそのためです。

このページでは、そのひみつであるシード、迷路コード、生成アルゴリズムを紹介します。少しだけ数学が出てきますが、気軽に読めるように書きました。

シード — 迷路のたね

迷路は乱数(ランダムな数)から作られますが、このゲームの乱数は本当のランダムではなく、シードという数から出発する疑似乱数です。同じシードから始めれば、乱数の並びはいつでもまったく同じに再現されます。

だからシードと難易度さえあれば、迷路の全体 — 壁の配置、スタート地点、ゴール地点 — がそのまま作り直せます。どの国のどんな端末で開いても、結果はビット単位で同じ。小数の誤差が入り込まないように、生成器は整数の計算だけを使っています。

迷路コードを解剖する

迷路コードはM1-7-03NQK8N5のような形をしています。ハイフンを除くとちょうど11文字 — 先頭のM、フォーマットのバージョン1文字、難易度1文字、シード7文字、そして最後にチェック用の1文字、という構成です。

文字にはCrockford Base32という文字セットを使います。数字の0〜9と、アルファベットからI、L、O、Uを除いた大文字です。紛らわしい文字を最初から外してあるので、手で書き写したり読み上げたりしやすく、うっかりOと書いても0として解釈してくれます。小文字・ハイフン・空白も自由です。

最後の1文字はチェックサムです — 前の文字たちから決まった規則で計算した値と照合して、1文字の打ち間違いや、隣り合う2文字の入れ替えをすべて検出します。間違ったコードで別の迷路が開いてしまうことはありません。

迷路が育つしくみ

生成アルゴリズムはGrowing Tree(育つ木)です。1つのマスから出発して隣のマスへ通路を掘りながら、木のように伸びていきます。いちばん新しいマスから伸ばし続けると長く曲がりくねった通路に、どのマスからでも伸ばすと分かれ道の多い迷路になります。難易度に応じて、この2つの性質をブレンドします。

高い難易度では、行き止まりの一部の壁を抜いてループを作ります。片手を壁につけてたどればいつかは出口に着く、という古典的な攻略法が通用しなくなるのです。

スタートとゴールは、迷路の外周でお互いにいちばん遠く離れた2つのマスに置かれます。そして完成した迷路の正解ルートが難易度の基準より短ければ、決まった規則で作り直します — この再挑戦さえも決定的なので、同じコードはいつでも同じ迷路になります。すべての迷路が必ず解けることも、生成の段階で保証されています。

難易度1〜20が決めるもの

難易度は迷路の大きさと性格の両方を決めます。レベル1は8×8マスのこぢんまりした迷路、レベル10は40×40、レベル20はなんと60×60マス。大きさだけでなく、通路の曲がり具合、分かれ道の頻度、ループの割合、正解ルートの最低の長さも一緒に上がっていきます。

通信量ほぼゼロの共有

迷路を共有するときにやり取りされるのは、11文字のコードだけです。共有URLも、印刷物のQRコードも、迷路データではなくコード入りのアドレスだけを載せています。受け取った側のブラウザがコードから迷路をその場で作り直すので、最大の60×60の迷路でも文字11個で届けられます。