011 反射便：学習用5ステップ
Python 3.11以上 / Pyxel 2.9.9（requirements.txtで固定）

最初に
ZIPをすべて展開し、このREADME.txtと01_aim.pyがあるZIPのルートフォルダーで
ターミナルを開きます。各段階は他の段階や原作を読み込まず、単独で動きます。
初回インストール時はネット接続、通常の画面起動にはGUI/OpenGL対応のPCが必要です。
付属の仮想環境はありません。既存のPythonが3.11以上か最初に確認してください。

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

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

前の画面をEscで閉じ、実行コマンドのファイル名だけを順番に変更します。
01_aim.py       照準を確定。まだ動かない
02_velocity.py  速度で動く。まだ壁を通り抜ける
03_sweep.py     最初の接触で止まる。まだ鏡でも止まる
04_reflect.py   1回だけ反射。接触した刻みの余り時間を捨てる簡略版
05_remaining.py 余り時間を使い、原作Bの飛行モデルへ到達

操作
← →: 2度/描画で照準。↑ ↓: 0.25度/描画で微調整。
Space: 照準待ちで1回だけ発射。発射後の角度は固定。
R: 角度-45.00、飛行なし、停止なしへ戻る。Esc: 終了。
05だけP: 停止/再開。RとSpaceを同時に押した場合は初期化だけ行います。

確かめる順番
初期-45.00から上へ微調整しANGLE -50.75に合わせてSpace。
01はLOCKED、02は白い鏡を通過して場外停止、03は上鏡の手前で停止。
04と05は上鏡で一度反射し、塀の向こうの黒い受取口にDELIVERED。
0度の直射は03以降では中央の塀に止められます。
手順と式の数値例はLESSON.md、段階カードのデータはlessons.jsonです。
Pythonのクラスや関数が読める人向け。三角関数・内積・二次方程式を扱います。

テスト（インストール済み環境で）
Windows:
.venv\Scripts\python.exe -B -m unittest -v test_stages.py
macOS / Linux:
.venv/bin/python -B -m unittest -v test_stages.py
通常の配布物だけで実行できる純粋ロジックと入力スタブのテストです。
原作ファイルは同梱しないため、原作比較1件は通常スキップされます。
制作時に実行した原作Bとの比較範囲と結果はqa/QA.txtを参照してください。

12描画だけの実Pyxelヘッドレス起動検査:
Windows:
.venv\Scripts\python.exe -B 05_remaining.py --headless-smoke --screenshot smoke.png
macOS / Linux:
.venv/bin/python -B 05_remaining.py --headless-smoke --screenshot smoke.png
他の4本もファイル名だけ変えて同じオプションを使えます。
--screenshotは--headless-smokeと組み合わせます。PNGは12回描画後に保存されます。
起動検査は入力せず照準待ちを見るだけで、クリアの検証ではありません。

自動モデル到達点の実描画（人の操作ではありません）:
.venv/bin/python -B 05_remaining.py --headless-smoke --demo-checkpoint --screenshot outcome.png
Windowsは先頭を.venv\Scripts\python.exeに置き換えます。
--demo-checkpointは-50.75度の発射とモデル更新を画面起動前に自動実行します。
qa/のPNGは実Pyxelで描いた初期画面と、この自動入力の到達点です。

原作との範囲
原作B「塀の向こう」の始点、受取半径6、壁順序・配置を使います。
05は半径2、速度96px/秒、1/120秒×4、最初の接触、同着時の優先順、反射、
余り時間、0.01px離脱、最大4接触/刻み、2回目で停止、飛行6秒上限を維持。
A/Cの2面、便選択、回収と再発射、Zの前角度、Nの次便、前回軌跡切替、
試射数、日本語字形、原作の記録機能は省略しました。
壁を半径ぶん四角く膨らませるため、角では最大約0.83px早く止まります。
数値安定化と原作から引き継ぐ近似の詳細はLESSON.mdに記載しています。

権利
LICENSEと各段階ファイル冒頭の全文MIT表記を保持してください。
原作Copyright (c) 2026 Pyxel 100 contributors。
教材はASCII表示で、Noto由来字形を含みません。Pyxelは外部依存です。
