034 三手の剣舞 / 5段階のPython + Pyxel教材

必要環境
Python 3.11以上、Pyxel 2.9.9。GUI/OpenGL対応のデスクトップ環境。
原作個別READMEの古い「3.10以降」より、原作共通READMEの3.11以上を優先します。
通常プレイはPyxel以外の外部パッケージ不要。画像・フォントの追加資産も不要です。
ゲームはASCII表示・無音。日本語の授業本文はLESSON.mdにあります。

最初にZIPを空のフォルダーへ全部展開してください。ZIP内から直接起動しないでください。
既存の自分の改造へ上書きせず、新しいフォルダーを使ってください。
以下はこのREADMEとrequirements.txtがある教材フォルダーで実行します。
同じ教材内の5本は同じ.venvを使います。別PCへ.venvをコピーせず作り直します。

Windows（PowerShellまたはコマンドプロンプト）
  py -3 --version
  py -3 -m venv .venv
  .venv\Scripts\python.exe -m pip install -r requirements.txt
  .venv\Scripts\python.exe -B 01_distance.py
  .venv\Scripts\python.exe -B 02_slash.py
  .venv\Scripts\python.exe -B 03_history.py
  .venv\Scripts\python.exe -B 04_simultaneous.py
  .venv\Scripts\python.exe -B 05_undo.py
最初のバージョン表示が3.11未満ならPython 3.11以上を用意してから続けてください。

macOS / Linux（ターミナル）
  python3 --version
  python3 -m venv .venv
  .venv/bin/python -m pip install -r requirements.txt
  .venv/bin/python -B 01_distance.py
  .venv/bin/python -B 02_slash.py
  .venv/bin/python -B 03_history.py
  .venv/bin/python -B 04_simultaneous.py
  .venv/bin/python -B 05_undo.py
最初の表示が3.11未満なら対応版を使ってください。Linuxでvenvが使えない場合は、
利用しているPython配布のvenv対応を確認します。初回のPyxel導入だけネットが必要です。
仮想環境のactivate操作は不要です。以後も上記.venv内のPythonを使います。

段階と操作
01 移動と間合い：右/D 前進、左/A 後退、Space 静止。攻撃も勝敗もまだありません。
02 斬り：上/Zを追加。相手は静止した練習台、斬りは1点ずつ。
03 直前3手：履歴・同数時の最新優先・2点の連続斬り。構えは表示だけで未実行。
04 同時戦闘：原作Aの相手移動、攻撃、回復、衝突、勝敗まで実装。
05 Undo：Xで全状態を1手戻す。Rで初期化、全段階Escで終了。
R/Xのあとには全部の操作キーを離してください。押しっぱなしの行動は連打しません。

授業の攻略表記F/S/B/Wは、前進/斬り/後退/静止の記号です。実キーF/S/B/Wとは異なります。
04/05の例：Z 右 右 Z Z Zで6手勝利・HP1。
無傷例：Z 左 左 Z Z 右 Z 右 Zで9手勝利・HP3。
相手を倒し自分が生き残ればWON。両HP0はMUTUALです。
黄色NEXTは候補位置、赤線はその候補位置からの攻撃距離。衝突なら両者は旧位置に戻り、
戻した最終距離で攻撃を判定します。候補位置の予告はそのとき成立しません。

内容
5本の独立.py、LESSON.md、lessons.json、lesson_meta.json、段階間diffs、
LICENSE、固定requirements.txt、test_stages.py、qa/の検証記録と原作比較フィクスチャ。
5本のどれか1本だけをコピーしても、Pyxelのある環境で起動できます。
テストはこのフォルダー全体を保持してください。テストは標準ライブラリだけで動きます。

検証を再実行
Windows:
  .venv\Scripts\python.exe -B -m unittest -v test_stages.py
macOS/Linux:
  .venv/bin/python -B -m unittest -v test_stages.py
到達可能状態の全探索を含むため、数十秒かかる場合があります。

画面検証（ユーザーの自動記録用、実キーボード入力とは別）
Windows:
  .venv\Scripts\python.exe -B 05_undo.py --headless-replay SFFSSSX --screenshot check.png --report check.json
macOS/Linux:
  .venv/bin/python -B 05_undo.py --headless-replay SFFSSSX --screenshot check.png --report check.json
無入力の初期画面は--headless-smoke。F/S/B/Wは合成行動、XはUndo、Kはリセットです。
--headless-smoke --actions は最大12手。長い列は--headless-replayへ渡します。
既存の記録を上書きしない新しい保存名を指定してください。JSONはUTF-8です。
音声装置なしのLinuxではSDL_AUDIODRIVER=dummyを設定して検証できます。無音ゲームです。
qa/compare_original.py --original ORIGINAL_GAME_FOLDERは原作を別途持つ場合だけの比較用。
通常のプレイとtest_stages.pyは原作を必要とせず、ローカル絶対パス依存もありません。

範囲とライセンス
完成版は原作A・窓3とUndoを収録。B/C、窓1比較、日本語字形、表紙/停止/場面選択、
原作の実験・映像ツールは省略。01〜03は段階的な練習版で原作相当ではありません。
原作のMIT全文と著作権をLICENSE/各.pyに保持しています。
原文末尾のNoto案内は残していますが、教材はNotoデータを同梱・使用しません。
検証はLinuxの合成入力・純粋モデル・実Pyxel headless描画です。
Windows/macOS実GUI、人の試遊、実OSキー、ブラウザ操作、音声聴取は未確認です。
詳細と実際の検証数はQA.txtに記載します。

Linuxで日本語パスを使うときはUTF-8対応ロケールを使ってください。
LC_ALL=CかつPython UTF-8モード無効のASCII環境では、Pyxel 2.9.9の初期化が
日本語パスのUnicodeEncodeErrorで失敗することを確認しました。これはWindows実機の検証結果ではありません。

上記Linux ASCIIロケールの条件では、その起動だけPYTHONUTF8=1を指定すると
日本語・空白パスで5本とも起動できることを確認しました。環境固有の回避策です。
  PYTHONUTF8=1 .venv/bin/python -B 05_undo.py
この指定はそのプロセスだけに適用し、システム全体の設定は変更しません。
