▍AI Dev Lab
MazeLoom

宝探し迷路を作る:寄り道まで含めた最短ルートの探索

宝探し迷路の開発記録。通路を木として生成し、現在地と3つの宝の取得状態を組み合わせて最短ルートを探す仕組みを解説。問題コードの版固定、画面と解答付きPDFの一致、手数と印刷の検証を整理します。

·decision改善·stage公開中

#宝探し迷路を作る:寄り道まで含めた最短ルートの探索

見た目は、探検ゲームの箱を開けたようなコバルト青とレモン黄。太い壁のマップ、番号付きの宝、チェックポイントのメダルを主役にしました。迷路を作るだけでなく、宝を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です。

ts
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 をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。

[ ./related_logs ]

関連する開発ログ

all logs →
ShadowTwin

立体パズルの別解を作る:同じ影と最少の積み木

ShadowTwinの開発記録。3方向の図から別々の最少配置を2つ探す仕組み、5問の独立全探索、スマホの横並び比較、保存・再編集と入力検査を解説します。実照明の計算や能力診断ではありません。

read log →
SlitCard

スリットアニメーションを作る:4コマの合成と透明原稿の設計

SlitCardの開発記録。4コマの帯を交互に合成し、すき間と黒帯で別のコマを見せる仕組みを解説。同縮尺の台紙・透明シートSVG、50mm確認線、手動プレビュー・初期非表示、再編集と実出力検査を整理します。

read log →
WindowLight

日当たりシミュレーションを作る:窓の光を床へ投影する幾何モデル

WindowLightの開発記録。太陽位置近似から窓の4隅を床へ投影し、凸多角形を部屋で切り取る設計を解説。国立天文台の16時刻との限定照合、大気差・低高度・実際の採光との違い、SVGと設定の再編集を整理します。

read log →
GridLights

電源構成の比較を作る:割合と実量を100個の電球で読み解く

電源構成比較GridLightsの開発記録。12か国の年次発電データを最大剰余法で100個の電球に変換し、割合とTWhを比較する設計を解説。欠損を0補完しない7分類、予想と実値、出典付きSVGと実データ検証を整理します。

read log →
SoundLoom

音のお絵かきを作る:実WAVから絵を測り直す設計

音のお絵かきの開発記録。描画を正弦波のPCMとWAVへ変換し、保存音声の周波数をGoertzel法で測って比較する仕組みを解説。音量・測定窓・量子化の限界と、編集・離脱時の古い結果を抑止する検証を整理します。

read log →
BoxNet

箱の型紙と折り図を同じ面から作る設計

小箱の型紙作成の開発記録。面・のりしろ・折り線を共有し、組立確認とA4実寸PDFを作る設計を解説。用紙外を縮小しない判定、校正線、紙厚を扱わない限界、出力検査を整理します。

read log →