057 紙片のラリー
近道を折って作ったら、ブレーキを踏む場所も変わった。

起動
Python 3.10以上を用意。Windowsは setup.bat → play.bat。
macOS/Linuxは bash setup.sh → bash play.sh。
実行依存は Pyxel 2.9.9 と Python標準ライブラリのみ。
日本語字形は同梱。OSへのフォント導入は不要です。
クラウドLinuxで実機能検査済み。Windows/macOS実機は未検査。
launch.sh は制作クラウド用。配布先では play.bat/play.sh を使います。

目的と操作
紙の周回路を1周すれば成功。命や時間制限はなく、ゆっくりでも完走。
準備: 左右で折線、Spaceで開く/折る。1周につき折れるのは1か所。
Enter/Zで出走。1/2/3で有限のA/B/Cを選択します。
走行: 左右で操舵、上で加速、下で減速。両方向同時押しは相殺。
Pは停止と説明。停止中はタイムも動きません。
Rは同じseed/同じ折り方で即再走。
Xは「走行を終えて準備に戻る」確認。走行のundoはありません。
確認中はEnter/Zで戻る、Xで取り消す。Sで入力をrecordsへ保存できます。
種を変更したい場合も、Xの確認中にSで現在の試走を先に保存できます。
全操作は状態移行の後、一度キーを離してから受け付けます。
ゴーストは同じ確定コースhashの、この起動中の前回ベストだけ。
別の折り方は準備画面の数値を比較し、違う道の車を重ねません。
ESC終了。F12は機能検査用PNG/イベント保存です。

読む材料
次の区間の曲率・幅・長さを常に表示。急カーブは >> / <<。
紙図は共通の入口/出口を結ぶ接続図です。図の線の長さを測る競技ではなく、
正確な距離は各モジュール下の数値と合計に表示します。
コースは単なる距離倍率ではなく、曲率/幅/長さの区間列を交換します。
車が路肩を越えると道路内へ戻して速度1。接触数とタイムは別の成績です。

確定ルール paper-rally-r1
描画30fps、モデルは3描画frameに1回の10Hz固定論理tick。
qは道路中心から1/16px単位。操舵±16→加減速カウンタ更新→進行の順。
上を4tickで速度+1、下を2tickで-1、速度0～4。
更新後の速度vがそのtickの確定進行距離。1距離ごとに曲率c×vをqへ加える。
区間境界を跨ぐと新しい曲率/幅を使うため、総距離に旧曲率を掛けません。
路肩判定は車体半幅2pxを引いた(w-2)×16。接触は1tick最大1回。
接触したtickも確定した距離は進み、tick終了時に速度1。0速の横移動も判定。
無入力なら速度維持。停止中の物理キー解放情報は更新し、モデルは更新しません。

検証済みbank
A-01-g1 広い迂回: 開く400、A折り290。
B-01-g1 出口で速度を戻す: 開く380、A折り310。
C-01-g1 どちらを折る: 開く430、A折り370、B折り380。
任意整数seedや無限生成には対応しません。
CのB折りは候補から(35,+2,12),(35,-2,12),(40,0,12)へ調整しました。
候補のままではBがAより短く広く、選択理由を消していたためです。
現行はAの方が短いが、広いBで高速を保つ別案が成立します。

記録と検査
model.pyは純粋な状態/step。描画・停止はモデル乱数や進行を消費しません。
recordsのJSONは確定bank/区間列、rule/generator/environment版、正規化UTF-8
JSONのSHA-256、各意味入力と論理tick、途中/終了状態hashを保存します。
python model.py records/<記録名>.json で別プロセス再生/完全一致検査。
違う版・盤面・入力tickは理由つきで拒否します。
python -m unittest -v test_model test_ui
python experiments.py test_output で有限の方策比較を再計算できます。
テストはmediaへ書かず、元の媒体/GUIログのhashを変更しないことを検査します。

比較と映像
Aを折った準備画面でBキー: 折道の半幅だけ8→14へ変更。
長さ/曲率/開始条件は同一。両版で完走。過去の旧版という意味ではありません。
media/paper_rally_automatic_silent.mp4 は実Pyxel描画・自動入力・無音。
749元frameを各1回ずつ30fpsに配置した24.966667秒。人の試遊映像ではありません。
元GIF、PNG、source_snapshot、native記録を区別して保管しています。
pre_finish_labelは結果ラベル修正前の原証拠。現在版と混同しません。

授業の見どころ
固定時間刻み、境界を分割した整数物理、同一コースだけのゴースト、
コースhash、固定bank、意味入力の再生、操作の解放ラッチ。
「どこでブレーキを変えた？」「違う折線か、同じ道の再挑戦か？」を聞きます。
実装・機能検証済み。面白さ/初見理解は人による確認待ちです。

ライセンス
自作ソース/図形: LICENSE.txt (MIT)。字形: assets/NOTO-LICENSE.txt (OFL 1.1)。
Pyxelのライセンス全文: assets/PYXEL-LICENSE.txt。外部曲/画像なし。音は設計上なし。
