016 やわらかいゴール
Python 3.10以上 / Pyxel 2.9.9 / 日本語 / 1人用

球におびえるゴールを、どちらへ逃がそう？
速い直球、上の壁、ゆっくりした下の壁。場所・角度・力を変えて、逃げる枠へ1点入れる小さなシュート遊びです。失敗しても回数・時間の減点はありません。

起動
Windows: このフォルダを展開し、setup.batを初回に実行。その後play.batを実行。
  Pythonをインストールしてpyコマンドを利用可能にしてください。
  BATはASCII、パスは引用符付き。失敗時はウィンドウを閉じず停止します。
macOS/Linux: bash setup.sh、続いてbash play.sh。
  必要な実行時パッケージはPyxelだけです。
開発用: bash launch.sh（単独環境があれば優先。制作環境では共有Pythonへフォールバック）。
保存先やフォントはapp.pyの場所から決定するため、別の作業ディレクトリから起動できます。
Windows実機での起動・音の実聴は未確認です。Linuxのcp932既定読み込み模擬テストは実施済み。

操作
タイトル: 左右で相手選択、SPACEで開始。
場所選択: 左右で上・中・下の蹴る場所を選び、SPACEで決定。
照準: 左右で毎秒60度、上下で毎秒12度の微調整。角度は右向き0、下が正、範囲±75度。
SPACEを押すと力20、0.7秒保持で100。上限は保持され、勝手に発射しません。
SPACEを離すと発射。短く押して離すだけなら最弱の球です。
選択を決めたSPACEは一度離すまで溜めには使われません。
飛行中の追加操作は不要です。
失敗後: SPACEで同じ場所・角度へ戻る。Zで蹴る場所を選び直す。
P: 一時停止/再開。物理・AI時計・履歴は停止。溜めは解除されます。
R: 同じ相手を初期状態から。N: 成功後に次の相手。ESC: 終了。
F12: media/manual_runtime.pngへ実行画面を保存。

見た目とルール
白い上下の壁は跳ね返る。茶色い衝立は球を止める。左右の外壁・枠の支柱も球を止める。
黄色の点線x=88を球が越えたら、ゴールは0.15秒前の球の高さを見ます。
黄色い輪が「実際に見ている古い球」。輪と枠の細い点線は視線です。
見ている球が枠より上なら下へ、下なら上へ逃げます。同じ高さ±2pxなら前の向きを保ちます。
最初の逃げ向きは矢印と文章で表示。未来の反射地点や入力は読んでいません。
球が反応帯を出た場合、最後の向きを0.25秒維持してから減速します。
レールの端では止まります。追い詰めて入れるのも正しい成功です。
球全体が右の開口を通過すれば1点。動く支柱へ接した球は得点しません。
細い青線は球の軌跡。右の点列は枠の移動履歴。失敗時は最後の枠位置と原因が残ります。
1球は最大6秒で回収。待って考える時間に制限はありません。

3つの状況（答えの例は下へ）
A まだ逃げ足は遅い: 遅い枠に、素直な速球を試す。
B 中央の衝立: 同じ直球が衝立へ。蹴る場所と使う壁を変える。
C 待ってから戻る: 速球の別ルートか、下からゆっくり壁返しか。
通常目標は各面1点。続けて狙った経路を再現する遊びは任意です。連続得点を強制する採点はありません。

確認済みの入力例（自動操作。人の攻略評価ではありません）
A: 中央、0度、力100。
B: 下、-38度、力約61.9（SPACE押下後11描画フレーム保持）。
C: 下、+28度、力20。あるいは上、+32度、力100。
replays/の4本は各30Hz入力と最終状態hashを保存。test_model.pyで再実行します。
Cの下+28度では、最大の力は失敗します。弱い球が到着するまで枠が上へ逃げる時間を作れます。

制作・学習用
model.py: Pyxel非依存。frame(Game, Input)が30Hz入力、physics()が固定1/120秒更新。
app.py: 日本語描画と入力採取。1描画の押下を1回だけモデルへ渡します。
位置選択・照準・飛行・失敗・成功を分け、状態をまたぐ保持入力を遮断。
速度更新→位置掃引→最初の接触→終端。衝立の丸角は円掃引、動く支柱は相対座標で円/矩形掃引。
上下の壁で速度を反射し0.01px離す。1刻み最大4接触。反射で速さは変えません。
球半径3、球速50〜120px/s、開口半幅12。レールy=28〜100。
ゴール加速度90px/s²、最大速A=8、B/C=22px/s。初期A=64下、B=44上、C=88上。
これは小さなゲーム用の反応模型です。球の空気抵抗、現実のサッカーや動物の知覚の再現ではありません。

検証
python -m unittest -v test_model test_ui
python experiment.py （角度0.5度×3場所×9出力×3状況、22,761球）
python tools/test_portability.py
python app.py --headless --demo （Pyxel実描画、自動操作。手動試遊ではありません）
--baseline はB比較に使う静止ゴール。唯一の変更はゴール移動の有無。
詳細はQA.txt、EXPERIMENT.txt、experiment_results.json。
PNGは実際のPyxel描画。MP4は自動操作・無音、各元フレームを1回ずつ30Hzで格納。
フォントの再生成・動画の変換・成功域図には制作時だけPillow/ffmpegを使います。遊ぶには不要です。

権利
ゲームのコード・オリジナル図形はMIT。日本語ビットマップ字形はNoto Sans CJK由来、SIL OFL。
LICENSE.txtおよびassets/NOTO-LICENSE.txtを同梱。ネット接続や外部フォントの実行時読込はありません。
人の試遊による「面白さ」は、この作品ではまだ未確認です。
