019 くるり荷車 / Python + Pyxel 2.9.9

積み方が曲がりぐせになる、小さな配達運転ゲーム。
３つの箱を英字と同じ区画へ。まとめて積むか、軽くして往復するか。
時間制限、荷崩れ、転倒、失う箱、速さによるメダルはありません。

起動
Windows: setup.bat を一度実行し、次から play.bat。Python 3.10以上を使用。
macOS/Linux: bash setup.sh、次に bash play.sh。
必要なのはPythonとPyxelだけです。Pillow/ffmpegは制作・映像再生成用のみ。
フォルダを日本語名・空白入りへ移してもよく、読み込みはUTF-8指定です。
Windows BATはASCII、引用符付きパス、失敗時pause。Windows実機起動は未検証。
launch.shは制作環境専用で、配布先ではplay.bat/play.shを使用してください。

操作
題名：左右で３道路を選択、SPACEで開始。
走行：上＝前進加速、下＝後退加速、左右＝舵、SPACE＝ブレーキ。
配達：印の丸い区画に速度5以下で入り、SPACEを新しく押す。
速いままSPACEを押し続けた場合は、減速後いったん離して押し直してください。
Z：区画内でほぼ停止して積替。上下で箱、左右で左/中央/右/区画へ置くを選び、
SPACEで移動。置き場所に別の箱がある場合は交換します。Zで走行へ戻ります。
区画に置いた箱はそこへ戻れば積めます。配達済の箱は移せません。
U：直前の区画出発時へ戻す練習。出発時までの配達と荷物の置き場所を復元。
P：停止/再開。R：今の道路を最初から。Q：題名。成功後N：次の道路。
ESC：終了。F12：media/manual_runtime.pngに実画面を保存。
状態を切り替えた後は操作キーをいったん全部離してください。押しっぱなしが
開始・積替・再開後の別操作へ漏れないよう、離すまで受け付けません。

３つの道路
1 まっすぐな市場：３箱、２つの配送区画。最初は左右の質量が釣り合う。
2 左、そして右：最初の家で重いAを下ろすと、偏りの向きが変わる。
  倉庫で重いAを中央へ置く安全策も正当。途中の区画で積替もできる。
3 路地と広い外周：幅24の短い路地と幅36の外周。中央に重いCを載せて
  まとめて通る、１箱ずつ中央へ載せて往復する、後退で外周へ回る解を保存。
  広い外周へは倉庫の広場で後退して向きを変えられる。
草案の道路骨格から、Bの角を半径26、Cの角を半径24へ具体化しました。
C路地幅は22案から24へ変更。半径7の車体で実入力解を確かめています。
道端の明るい線が壁。丸い区画の線や道路中央の短線は壁ではありません。

学べること
model.pyはPyxelをimportしない操舵・積荷・配達・掃引衝突モデルです。
game.pyは停止、積替、練習、再開などの入力状態機械。
app.pyは日本語表示とPyxel描画。plans.pyは自動検査専用の離散キー運転です。
操舵はω=(v/24)*(1.3s+0.7b)、b=左右荷重差/M、M=2+積荷質量。
前進上限40、後退上限16。加速70/M、制動100/M。
8px/sの抵抗はニュートラル時だけ適用。制動と加速の同時押しは制動優先。
30Hz入力/描画、物理1/120秒×4。角度→位置→円の連続壁掃引→停止。
旋回半径は24/|1.3s+0.7b|で速さに依存しません。
低速にすると判断に使える時間が増えます。停止中は自転しません。
これは意図を読みやすくするゲーム近似で、実際の荷車の普遍的な物理法則ではありません。
壁へ当たると停止。箱は消えず、後退できます。壁を滑る補助はありません。
同じ接触へ押し続けた分を毎フレーム衝突回数として加算しません。
出発回数は、停車区画から実際に11px以上離れたときだけ増えます。

検証・映像
python -m unittest test_model test_ui -v
python plans.py / python verify_routes.py / python experiment.py
python tools/test_portability.py
python app.py --headless --demo / python tools/encode_video.py
7本の成功入力をsolution_replays.json、円の道路余白をroute_validation.jsonに保存。
media/cart_automatic_silent.mp4は実際のPyxel描画・自動入力・無音です。
元GIFの全フレームを１回ずつ30fpsへ配置。検査はmedia/media_validation.json。
技術・設計上の確認と、人が面白いと感じるかは分けています。詳細はQA.txt。

権利
コード/オリジナル絵はMIT。日本語ビットマップ字形はNoto由来、SIL OFL。
LICENSE.txt、assets/NOTO-LICENSE.txtを参照。
