071 ねじまき工房
歯車の向きをたどり、木の人形へ四歩を贈る小さな機構パズル。
回っていた部品が、ついに左右の一歩になる手応えを目指しました。

起動
Python 3.10以上とPyxel 2.9.9。実行時依存はPyxel＋標準ライブラリだけです。
Windows: setup.batを一度実行し、play.batを実行。
Linux/macOS: bash setup.sh の後、bash play.sh。
任意の作業フォルダから起動可。日本語グリフは同梱済み。
launch.shは開発用cloud Linux専用。配布先ではplay.sh/play.batを使います。
Windows/macOS実機は未確認。自動の文字コード・パス試験と区別してください。

操作
Space/Z/Enterで表紙から開始。1〜3で状況A/B/C。
編集: Tabで接続→歯数→カム。左右で対象、上下で値候補、Zで確定。
候補だけでは設定や時刻を変更しません。接続欄のZは線を着脱します。
Enterで試運転、Spaceで一刻。Pで連続運転/停止。連続中の編集やundoは拒否。
Hで説明と停止。Hで戻しても連続運転は再開しません。
Xで一決定undo。試運転中は一刻。開始まで戻せば設定を直せます。
4歩達成後はEnterで引渡し、または任意で6歩まで試せます。
Rで同状況再開、Mで表紙、BでAの一変更比較へ切替、SでJSON記録、F12で画像。
Escで終了。キーは一つずつ、離してから押します。同時押しは全不採用。
一試行256のモデル判断、セッション4095の記録で停止。記録上限時は再起動します。

ルール
表示された線だけが歯車をつなぎます。各かみ合いで回転符号が反転。
Dは毎刻一歯。歯数4/8は4/8刻で一周。Lは正、Rは逆向きが正解。
カムは軸の取り付け目盛。動いて0へ来た刻に脚が上がります。開始時0は不発火。
最初は左、以後左右交互。両脚同時、逆向き、短すぎる間隔で試運転が止まります。
A/Cは間隔2刻、Bは3刻。24刻までに4歩が依頼。転落・部品損失はありません。
Dにつながる奇数閉路は全体が停止。切断された軸は回りません。
4歩達成は追加試験の停止後も保持。速さ・最小歩間隔・6歩は別の任意記録。
予告は今の設定を同じモデルで8刻だけ実行。停止条件も反映します。

状況と検算
A: 初期設定で4歩を達成できます。ARを足すと奇数閉路。
B: 初期の右脚は正向き。BRを外しDRを付けると逆向きへ。
   左右8歯、カム7/5なら1/5/9/13刻の四歩。安全策を締切で排除しません。
C: DA/AL/DRで必要な向き。AB/BL/ALを全部残すと奇数閉路。
全候補接続×4/8歯×全カムを列挙。左右4/8の混合は3状況とも4歩解なし。
その案を成功例とは呼びません。4歯の速さ、8歯の間隔、カムの調整に選択があります。
詳細はpolicy_results.json。A原版22/2304、B36/4608、C198/18432設定で基本成功。

一変更比較
BキーはAへ移り、必要間隔だけ2刻/1刻を切替。接続・周期・目標4歩は固定。
両版で同じ8歯カム7/5設定を達成確認。比較版は34/2304設定が成功。
各版の予告・説明は実際の必要間隔から生成。面白さの優劣は未測定です。

ファイルと再現
model.py: 不変State/Level、純粋step相当のtick/act、正規化JSONとSHA-256。
controller.py: 入力、release gate、undo、選択とモデル確定を分離。
app.py: Pyxel実描画。固定3状況、乱数なし。変更履歴をmedia各セッションへ保存。
各セッションに当時のapp/controller/modelと元ログを保持。後の検証で置換しません。
media/automatic_*は自動入力の実描画、native_*はエージェントのLinux実機操作。
テスト: python -m unittest test_model test_ui。生成: python tools/verify_policies.py。
動画: python app.py --demo --headless、その後 python tools/export_video.py。
開発時のみPillow/ffmpegが必要。利用者のゲーム実行には不要です。

評価の範囲
機構と入力の機能検証は、初見の人による面白さ・理解の確認とは別です。
機械の向きが一歩になる気持ちよさを、人がどう感じるかは確認待ち。
現実の機構安全や歯車設計のシミュレータではなく、机のレールで動く玩具です。
音は使用していません。音質の実聴確認はありません。
著作権: ゲームMIT、Noto由来グリフOFL1.1、PyxelMIT。完全なライセンスを同梱。
