034 三手の剣舞 / Python + Pyxel
実装・機能検証済み。人による初見理解・面白さは確認待ち。

起動
Windows: Python 3.10以降を用意しsetup.bat、続いてplay.bat。
macOS/Linux: sh setup.sh、sh play.sh。このフォルダ単体で動きます。
requirements.txtのPyxelと標準ライブラリのみでプレイ可能。無音。
日本語glyph同梱。開発用glyph生成/動画変換のみPillowやffmpegが必要。
Windows実機は未検証。cp932既定模擬、日本語空白パス、任意cwdを検査。

目的と操作
9マスの稽古場。自分HP3、相手HP5。相手を倒し自分が生きていれば勝ち。
左/A 後退、上/Z 斬り、右/D 前進、Space 静止。一手ずつ、時間制限なし。
X 一手undo、R同じ稽古を再開、P停止/説明、1/2/3稽古選択、M表紙、Esc終了。
B 比較窓3手/1手を切り替えて同じ初期状態へ再開。
F12 実画面と操作ログをmediaへ保存。出力フォルダは自動作成。
キーは押下時だけ受付。長押し連打なし。異なる行動キーの同時押しは無効。
開始/再開/移行/停止復帰/undoの後は全操作キーを離すまで持越し入力を遮断。

相手の規則
直前3確定行動だけを覚え、前進・斬り・後退の最多へ対策する。
同数ならもっとも新しい該当手。静止も履歴一枠を使うが最多集計から除く。
空履歴/全部静止は前進対策。今回の未確定入力は絶対に読まない。
前進を読む: 置き斬り。その場に留まり、解決後距離1～2へ1ダメージ。
斬りを読む: 引き突き。一歩引き、解決後距離2だけへ1ダメージ。
後退を読む: 追い足。二歩前進するが攻撃なし。
攻撃を試みた次の一手は息継ぎ。空振りでも息継ぎ。追い足の後には付かない。
MemoryとIntentを画面へそのまま描く。試合を越えた学習・未知の手札はなし。

こちらの剣/同時処理
剣は移動解決後の距離1へ1ダメージ。直前の自分の手が斬りなら2。
空振りでも斬り履歴に入る。三連以上でも2。前の実ヒットの有無ではない。
1 すでに公開した相手Intentを固定。
2 旧位置から移動候補を作る。自分は前後一歩。相手の追い足は人物の旧位置の隣まで、後退は盤端まで切り詰める。
3 移動候補が同セル/交差なら両者の移動を取り消す。退く相手の旧位置へ入るのは合法。
4 最終距離で両者の攻撃を同時適用。両HP0は相打ち、相手だけ0なら勝ち。
5 今回の手を履歴末尾に加え三手へ切る。次の構えを計算して表示。
盤外に出る自分の手だけ不合法で時間不変。相手に詰めて重なる前進は、その場の有効行動で履歴へ残る。盤端にいるだけの罰はない。
予告の点線は相手の移動候補。赤い斜線はその候補位置からの攻撃距離。移動衝突なら両者が停止するため予告位置自体が不成立になることを画面へ明記。

三場面と再現例（F前進/S斬り/B後退/W静止）
A「一回斬って、間を置く」: x3対x6、空履歴。
  最短6手 S F F S S S / 残HP1。
  無傷9手 S B B S S F S F S。静止のみなら安全な循環で、勝利はしない。
  初手Sは空振りを利用して次の読みを変える。待つ別解も削っていない。
B「二回目の剣先」: x4対x5、前進・斬り・斬り。
  初手Fで引き突きの内側へ。無傷9手 F S F S F S F S S。
  最短6手 F F F S S Sは二発受けて短くする。安全交互F/Sも合法に勝てる。
C「端の追い足」: x2対x6、後退・前進・後退。
  最短5手 F F S S S / 残HP1。
  無傷7手 B S S F S F S。一度端へ下がり、空振りで相手の読みを変える。
  後退だけなら端で止まる。追加の端ペナルティはない。
solver_results.jsonは状態hashつき再現ログと6種の単純方策監査。
安全策や単純なBの交互勝利をわざと潰していません。

検査/媒体
python -m unittest test_model test_ui -v
python solver.py
python experiment.py
python tools/test_portability.py
python app.py --headless --demo
python tools/export_video.py
python tools/capture_comparison.py
python tools/validate_artifacts.py （mediaを含む配布で実施）
--baseline は最多集計を直前1手だけにする比較用の反実仮想。
旧版や学習能力の向上と称さず、違いをEXPERIMENT.txtに記録。
純粋モデルはPyxelをimportしない。有限探索は位置/HP/有限履歴/回復/Intentの同値状態を重複訪問しない。手数カウンタはルールに影響しない記録専用で、表示は9999+まで。
NOTE.txt/X_POSTS.txtは未投稿原稿。動画は自動入力の実Pyxel画面で、人の試遊ではありません。
