073 橋を渡る楽団

板を組み替え、自分の橋を三人が渡り切る小さな建築の玩具です。
同じ足拍子で揺れが育つ場所を見つけ、筋交いと軽い板を組み合わせます。
基本目標は32刻以内に全員が右岸へ。軽さ・板の並びは任意です。

起動
Windows: Python 3を入れ、setup.batを一度実行。その後play.bat。
macOS/Linux: Python 3でsetup.sh、続いてplay.sh。実行環境はPyxel＋標準ライブラリ。
開発検証環境はLinux、Python 3.12、Pyxel 2.9.9。Windows/macOS実機は未確認。
UTF-8、空白と日本語を含む配置、別の作業ディレクトリを機械検査します。

操作
SPACEで表紙から開始。左右で桁、上下で板候補、Zで交換。
Enterで試運転、Spaceで一刻、Pで連続運転／停止。
Xは編集一手または試運転一刻を戻します。開始を戻すと編集できます。
Rは同じ状況の初期配置へ。1/2/3は状況。Hは説明、Mは表紙。
Bは比較版切替。Sは再現記録、F12は画像。Escは終了。
一度押した操作キーは全部離すまで再発火しません。同時操作は不採用。
説明・結果中も離したことを追跡します。読む間の時刻は停止します。

ルール
普通板=自重2/耐力11、軽い板=1/9、筋交い板=3/16。
支間1の端は耐力+4。橋全体の自重上限はA/B=6、C=8。
奏者の重さ2、足の衝撃4。入場と歩行間隔は公開された表どおり。
毎刻、各桁の整数ベクトル(x,y)を(y,-x)へ回転。4の倍数刻は各成分を0へ1近づけ、その後足の衝撃をxへ加算。
負荷=板自重＋立つ人数×2＋max(|x|,|y|)。耐力ちょうどは成立。
超過した桁は全て表示して停止。全員の右岸到着より先に負荷を検査。
自重超過は出発を拒否します。試運転しないまま成功とは表示しません。
次の1刻の負荷予告は現在の板を同じモデルで進めたもの。候補欄は交換後の自重と耐力です。
現実の橋の設計・構造安全・振動方程式を保証する教材ではありません。

状況と確認済みの入り口
A: 普通/筋交い/軽い、または軽い/筋交い/普通が重量6で21刻に完走。
軽い/筋交い/軽いは重量5で完走します。好みの端の見た目を残しても成功です。
B: ばらけた3刻拍子。全普通も全軽いも16刻に完走。安全な方法を隠し減点しません。
C: 軽い/筋交い/筋交い/軽いが重量8で25刻に完走。
全135配置を検査し、元の設計候補値を変更する必要はありませんでした。

比較
Bキーの「静かな足」は足の衝撃だけ4→0。人の重さ、板、入場表、上限、目標は同一。
揺れの内訳・予告・説明も現在版を参照します。A/B/Cすべてで共通完走配置を保存。
比較版の方が容易であることは、人の面白さの証明ではありません。

記録と検査
model.pyは純粋な有限整数モデル、controller.pyは入力、app.pyは描画と実行記録。
各記録に版、状況、意味入力、論理時刻、正規化JSON SHA-256と終了状態を保存。
python -m unittest -v test_model test_ui でテスト。experiments.pyは有限列挙資料を生成する開発専用コマンド。
通常プレイ記録はmedia/native_*、自動操作実映像はmedia/automatic_*。それぞれ当時のソースを保存。
テストは撮影記録を書き換えません。修正後の再検証は別資料にします。
動画は実際のPyxel自動操作・無音。人の試遊、Windows操作、音の実聴の証拠ではありません。

権利
ソースはLICENSE.txt。日本語ビットマップ文字はNoto Sans CJK由来でSIL OFL、全文はassets/NOTO-LICENSE.txt。
Pyxelのライセンス全文はassets/PYXEL-LICENSE.txt。外部画像や音楽素材は使用していません。
