009 ふたりで一つの傘：学習用5ステップ
必要：Python 3.11以上、Pyxel 2.9.9（requirements.txtで固定）。
通常操作はGUI対応PCが必要です。初回pipインストールはネット接続を使います。
ZIPを全展開し、このREADME・requirements.txt・5本の.pyがあるフォルダーでターミナルを開いてください。
以下はすべてそのフォルダーからのコマンドです。Escで1本を閉じてから次へ進みます。

Windows：
py -3 --version
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe -B 01_pair.py
.venv\Scripts\python.exe -B 02_coverage.py
.venv\Scripts\python.exe -B 03_target.py
.venv\Scripts\python.exe -B 04_hazards.py
.venv\Scripts\python.exe -B 05_home.py

macOS/Linux：
python3 --version
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -B 01_pair.py
.venv/bin/python -B 02_coverage.py
.venv/bin/python -B 03_target.py
.venv/bin/python -B 04_hazards.py
.venv/bin/python -B 05_home.py

--versionの表示が3.11以上であることを確認します。原作個別READMEの3.10表記ではなく、この教材は3.11以上です。
各.pyは単独の完成プログラム。前段階や原作のimport、画像・字形ファイルは不要です。
1本を別フォルダーへコピーしても、そのPythonにPyxelがあれば動きます。MIT表記は残してください。
読む順：LESSON.md → 対応.py → diffsの隣接差分 → test_stages.py。

操作と見方：
左右を保持：ふたりの中心移動。上を保持：寄る。下を保持：離す。
03以降のSpace：中央→左→右→中央という傘の寄せ先を、1押しごとに選択。保持中の自動連打なし。
P：一時停止/再開。R：初期状態へ戻す。Esc：終了。
左右同時・上下同時は各軸で打ち消し。左右と上下は同時に使えます。
Rを押したフレームはリセットだけ。矢印を保持していれば次フレームから動きます。
緑枠＝傘、黄色と桃色＝ふたり、橙の横線＝足元、白い縦目盛＝中心。
BODY IN/OUTは傘の内外で、乾いた場所でもOUTになります。OUTだけで濡れた意味にはなりません。
青い横波＝水たまり、短い縦線＝雨、両側の手すり＝狭い橋。
NOW＝今の帯、NEXT＝次の帯。画面では次の地面の形のスクロール予告を省略しています。
STATE BLOCKEDでは前の乾いた道に止まり、進行も濡れも止まります。左右や間隔を直すと再開します。
WET 100で止まったらSpaceで続行、Rで最初から。濡れてもWELCOME HOMEに着けば終了です。
風・ランダム生成・音声はありません。原作も無音です。

05の練習目安（厳密な人の入力時間を要求する手順ではありません）：
PREPARE：間隔38へ広げ、Spaceで左へ。左の橋はこの形を維持。
RETURN：間隔20へ寄り、傘を中央へ戻す（左→右→中央なのでSpaceを離しながら2回）。
FULL RAIN：中央の傘と近い間隔を維持。
SPREAD：間隔38へ広げ、右へ寄せる（中央→左→右なのでSpaceを離しながら2回）。
右の橋を渡ったら帰宅。Pで止めて数字とNEXTを確認できます。
無入力でも23秒で家へ着きます。水たまり2帯で両方40濡れ、乾いた帯は5/7です。
雨に濡れず帰ることは任意の上達目標で、隠れた合格点ではありません。

原作との違い：
01〜03は無期限の乾いた練習。04は準備→左雨の橋→帰り道の10秒コース。
05は原作Cの7帯23秒。通常進行の数値・判定・入口停止は原作に合わせています。
A/B道選択、反転、baseline、T区間練習、進入配置記録、選択画面、N/Q/F12、GIF作成、日本語字形は省略。
原作全体の再現やブラウザ版の完成を主張する教材ではありません。詳細はlesson_meta.json。

テスト（標準ライブラリのみ。Pyxelウィンドウも原作も不要）：
Windows: .venv\Scripts\python.exe -B -m unittest -v test_stages.py
macOS/Linux: .venv/bin/python -B -m unittest -v test_stages.py
qa/canonical_reference.jsonの原作由来フレームhashで05を検査します。
原作ファイルを別に持つ人だけ、ORIGINAL_009_DIRをその009フォルダーに指定すると直接比較も実行します。
未指定なら任意の外部原作比較1件だけSKIPになります。付属fixture比較は常に実行します。

描画検証（実Pyxel、合成入力）：
Windows: .venv\Scripts\python.exe -B 05_home.py --headless-smoke --screenshot initial.png
macOS/Linux: .venv/bin/python -B 05_home.py --headless-smoke --screenshot initial.png
smokeは初期状態を12フレーム描き、ゲームモデルを進めません。
以下の先頭はWindowsなら.venv\Scripts\python.exeへ置き換えます。
.venv/bin/python -B 03_target.py --headless-replay qa/03_smoothing_inputs.json --screenshot smoothing.png --report smoothing.json
.venv/bin/python -B 04_hazards.py --headless-replay qa/04_blocked_inputs.json --screenshot blocked.png --report blocked.json
.venv/bin/python -B 05_home.py --headless-replay qa/05_home_inputs.json --screenshot home.png --report home.json
JSONの1要素が1フレーム。heldは保持キー、pressedは押し始めキーです。fixtureはqaに同梱。
PNGは実際のエンジン描画で、合成入力を再生したものです。人の操作やOSキーボード試験ではありません。
実施範囲と証拠はQA.txt、qa/を参照。実ブラウザ、Windows/macOSのGUI、音声は未検証です。

困ったとき：
ModuleNotFoundError: No module named 'pyxel'
→ 上記の.venvのPythonで -m pip install -r requirements.txt を実行し、同じPythonで起動します。
can't open file / No such file or directory
→ ZIP内で直接起動せず全展開し、このREADMEのあるフォルダーに移動します。
'py' is not recognized / command not found: python3
→ Python 3.11以上を公式配布から用意し、新しいターミナルで --version を確認します。
No available video device / Failed to initialize SDL / ウィンドウが出ない
→ 通常起動にはGUIが必要です。GUIのあるPCで起動するか、モデルテストだけ実行します。
Linuxで No module named venv / ensurepip is not available
→ 使用ディストリビューションのPython venvパッケージを用意してから .venv を作り直します。
日本語が出ない
→ 教材のゲーム画面は意図的にASCIIです。日本語の説明はこのREADMEとLESSON.mdにあります。
画面が止まる
→ PAUSEDならP、BLOCKEDなら身体を橋へ戻し、WETならSpace、WELCOME HOMEならRです。
テストの原作比較がSKIP
→ 外部原作がない通常配布では想定どおり。ほかのテストの失敗と区別してください。

ライセンス：原作のMIT全文と権利表記をLICENSEと各.pyに保持しています。
LICENSE末尾のNoto案内は原文のままですが、この教材はNoto字形を同梱・使用しません。
実行時依存はPyxelのみ。フォント再生成や画像編集用ライブラリは不要です。
