058 交換する魔法
撃った魔法は、次に相手の手札になる。

起動
Python 3.10以上。Windows: setup.bat → play.bat。
macOS/Linux: bash setup.sh → bash play.sh。
実行依存はPyxel 2.9.9とPython標準ライブラリのみ。日本語字形は同梱済み。
制作用launch.shはクラウドLinux専用。配布環境はplay.bat/play.shを使います。
Windows/macOS実機は未検査です。

目的
相手のHPを0にすれば成功。自分のHP0で敗北。12往復で双方生存は決着なし。
決着なしも記録され、Xで戻せます。防御や回復0へ隠し罰はありません。
4枚には固有IDがあり、複製・消滅しません。常に全ての手札を公開します。

操作
Z/Space/Enterで説明から開始。左右で自分のカードを選び、Z/Spaceで確定。
予告: 自分の効果→移譲後に敵が選ぶカード→往復後の両HP/両手札。
Xは敵の反応を含む1ラウンド全体を戻します。結果画面・演出中も使えます。
Rは同じseed/同じ比較規則で再開。Pは停止/説明。1/2/3で配分選択。
Sで現在の意味入力記録をrecordsへ保存。別の配分へ移る前に保存できます。
BはAでだけ「使用後に相手へ/自分へ」を切り替え、同じ初期条件へ戻します。
ESC終了。F12は機能確認用PNG/イベント記録保存。
開始、停止復帰、再開、undo、演出終了時はキーを一度離してから操作します。

四枚
0 火球: 相手に3傷。
1 火花: 相手に1傷。
2 防壁: 次の相手の行動が終わるまで、受ける傷を最大2減らす。
3 手当: 自分を最大HPまで2回復。回復0も合法で、カードは渡ります。
防壁は相手が手当/防壁でも期限切れ。重ねて永久には残せません。
使ったカードは効果の後で相手へ移るので、敵は今渡された札も使います。
敵が倒れたらカード移譲を確定して終了し、反撃しません。
通常の1往復後は2枚対2枚。自分の攻撃で敵が倒れた直後だけ1枚対3枚です。
固定所有比較では使用後に自分へ戻し、途中/終了時も2枚対2枚を保ちます。

有限の検証済みbank（任意整数seedや無限生成ではありません）
A-01-g1 大技を持たせない: 自HP7/敵6、自分火球/火花、敵防壁/手当。
敵: 不足HP2以上なら手当→火球→火花→防壁→手当。
B-01-g1 守りを渡す時刻: 自HP6/敵7、自分火球/防壁、敵火花/手当。
敵: 防壁込みで倒せる攻撃（大きい順）→火球→火花→不足HP2以上なら手当→防壁→手当。
C-01-g1 相手が構えたら: 自HP8/敵8、自分火花/手当、敵火球/防壁。
敵: 自分の残手札に火球があれば防壁→火球→火花→不足HP2以上なら手当→防壁→手当。
全て先頭から、所有する合法な札を選びます。最後は固有ID順。
条件はプレイヤーが使って渡した後の状態を見ます。最大HPは各初期値です。

授業の核
model.pyのState/round_step/cast/enemy_choiceは純粋な整数モデル。
効果→対象の防壁期限→カード移譲→終了判定→敵行動→ラウンド更新の順です。
予告と実処理は同一関数。描画は結果を読むだけで、乱数も探索も消費しません。
12往復×2択の有限列挙は開発用experiments.pyにだけあり、起動時には探索しません。
描画30fpsで待機/停止しても、意味入力を確定しなければゲームは進みません。

記録
recordsのJSONに確定配分/全カード/公開優先表/ルール・生成器・環境版を保存。
正規化UTF-8 JSONのSHA-256、意味入力、論理tick、効果列、途中/終了状態hashを含む。
python model.py records/<名前>.json で別プロセス再生。違う版/盤面/入力は拒否。
python -m unittest -v test_model test_ui
python experiments.py test_output
テスト出力はtest_outputへ。元のmedia/native証拠はテストから更新しません。

検証結果と別案
Aの最短4手例: 火花→火球→火花→火球。自HP3で勝利。
同じ4手の即時最大傷は火球→火花→火球→火球で自HP1。勝ち方にも余裕の差。
Bは火球→防壁→火花→火球で自HP2。火球連打なら2往復で敗北。
Cは火花→火球→手当→火球→火球で自HP1。回復を挟まないと先に倒れます。
小さい効果や防御を優先するとA/Cで決着なしも成立。安全策を禁止していません。
これは計算による成立確認です。人にとって分かる/楽しいことの証明ではありません。

一規則比較
Aで所有権の移動だけを変更。HP/効果/優先表/12往復は同じ。
両版で勝利可能。固定所有は火球4回で自HP7、移譲は温存を含む4回で自HP3。
初手の火球後は両版とも自HP7/敵HP5でも、次の手札が異なります。
media/comparison_exchange.png とcomparison_fixed.pngは同じ初手の実レンダラ画像。
固定所有版を架空の旧版や楽しさの劣る版とは呼びません。

映像・限界・権利
media/exchange_spells_automatic_silent.mp4は実Pyxel描画の自動入力、無音約25秒。
元GIFの749frameを一度ずつ30fpsへ配置。24.966667秒。ffprobe結果を同梱。
native_*はLinuxネイティブ実操作。A/B/C勝利、B敗北からundo、停止/再開を確認。
詳細と原記録名はQA.txt。自動収録と人による試遊は区別しています。
初見理解/面白さ/再挑戦の理由は人の確認待ち。音は設計上ありません。
ソース/自作図形: LICENSE.txt(MIT)。字形: assets/NOTO-LICENSE.txt(OFL1.1)。
Pyxel: assets/PYXEL-LICENSE.txt。外部画像・曲・生成サービスは使っていません。
