001 潮待ちポスト / Pyxel 100 試作改訂

A（手紙）と B（重い小包）を届け、出発地点の灯台へ帰る経路パズル。
出発前に C（手紙）も追加できます。基本便と追加便は別のルート課題です。
B を運んでいる間は黄色い細橋を渡れません。届けると通れます。
青い横線の橋と橙の点の橋は、島の上で SPACE を押すと切り替わります。
切替は1手。移動も1手。通れない入力にはペナルティがありません。
時間制限・手数上限・ゲームオーバーはありません。何度でも Z で戻れます。
3つの手作り地図。速く入力するより、届ける順番と帰り道を考えます。
最短手数は初めてクリアした結果画面でのみ表示します。
自己ベストは実行中のみ保存し、終了すると消えます。

起動
Python 3.11以上推奨。Linux / macOS: sh setup.sh → sh play.sh
Windows: setup_windows.bat → play_windows.bat
直接実行: python -m pip install -r requirements.txt → python app.py
依存は Pyxel 2.9.9。初回インストールにネット接続が必要。
検証は Linux / Python 3.12。Windows・macOS実機起動は未検証。
アカウントも個人情報も不要。通常プレイではファイルを書き込みません。

操作
選択画面: 上下 / W S で地図、左右 / A D で基本便・追加便を選択。
ENTER / SPACE で出発。
プレイ: 矢印 / WASD で1歩。長押し連続移動はありません。
SPACE: 島の上で潮を切替。Z / BACKSPACE: 1手戻す。
R: 同じ依頼で再出発。TAB: 地図・依頼の選択へ。
M: 消音切替。ESC: 終了。
成功後も Z で戻れます。ENTER で選択画面へ。

技術と検証
model.py は描画に依存しない不変状態・遷移・幅優先探索。
app.py は入力・描画・履歴・日本語字形描画・合成効果音。
python -m unittest -v: 22件（純粋ルール16件＋入力スタブの制御6件）。
python model.py: 6契約の最短解を表示（ネタバレ）。
review/experiment.py: 改訂前後の経路実験を再現。
review/ITERATION_AND_QA.txt: 実操作と設計実験を分けた記録。
最終版のESC終了は独立QAが新規起動したネイティブGUIで確認済み。

音について
合成効果音を実装。ただしクラウド音声デバイス初期化に失敗したため、
実際の聞こえ方は未確認です。配布動画・GIFは無音です。

映像
sh capture.sh: 実際の Pyxel 描画で自動入力を再生し PNG / GIF / ログを生成。
python app.py --demo --headless も可能。映像内に「自動プレイ」と表示。
自動入力は通常プレイと同じ状態遷移を通ります。人間の試遊映像ではありません。

権利
ゲームコードと手描きコード図形: LICENSE（MIT）。
日本語字形: Noto Sans CJK JP の必要字形を12pxに変換。SIL OFL 1.1。
assets/NOTO-LICENSE.txt を同梱。フォントをゲームのMITとは混同しないでください。
tools/build_font.py は再生成用（Pillowと元のNoto CJK TTCが別途必要）。
Pyxel公式: https://github.com/kitao/pyxel
Noto CJK: https://github.com/notofonts/noto-cjk

面白さは未検証
自動可解性と開発中の実操作は確認していますが、初見の人の試遊は未実施。
完成度の機械テスト合格を、面白いという判定にはしていません。
