012 ゴムひもの山歩き
Python + Pyxel 2.9.9 / 3つの手作りルート

張ったひもの力で登り、飛びたい向きへ解放する、小さな山歩き。
強く張れば届きやすくなる一方、勢いを付け過ぎると棚を越える。
旗の岩棚に乗り、ひもを離して0.25秒止まると到着です。
時間制限なし。足場で待っても罰はありません。

起動
Windows: Python 3をインストール後、setup.bat を実行。以後 play.bat。
macOS/Linux: sh setup.sh、その後 sh play.sh。
ターミナル: python -m pip install -r requirements.txt → python app.py
フォルダだけで動きます。親プロジェクトやネット上の素材への依存はありません。
初回のPyxelインストールにはネット接続が必要です。
launch.shは制作環境用。配布先ではplay.sh / play.batを使ってください。

操作
タイトルの左右: ルート選択。SPACE: 開始。開始押下ではひもは接続しません。
左右: 地上では歩く。空中では少しだけ進路調整。
SPACE: 枠で選んだ杭へ接続／接続中は切離し。押し直すたびに1回。
上: ひもを短く巻き取る。下: 長くする。接続中のみ。
A / D: 杭の選択。届く杭は明るい枠、届かない杭は斜線つき枠。
Z: 最後に安定して休んだ棚へ戻る。ひもが岩にかかった時も使用。
P: 一時停止／再開。再開と同時に押したSPACEでは接続を変更しません。
R: 現在のルートを最初から。停止中でも使用できます。
N: 到着後、次のルート。H: ルート選択へ。ESC: Pyxel既定の終了。
F12: 制作用スクリーンショットをmedia/manual_runtime.pngへ保存。

道の読み方
1「低い向こう岸」: 広い受け皿。長さを変えず、右へ振って離せます。
2「短い棚、先の岩」: 右の×模様の岩は危険。着地までの行き過ぎに注意。
  横へ急がず上キーで少し巻き取る方法も、固定長で解放時機を待つ方法も通ります。
3「高い棚と回り道」: 上で巻き取って中棚へ。離して止まり、次の杭をDで選びます。
  中棚が足場チェックポイントになります。単発の長跳び課題は採用していません。
  中棚から復帰した時は長さ38です。上と右を使って登り直す方法も通ります。
落ちた時や危険な岩へ当たった時は、最後の安定した棚へ戻ります。
杭へ触れただけではチェックポイントになりません。長さは復帰時に38へ戻ります。
ひもが岩に触れたら位置を止め、Zで戻れます。巻付き計算はありません。
長く張り過ぎた時は文字で0.3秒警告した後、ひもが外れます。

技術と検証
model.py: 描画非依存、固定1/120秒の純粋step。1描画30Hzにつき4回。
app.py: 日本語UI。実ゲーム画面384×360、主な世界座標は192px幅。
routes.json: 実装済み3ルートの明示データ。load_routesで再読込を検証。
successful_replays.json: 各ルートの実成功入力、毎フレーム座標、終端hash。
experiment.py / experiment_results.json: 成功帯走査、一変更比較、方策監査。
test_model.py / test_ui.py: python -m unittest -v test_model test_ui
再生成: python experiment.py → python -m unittest -v test_model test_ui
portability_results.txt: cp932既定を模擬し、日本語・空白を含むパスと別cwdから検査。
Windows起動スクリプトはASCIIのみ、パスを引用し、失敗時は表示を止めます。
実Windows/macOSのGUI検証は未実施。Linux GUIの実施内容はMANUAL_QA.txt。

近似の範囲
ばねは引くだけ。張力max(0,14*(距離−自然長)+3*外向き速度)、上限240px/s²。
重力100px/s²、速度上限100px/s、地上36px/s、空中の左右加速度24px/s²。
自然長14〜42px、巻取/伸長12px/s。巻取り器は外部から仕事をします。
切離し時に追加のジャンプ力を足しません。実際に得た速度で飛びます。
岩は半径4pxぶん膨らませた矩形へ線分掃引。角は丸い円の厳密接触ではなく保守的近似。
衝突後0.01px外へ離し、1刻み最大4接触。支持面から離れる時は接地を解きます。
実物のゴムや登山の安全を再現する模型ではありません。

映像・文章
media/rope_hike_automatic_silent.mp4: 実際のPyxel描画、自動入力、無音。
media/runtime_*.png: 同じ自動実行の実画面。
media/experiment_before.png / experiment_after.png: 同じB入力で長さ調整だけ変更。
NOTE.txt: 日本語の制作ノート下書き。X_POSTS.txt: 140字以内の3案。
外部投稿はしていません。人の楽しさの評価・実際の音の検証は未実施です。

権利
コード・図形ピクセル絵: 本作品のオリジナル、MIT。
日本語ビットマップ字形: Noto Sans CJK由来、SIL OFL。assets/NOTO-LICENSE.txt。
実行にPillowや元フォントは不要。tools/build_font.pyによる字形再生成だけPillowとNotoが必要です。
