040 まねっこ決闘
実装・機能検証用。人による面白さの確認は未実施。

目的：有限の札を選び、指定ラウンド以内に相手HPを0にする。
小技で手帖を傾けるか、守りの回数を削るか。大技と気力も残したい。
Windows：Python3.10以上を用意しsetup.bat、以後play.bat。
macOS/Linux：sh setup.sh、sh play.sh。実行時はPyxel＋標準ライブラリだけ。
本フォルダだけで独立実行。app.pyを基準に資産を読むのでcwdに依存しない。
launch.shは開発環境専用。日本語glyphはNoto Sans CJK由来、OFL同梱。

選択画面：左右または1～3で状況を選びSPACE開始。
プレイ：矢印で札を選択、Zで一枚使う。Xでラウンドをundo。
R：同じ状況で再開、P：停止／説明、M：選択へ、成功後N：次の相手。
1～3はプレイ中も状況を初期化して切替。
押しっぱなしは再発動しない。複数行動キーは同時受付しない。
開始・再開・解除・次状況では全操作キーの解放を待つ。
考える時間は無制限。ラウンドは合法な札を使ったときだけ進む。

上／下小技：威力1、気力0。上／下大技：威力3、気力2。
呼吸：気力+2、上限4。満杯で使っても札は消費するので事前警告を表示。
気力不足・使い切った札は拒否し、ラウンドも資源も変えない。
相手は手帖の多い側を守る。同数の優先側は画面に表示。
守りは今回の選択より先に固定。カーソルを変えても守りは変わらない。
守る側を攻撃すると防御札を一枚使い、ダメージ0。
反対側は通るが防御札は減らない。防御札0ならどちらも通る。
攻撃は防がれても、上か下の回数を一回加算。小技も大技も一回。
呼吸は学習にも防御札にも影響しない。記録は累積し、古い手も忘れない。
これは小さな頻度集計で、大規模機械学習や実ユーザーの過去プレイ記憶ではない。
勝ったら残り札を消化する必要なし。失敗ではHP不足分と残した札を表示。

A：上ばかり見ている。二枚で勝てる導入。
B：小技を覚えさせる。上へ学習させ、下大技を残す。
C：気力と守りを使わせる。学習誘導と防御札枯渇の二系統。
比較版：python app.py --fixed。手帖更新だけ止めた比較用の反実仮想。
python -m unittest discover -v：モデル・UI・全到達状態の文字境界。
python experiment.py：有限状態探索、単純策監査、一変更比較。
python tools/test_portability.py：既定cp932、日本語空白パス、別cwdを模擬検査。

media/automatic：実Pyxel自動入力・無音。Bの誘導とCの防御札消費。
media/comparison：Bの手帖固定版を七枚で解く自動入力・無音。
同一五枚の比較はexperiment_results.json。固定版ではまだHP3残る。
media/native：クラウドLinuxでの実入力記録とPNG。
Windows実機、音声出力、人の理解・面白さは未確認。公開投稿していない。

開発用再生成：tools/build_font.pyはPillowとNoto CJKフォント、tools/export_video.pyはPillow・ffmpeg・ffprobeが必要。ゲーム実行には不要。
