#宝探し迷路を作る:寄り道まで含めた最短ルートの探索
見た目は、探検ゲームの箱を開けたようなコバルト青とレモン黄。太い壁のマップ、番号付きの宝、チェックポイントのメダルを主役にしました。迷路を作るだけでなく、宝を3つ拾って帰るパズルです。
#出口へ行くだけでは終わらない
宝探し迷路 MazeLoom は、Sから出発して宝1・2・3を集め、Gへ到達するゲームです。番号順に集める必要はありません。ただし、出口へ直接行っても宝が足りなければクリアにはなりません。行き止まりの奥に宝を見つけたら、来た道を戻ります。
8×8、14×14、22×22の迷路を、問題コードから生成します。画面の隣マスをタップするか、方向ボタンや矢印キーで移動。ヒントは現在地からの次の1歩を示し、クリアすると実際の手数と最短手数を比較します。問題リンクにはプレイ履歴ではなく、サイズ・コード・生成版だけを入れます。家族と同じ地図を遊ぶことができます。
無料・印刷・リンク共有自体は新しい機能ではありません。QuickPrintables はコードによる再現と解答付きPDF、Maze Generator は多様な形とPNG・SVG・リンク共有を提供しています。今回の軸は、単純な出口探しではなく「寄り道の順番を考える」体験です。競合の説明ページは確認しましたが、利用者数や検索需要、競合の出力品質を実測したわけではありません。優位性やヒットはまだ分かりません。
#全マスをつなぎ、ループを作らない
生成では最初に全マスを壁で区切ります。訪問済みの領域と未訪問のマスを結ぶ境界をランダムに選び、未訪問側へ通路を開きます。未訪問だったときだけ接続するので、最後には全マスがつながり、通路にループがない木になります。
マスがN個なら通路の接続はN−1本。これをテストで確認し、逆向きにも接続が存在すること、盤面外や左右端をまたぐ接続がないこと、全マスへ到達することも検査します。「迷路らしい絵ができた」だけでなく、ゲームの歩ける構造を検証するためです。
宝は出発点・出口・既に選んだ宝からの通路距離が近すぎないよう、離れたマスを順に選びます。3つの宝は異なるマスで、SやGには置きません。サイズは広さの指定であって、年齢別の難易度や教育効果の認定ではありません。同じサイズでも道の構造は変わります。
#現在地だけでは、最短ルートを探せない
普通の迷路なら「どのマスにいるか」を探索状態にできます。宝探しでは同じ場所でも、まだ宝を持っていない状態と3つ持っている状態は別です。
3つの宝の取得を3ビットで表現し、状態を 現在地 × 取得状態 とします。取得状態は0〜7の8種類。宝1だけなら1、宝2だけなら2、宝3だけなら4、全部なら7です。
const nextMask = treasureIndex < 0
? currentMask
: currentMask | (1 << treasureIndex)
const nextState = nextMask * cellCount + nextCell隣へ進むたびに必ず1手なので、この状態空間の幅優先探索で最短手数が求まります。出口にいて取得状態が7になるまで探索します。最大でも22×22×8=3,872状態。戻る道も探索に含めるので「同じ場所は二度調べない」という普通の迷路向けの省略は使えません。
ヒントも同じ探索を現在地・現在の宝から始めます。入口からの答えをそのまま示すのではなく、間違った枝へ進んだ後でも、今いる場所から宝を集めて戻る次の1歩を示します。
通路自体は一本道ですが、宝を集める最短の順番が一つとは限りません。解答の表示は「最短ルートの1例」とします。正しい別順を不正解と扱いません。
#最短手数を別の方法で確かめる
テストでは、状態探索と同じ処理だけを繰り返して合格にしないようにしました。宝3つの訪問順は6通りです。それぞれについて S→宝→宝→宝→G の通路距離を足し、最小値を求めます。この値と状態探索の手数を、多数のコード・全3サイズで比較します。
さらに解答を実際の移動処理に通し、すべての宝が取得され、表示手数が一致してクリアになることを確かめます。壁越しの移動、端をまたぐ移動、宝不足でのゴール、クリア後の移動も別に検査します。
#同じコードを未来にも再現する
問題リンクに v=1 を含め、サイズ・コードと一緒に生成に使います。生成アルゴリズムや宝の選び方を後で変える場合は、既存版の再現を維持するか、別の版として扱う必要があります。将来の変更で、友達に送った問題が違う迷路になっては困るからです。
コードは英数字とハイフンの1〜32文字に制限し、対応しないサイズ・版・重複パラメーターを拒否します。不正なリンクを黙って別の問題として読んだようには見せず、画面にエラーを出します。コードはURLや保存ファイルに残るため、名前や秘密を入れないよう案内します。
#遊んだ地図と印刷した地図を一致させる
画面・SVG・PNG・PDFで同じ通路と宝のデータを使います。PDFはA4の2ページ。1枚目は問題だけ、2枚目は最短ルートの解答です。画面で答えを表示していても、問題ページにルートを入れません。PNG・SVGは解答を含めるチェックを独立させました。
PDFは既存のpdf-libでベクター線を直接描きます。日本語フォントを新しく追加せず、ファイルの注記は英語、プレイ画面は日本語にしました。宝には色だけでなく番号を添え、白黒印刷でも区別しやすくしています。PNGはSVGを画像化して保存し、SVGは拡大しても線を保てます。
実ファイルのページ数・A4寸法・内容とブラウザのクリア操作を検査します。ただし、実物を印刷した紙の読みやすさと実機Safariの操作は別の検証です。コード検査でそこまで確認したとは言えません。
#足しすぎないための境界
この版にはアカウント、ランキング、途中プレイの自動保存はありません。リンクから再現するのは問題だけです。再読み込みで最初からになります。長く歩いた場合に画面のデータが膨らみ続けないよう、足跡は直近2,000マスまでにし、手数・所持宝はプレイ中保持します。
生成と探索は決定的な計算で、AI推論ではありません。モデルの追加や有料APIを使わなくても、状態の作り方を変えると遊び方が変わります。次の拡張を考えるなら、宝の数を無制限に増やすより、紙とスマホで遊びにくい場所を実際に確認することから始めます。
[ ./next_action ]
読んだら、 MazeLoom を実際に動かす。
この開発ログは MazeLoom をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。