逆向き倉庫：学習用5ステップ（021）

必要: Python 3.11以上、Pyxel 2.9.9、GUI/OpenGL対応PC。
初回のPyxel導入にはネット接続が必要です。追加画像、フォント、音声素材は不要です。
ZIPをすべて展開し、このREADME.txt、requirements.txt、5本の0*.pyが直接ある
ZIPルートのフォルダーでターミナルを開いてください。以下はそのフォルダーを基準にします。
先にバージョンを確認し、3.11未満ならPythonを3.11以上にしてから続けます。

Windows（PowerShellまたはコマンドプロンプト）:
py -3 --version
py -3 -B -m venv .venv
.venv\Scripts\python.exe -B -m pip install -r requirements.txt
.venv\Scripts\python.exe -B 01_walk.py

macOS/Linux:
python3 --version
python3 -B -m venv .venv
.venv/bin/python -B -m pip install -r requirements.txt
.venv/bin/python -B 01_walk.py

各段階は単独で実行できます。前の画面をEscで閉じて、順番に進みます。
Windows:
.venv\Scripts\python.exe -B 02_push.py
.venv\Scripts\python.exe -B 03_reverse.py
.venv\Scripts\python.exe -B 04_validate.py
.venv\Scripts\python.exe -B 05_goals_undo.py

macOS/Linux:
.venv/bin/python -B 02_push.py
.venv/bin/python -B 03_reverse.py
.venv/bin/python -B 04_validate.py
.venv/bin/python -B 05_goals_undo.py

操作:
矢印: 1マス歩く。箱のある方向へ歩くと押す（02以降）。
R: 同じ段階を最初へ。Esc: 終了。05のZ: 確定した1手を戻す。
同時に複数の矢印を押すと動きません。長押しは12フレーム後から4フレームごとに反復。
Rの後は操作キーをいったん離します。固定の待ち時間はありません。
画面のMOVESは受理手数、PUSHESは押し数、UNDOは戻せる手数。
赤枠は拒否した候補です。黄枠は番号付き目標、緑枠は正しい番号の到着を表します。

5段階:
01 外壁の中を歩く / 02 1箱を押す / 03 相棒が逆へ動く /
04 全員の行先を検査 / 05 同番号の目標とundo。
説明・実際のコード・確認項目・課題はLESSON.md。
01〜04にはクリア判定がありません。05の最短解は下→右→上→左→上→右です。

原作との違い:
原作Aの外壁と座標を01〜03へ段階的に導入し、04〜05は原作Bを使います。
05の壁・人・2箱・目標・押しの拒否規則・成功停止は原作Bと同じです。
原作は3室。教材では部屋選択、次の室、日本語字形、荷揚げ機の絵、押す前の予告、
説明・一時停止、イベント記録、比較モードを省略しています。ASCII・図形・無音です。
拒否された入力では位置・手数・押し数・履歴が変わりません。箱番号は交換できません。

テスト（Pyxelをimportしない純粋計算とstub UI。人の操作テストではありません）:
Windows:
.venv\Scripts\python.exe -B -m unittest -v test_stages
macOS/Linux:
.venv/bin/python -B -m unittest -v test_stages

実Pyxelの12フレーム補助確認（全プレイやOS実機テストではありません）:
Windows:
.venv\Scripts\python.exe -B 05_goals_undo.py --headless-smoke --screenshot smoke.png
.venv\Scripts\python.exe -B 05_goals_undo.py --headless-smoke --replay RDRULUR --screenshot solved.png
macOS/Linux:
.venv/bin/python -B 05_goals_undo.py --headless-smoke --screenshot smoke.png
.venv/bin/python -B 05_goals_undo.py --headless-smoke --replay RDRULUR --screenshot solved.png

--replayは自動確認用の合成操作です。U=上、R=右、D=下、L=左、X=初期化、05のZ=undo。
ここでのRは右であり、通常操作のリセットキーRとは別です。最大12文字です。
--screenshotと--replayは--headless-smokeと一緒に使います。
qaには各段階の初期/変化後PNG、追加の拒否/undo画面、検証記録を収録します。

コードと図形はMIT。LICENSEと各段階の全文権利表記を保持してください。
qa/canonical_model_fixture.pyは原作のMITコードを用いた読み取り専用の比較用コピーです。
Pyxelは別の外部依存で、そのライセンスが適用されます。
原作の日本語字形を使わないため、この教材にはNoto由来のフォント素材は含みません。
