後から来る壁：5段階教材

Python 3.11以上 / Pyxel 2.9.9。各.pyは独立し、実行時の外部ファイル不要。
ZIPを全展開し、このREADMEがあるフォルダで端末を開きます。
Windows:
py -3 -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
.venv\Scripts\python 01_walk.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_walk.py
.venv/bin/python 05_undo.py
検査環境はLinux。Windows/macOSの実GUIで動かした主張ではありません。

01_walk.py: 移動と出口。灯りなし、壁化なし。
02_lights.py: 灯りを集めて出口へ。壁化なし。
03_growth.py: 初めて踏んだ床が三手後に壁。Aのみ、行き止まりの終了なし。
04_forecast.py: A/B/C、成長後の行き止まり判定、一手先の予測。
05_undo.py: 全状態を一手戻す。最終通常モデルは原作全3面と照合。
本文・検査済み練習と答え・原作との差分はLESSON.md。

操作:
矢印: 一押し一歩。全操作キーを離してから次を押す。
N: 04/05で次の面へ。位置も履歴も初期化。
Z: 05で一手戻す。成功/失敗からも戻れる。
R: 同じ面を初期化。新しいRは複合入力や解放待ちでも優先。
Esc: 終了。Spaceには操作なし。待機は存在しません。

三手後の壁:
初訪問の手の終わりに残り3。次の受理移動で2、次で1、さらに次で壁。
踏み直しても期限を延ばしません。拒否入力・考える時間・予測表示では育ちません。
育つ手にその床から出られます。S/Eは育ちません。
collisionは通常初期状態から到達できない合成状態用の安全な順序定義です。
STRANDEDは隣接する通れる床がゼロの判定で、解けない状態すべての判定ではありません。

困ったとき:
No module named pyxel: 起動に使う同じpythonでrequirements.txtを導入。
ファイルがない: ZIPの中のまま開かず、全展開してフォルダを確認。
動かない: ウィンドウを選び、全操作キーを離してから一つだけ押す。
GROWN_WALL/FIXED_WALL: 拒否なので手数は進みません。別方向かZ/ Rを試す。
WONにならない: 02以降は全灯りを集めてからEへ。01だけ収集不要。
数字が止まっている: 正常です。現実時間では減らず、受理移動でだけ減ります。
STRANDED: 04はRでやり直し、05はZで一手前へ戻せます。
表示初期化エラー: GUI/OpenGL対応環境が必要。headless成功は全OSのGUI保証ではありません。

検査:
python -B test_stages.py
同梱資料との比較は原作なしでも実行。任意の原作比較はPYXEL027_ORIGINALを指定。
python -B qa/verify_freeze.py
ハッシュは配布ファイル変更の検出用で、署名ではありません。練習で編集したら変更が検出されます。
実Pyxel画像・検査用スクリプト・ログ・原作保持記録はqa/。
qa/author_stages.pyは作者用再生成スクリプトで原作が必要。通常の起動/検査には不要。

原作から省略: 表紙/停止、日本語字形描画、再生記録保存、壁化なし比較。
教材で追加: 一手先予測、段階別の独立ファイル、入力解放ゲート。
MIT原文をLICENSEとLICENSE.txtに保持し、言及されるassets/NOTO-LICENSE.txtも保持。
教材はASCIIと図形のみを描き、外部Noto字形を使用しません。
未確認: ブラウザー、OSキー入力、Windows/macOS GUI、音声、人の学習効果。ゲームは無音。
