039 見回り犬とパン屋：5段階の独立教材
共通要件：Python 3.11以上、Pyxel 2.9.9。GUI起動にはデスクトップ画面が必要。
原作Cの地図で、有限寿命の匂い、局所観測、巡回、三軒への配達を学びます。
01〜03は勝敗なしの練習。04でCのゲーム規則、05でUndoまで完成します。
まずLESSON.mdを読み、各.pyは一つずつ起動してください。

macOS / Linux（教材フォルダへcdしてから）
  python3 --version
  python3 -m venv .venv
  .venv/bin/python -m pip install -r requirements.txt
  .venv/bin/python -B 01_scent.py
  .venv/bin/python -B 05_undo.py
  .venv/bin/python -B test_stages.py

Windows PowerShell（教材フォルダへcdしてから）
  py -3 --version
  py -3 -m venv .venv
  .\.venv\Scripts\python.exe -m pip install -r requirements.txt
  .\.venv\Scripts\python.exe -B 01_scent.py
  .\.venv\Scripts\python.exe -B 05_undo.py
  .\.venv\Scripts\python.exe -B test_stages.py

Windows コマンドプロンプトでも上記の .\.venv\Scripts\python.exe を利用できます。
仮想環境のactivateは不要なので、PowerShellのスクリプト実行ポリシーを変更しません。
pyがない場合はインストール済みPython 3.11以上のpythonで同じコマンドを実行。
python3が古い場合は、python3.11など3.11以上の実行ファイルでvenvを作り直す。

各.pyは他の段階や素材ファイルを読みません。1個だけ別フォルダへコピーしても起動できます。
例（空白・日本語のパスは引用符で囲む。環境パスも同様）：
  macOS/Linux: "/path/to/.venv/bin/python" -B "/path/to/パン屋 教材/05_undo.py"
  PowerShell: & "C:\path\to\.venv\Scripts\python.exe" -B "C:\パン屋 教材\05_undo.py"
再配布時は各.pyに埋め込まれたMIT本文を残してください。

操作
  矢印：1押下1歩。Space：1手待つ。Z：1個置く。
  04/05は未配達の玄関でZを押すと配達、それ以外は餌。
  R：初期化。05のみX：一手戻す。Esc：終了。
  通常行動キーは矢印・Space・Z。複数保持中は行動拒否、後から自動実行されない。
  R後は全操作キーを離してから再開。RはXより優先、Xは通常行動より優先。
  05ではX+矢印の新規同時押しはUndoのみ。保持したX+新規矢印は移動可能。
  人が動いても匂いは出ない。箱は閉じている。犬は局所の匂いだけを追う。

よくあるエラー
  ModuleNotFoundError: pyxel
    起動に使う .venv のpythonで pip install -r requirements.txt を実行する。
  No matching distribution / venv作成失敗
    Python 3.11以上の版とCPU/OSを確認。Linuxでvenv不足ならOS公式のpython3-venvを確認。
  can't open file
    cdの場所とファイル名を確認。空白のあるパスは引用符で囲む。
  syntax error / UnicodeDecodeError
    .py/.json/.txt/.mdをUTF-8で保存。プログラムのファイル入出力はUTF-8指定。
  画面が開かない
    画面のないサーバーでは通常GUIを開けない。実Pyxelのheadless検証は下記を使う。
  音声デバイスの警告
    教材は無音。クラウドheadlessで音声初期化の警告が出ることがある。
    警告だけで描画失敗と決めず、終了コード、PNG、状態JSONを確認する。
  キーが効かない
    R直後は一度全キーを離す。複数行動キーを保持していないか確認。
    04/05でWON/SHORTなら通常行動は停止。05のXかRを使う。

検証（インストールを行わない。既存のPyxel環境で実行）
  python -B test_stages.py
  python -B 05_undo.py --headless-smoke --demo-checkpoint --screenshot qa/example.png --state-json qa/example.json
  python -B tools/run_qa.py
  python -B tools/verify_freeze.py
run_qa.pyは18枚の画面・隔離結果・試験ログをqaへ更新するため、凍結後は再凍結が必要。
通常のGUI起動はファイルを保存しません。headlessの指定出力だけを保存します。

確認範囲
  Python 3.11文法解析、Linux上のモデル/実コントローラ、実Pyxel headless描画。
  日本語・空白パスで独立1ファイルを無関係なCWDから起動。
  原作Cとの差分はqa/canonical_reference.jsonの46ケースと照合。
  キー入力は合成入力。OS実入力、人の試遊、Windows/macOS GUI、ブラウザ、音は未確認。
  実行環境のPython実版とPyxel版はqa/render_results.jsonに記録する。
  原作27試験と自動デモの成功は別の原作QAであり、新教材の成功の代わりにしない。

権利表示
  LICENSEは原作LICENSE.txtと完全一致。5本の.pyにも省略なしのMITを収録。
  原作LICENSEの参照先assets/NOTO-LICENSE.txtを改変せず同梱。
  教材の表示はASCIIと図形のみで、Notoの字形データは使わない。
