050 帰り道の燃料 / Python + Pyxel

行けた道を、同じ燃料で帰れるとは限らない。
修理部品を拾い、基地へ一度だけ帰る小さな遠征です。
荷物を増やすと移動燃料も増えるため、補給と拾う順を決めます。

起動
Windows: Python 3を用意しsetup.bat、次にplay.bat。
macOS/Linux: sh setup.sh、sh play.sh。実行時依存はPyxelのみ。
フォルダ単体で起動可能。launch.shは制作者クラウドQA専用。
Python: python app.py。自動収録: python app.py --headless --demo。

操作
表紙でSPACE/Z。1/2/3で状況選択。
矢印で移動/拾う/置く/補給の札を選び、ZまたはSPACEで確定。
X:1操作戻す、R:同状況再開、P:停止/説明、M:表紙、ESC:終了。
停止中はP/R/Mだけ有効。キーを離してから次の操作を受けます。
B:荷重込み消費/距離だけ消費の比較ルールを切替えて初期化。

ルールと表示
道は両方向。移動消費は距離×(1+出発時の総荷重)。荷重上限4。
拾う/置くは燃料0。置いた部品はその地点に残り、拾い直せます。
補給はタンク空きと現地残量の小さい方だけ。余りは現地に残ります。
燃料不足や積載超過は全操作を拒否し、資源を部分消費しません。
出発してHへ帰着した時点で遠征終了。残燃料0でも帰着は成功。
修理価値の目標未満でも「帰還・材料不足」として結果を表示します。
今の荷重の補給なし最短帰路と、選択後の帰路消費を常に表示。
補給込み帰還案は荷を保つ案を先に調べ、なければ品を置く案も検査。
「帰還案あり」は価値目標達成を保証しません。置くと価値が減ります。
補助探索は帰還の可否だけで、まだ地上にある部品の追加回収を勧めません。

3状況
A「同じ一周、違う帰り」12燃料、補給なし。重いbだけ/軽いa,c/全回収。
B「補給の前後」9燃料、Bに3。a,bは補給必須、b,cなら補給なしでも到達。
C「重い主部品は最後に」12燃料、Dに4。主部品bだけで安全帰還も可能。
地図・道の長さ・部品の重さ/価値・補給残量は全て公開。
設計候補からの数値変更なし。全入力列はsolution_logs.json。

検査と収録
python -m unittest discover -p "test*.py" -v
python experiments.py: 明示的に探索/方策/比較結果を書き出します。
通常テストはmediaや実験ログを書き換えません。
media/return_fuel_automatic_silent.mp4: 実Pyxel画面、自動操作、無音。
人の試遊ではありません。QA.txtに検査範囲を分けて記載。
フォント: Noto Sans CJK抽出ビットマップ、SIL OFL同梱。
ソース: LICENSE.txt。音は実装していません。
