028 溶ける鍵 — 5段階の独立教材

Python 3.11以上。依存は pyxel==2.9.9 のみ。外部画像・音・字体は不要です。
このZIPを展開し、README.txt、requirements.txt、01_walk.py〜05_choose.pyが並ぶフォルダーを端末で開いてください。
以降のコマンドはすべてそのZIPルートから実行します。各ファイルは他の段階のコードを読み込みません。

macOS / Linux：最初の1回
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt

macOS / Linux：各段階を単独で起動
.venv/bin/python 01_walk.py
.venv/bin/python 02_unlock.py
.venv/bin/python 03_chain.py
.venv/bin/python 04_undo.py
.venv/bin/python 05_choose.py

Windows PowerShell / コマンドプロンプト：最初の1回
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt

Windows：各段階を単独で起動
.venv\Scripts\python.exe 01_walk.py
.venv\Scripts\python.exe 02_unlock.py
.venv\Scripts\python.exe 03_chain.py
.venv\Scripts\python.exe 04_undo.py
.venv\Scripts\python.exe 05_choose.py

操作
矢印：1マス移動、または壁/閉じた錠へ向く。
SPACE：向いた隣の錠を使う。開錠では歩かない。
Z：一手戻す（04・05のみ）。R：同じ配置を最初から。ESC：終了。
1キーずつ押して離してください。05は全キーの解放を待ちます。
緑枠＝今の鍵に合う錠。白枠＝向いた先。OUT＝出口。
01は歩く練習で錠がなく、SPACEを押しても何も開きません。

最短の確認用キー列（各キーを離してから次へ）
01：右、右、右、右、右。5手。
02：SPACE、右、右。3手。
03・04：右、SPACE、右、右、SPACE、右、右。7手。
05：上、SPACE、右、SPACE、右、右、SPACE、右、右。9押下・7手。
05の「上」「最初の右」は向きの変更だけです。物置には入らず、上の錠だけ開けます。
鍵は成功した開錠でだけ1節減ります。待つ、失敗する、開扉を通る、向きを変えることでは減りません。
05の最後は0節になりますが、既に開いた扉は通れます。新しい錠は開けません。

自動チェック（macOS / Linux、ZIPルート）
.venv/bin/python -B test_stages.py
.venv/bin/python -B 01_walk.py --headless-smoke --screenshot qa/01_start.png
.venv/bin/python -B 02_unlock.py --headless-smoke --screenshot qa/02_start.png
.venv/bin/python -B 03_chain.py --headless-smoke --screenshot qa/03_start.png
.venv/bin/python -B 04_undo.py --headless-smoke --screenshot qa/04_start.png
.venv/bin/python -B 05_choose.py --headless-smoke --screenshot qa/05_start.png
Windowsでは上の .venv/bin/python を .venv\Scripts\python.exe に置き換えます。
--headless-smoke は12フレーム描画して終了。--screenshot は同時指定必須です。
画像出力先は起動時の作業フォルダー基準で絶対パスへ解決するため、任意の場所からも起動できます。

test_stages.py はPyxelを読み込まず、純粋ルールと描画のスタブを検査します。
原作model.pyを持っている場合のみ、次の追加引数で実原作との一致も再検査できます。
.venv/bin/python -B test_stages.py --canonical-model "/原作の場所/028_melting_key/model.py"
原作の場所は自分の展開先へ置き換えてください。このZIPに原作全体は同梱していません。
追加引数がない場合は原作比較の3テストが明示的にskipされます。

教材の範囲
01は錠なし、02は錠1枚。03/04は原作A、05は原作Cの床・開始位置・出口・錠と同一です。
原作Bの燭台と分岐、部屋切替、説明/一時停止、日本語字体、音声、操作記録は教材に含めません。
入力簡略化などの正確な差分はLESSON.mdとlesson_meta.jsonを参照してください。
qa/QA.mdには純粋ルール、スタブ、実Pyxel描画、未確認事項を分けて記録しています。
Windows/macOS実機操作、人間の初見試遊、音声出力は未確認です。無音設計です。

ライセンス
原作のMIT告知を各教材ファイルの先頭とLICENSEに全文保存しています。
原作LICENSE末尾にはNoto由来字体の別ライセンス案内がありますが、この教材には字体を同梱しません。
Pyxelは別途インストールする外部依存です。
