三部屋の地下道：5段階の教材

必要: Python3.11以上、Pyxel2.9.9。検査環境: Linux / Python3.12.14 / Pyxel2.9.9。
ZIPを全展開し、READMEのあるフォルダでターミナルを開きます。

Windows:
py -3 -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
.venv\Scripts\python 01_passages.py
.venv\Scripts\python 05_undo.py

macOS/Linux:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python 01_passages.py
.venv/bin/python 05_undo.py

Windows/macOSのコマンドは案内であり、実機GUI確認ではありません。
各.py一個だけを別フォルダへコピーしても動きます。初回導入以外はネット不要。
日本語・空白を含むパスは引用符で囲んでください。説明・期待結果・課題はLESSON.md。
ファイル間importも外部素材の読込みもありません。ゲーム画面は標準ASCIIです。

段階:
01_passages.py: 傷と宝。道具なし・左固定・自動次室の練習。
02_equipment.py: route→gear→nextを分離。一枠装備。次室は左固定の練習。
03_branches.py: 左右の分岐と公開された次室・出口。原作Bの通常モデル。
04_preview.py: 候補装備・通過後HPから次室を予測。
05_undo.py: 全状態と入力を保存し、一決定Undo。

操作:
上下: ROUTEで上／下の通路。
左右: GEARで装備を維持／交換。03以降のNEXTで左／右の部屋。
Z: 現在の選択を確定。02のNEXTはZで左へ。
X: 05で一決定Undo。R: 同じBの初期状態。Esc: 終了。
一キーずつ押して離します。同時押しは拒否し、全操作キーの解放を待ちます。
新しく押したRだけは優先します。原作の演出・停止画面は省略しています。

記号:
P=穴、D=暗所、W=深水。R=縄、L=灯、B=長靴、-=装備なし。
Rは全てのP、Lは全てのD、Bは全てのWを防ぎます。
混成通路では対応しない文字の傷が残ります。道具は一枠だけ。
傷は今の装備で先に計算し、通過後に拾った道具を選びます。交換しても回復しません。
宝は致命的な通路でも獲得したまま記録。HP0以下は最終室でも失敗。
三室を体力1以上で通れば成功。宝4・8個は任意の目安です。
原作Bは七部屋の手作り二分木です。無限生成、任意seed対応ではありません。

04/05の予測:
ROUTE中は現在選択中の通路を通った直後のHPと、今の装備を維持する仮定。
GEAR中は通過済みHPと候補装備、NEXT中は通過済みHPと確定装備です。
孫の部屋は、途中の交換が未確定なので障害と宝の公開情報だけを示します。
プレビューとカーソル移動は状態を変更しません。

省略: 原作A/C、日本語字形、表紙、説明停止、通過演出、防御なし比較、通常リプレイ保存、GIF。
原作リプレイのPython3.10+欄は歴史的環境メタデータで、教材の最低要件ではありません。
原作は変更していません。完全一致を主張する範囲は03〜05の原作B通常モデルです。

困ったとき:
No module named pyxel: 起動する.venvのpythonで -m pip install -r requirements.txt。
ファイルがない: ZIPを全展開し、READMEのフォルダへ移動。
キーが反応しない: ウィンドウをクリックし、全操作キーを離してから一つずつ押します。
交換でHPが戻らない: 仕様です。道具はこれから通る通路に使います。
02で右室へ行けない: 左固定の練習です。分岐は03から。
宝8未満で成功した: 正常です。生きて三室を通れば成功。
文字化け: README・LESSON・JSONはUTF-8として開きます。
描画初期化エラー: GUI/OpenGL対応の通常デスクトップで実行してください。
headless成功は全OSのGUIが動く保証ではありません。

標準ライブラリだけの検査:
python -B test_stages.py
任意の原作再照合: 環境変数PYXEL051_ORIGINALを別途用意した原作フォルダへ指定。
未指定ならlive比較の一件だけskipし、同梱fixtureとの比較は必ず行います。
例（macOS/Linux）: PYXEL051_ORIGINAL="/path/to/051_three_rooms" python -B test_stages.py
例（Windows PowerShell）: $env:PYXEL051_ORIGINAL="C:\path\to\051_three_rooms"; python -B test_stages.py
qa/generate_reference.pyは、指定した原作からportable fixtureを再生成する開発用スクリプトです。
検査範囲: 03〜05それぞれ255節点×22入力=5,610遷移、全128終了経路。05は全終了経路の完全Undo。
練習規則・拒否入力・同時押し・保持キー・描画純粋性・期待結果／課題も検査します。
固定hashの検査: python -B qa/verify_freeze.py

実Pyxel自動描画の再確認（Pyxelが必要）:
python -B qa/render_check.py
各段階の初期／途中画像とUTF-8状態JSON、単一ファイルの隔離起動、CLI誤入力を確認します。
自動確認例: python -B 04_preview.py --headless-smoke --demo-checkpoint --screenshot "確認 画像.png"
自動出力オプションには --headless-smoke が必要。通常プレイではオプション不要です。
再検査でQAファイルが更新されれば、納品時の固定hashとは異なる場合があります。

確認済み／未確認の詳しい区別はqa/REVIEW.md。実ブラウザー、Windows/macOS GUI、
OSからの実キー入力、人の遊びやすさ、音声は未確認。音は実装していません。

権利: LICENSEは原作MIT全文をそのまま保持し、各ゲーム.pyにも全文を埋め込みました。
参照されるassets/NOTO-LICENSE.txtも原文のまま。同梱Noto字形データは使用しません。
OFLフォントをMITへ変更したものではありません。PyxelはPyxel側のライセンスに従います。
