013 棚からぼたもち：5段階の独立教材

最初にLESSON.mdを読んでください。画面はASCII、本文は日本語です。
原作C「荷重の引越し」の通常モデルを05で再現します。
01〜04は接触、荷重、同時破断、手動落下の観察用です。
架空の非回転・垂直だけの格子模型で、現実の構造物の安全計算ではありません。

必要環境
Python 3.10以上 + pyxel==2.9.9。モデルとテストは標準ライブラリだけです。
今回の実行環境はPython 3.12.14 / Pyxel 2.9.9 / Linux headless。

準備（この教材フォルダで実行）
Windows:
  py -m venv .venv
  .venv\Scripts\python -m pip install -r requirements.txt
  .venv\Scripts\python -B 01_contacts.py
macOS/Linux:
  python3 -m venv .venv
  .venv/bin/python -m pip install -r requirements.txt
  .venv/bin/python -B 01_contacts.py

段階を替える
01_contacts.py / 02_loads.py / 03_breakage.py / 04_falling.py / 05_puzzle.py
それぞれの.pyを1本だけコピーしても起動できます。画像・日本語フォントは不要です。
別フォルダから呼ぶ時は、スペースのあるパスを引用符で囲んで指定してください。
例: python -B "/path/日本語 空白/05_puzzle.py"
全ファイルはUTF-8。JSONや本文の読み書きもencoding='utf-8'を指定しています。

操作
01: 左右で全物体を参照。
02/03: 1/2/3でD上のもち0/1/2個の観察状態。左右で板を参照。
03: Spaceで同時破断だけを適用。Dはまだ落ちません。
04: 左右で板選択、Spaceで除去、Xで1回ずつ再計算。未解決中はXかR。
05: 左右で板選択、Spaceで除去と解決、Zで一手戻す。
全段階: Rで初期化、Escで終了。一入力ごとに全操作キーを離します。
Rを含む同時押しは拒否します。05の成功・失敗後はZ/Rが使えます。
05の安全な操作例: Space → 右 → Space → Space （A1 → D → A2）。
失敗例: Space → Space。Zで戻してから右 → Space → Spaceで修正できます。

開発用コマンド
python -B test_stages.py
python -B tools/run_examples.py
python -B 05_puzzle.py --headless-replay STSS --screenshot success.png --report success.json
python -B tools/run_qa.py
python -B tools/verify_frozen.py
headless再生: L=左、T=右、S=Space、X/Z/R/1/2/3は同名キー。
各合成キーの間には1フレームの全解放があります。実キーボードを押した記録ではありません。
最低12フレーム、長い入力は2×入力数+2フレーム。正確な値は各JSONへ記録します。
--headless-smokeと--headless-replayは併用不可。出力指定はheadless専用です。

困ったとき
- No module named pyxel: 起動に使う同じPythonでpip install -r requirements.txtを実行。
- Pythonの構文エラー: 3.10以上か確認。起動するPythonとpipの環境をそろえる。
- 画面やSDLのエラー: 表示できるデスクトップ環境で通常起動する。
  画面のないLinux検証では--headless-smokeとSDL_AUDIODRIVER=dummyを使用。
- ModuleNotFoundErrorがテストでも出る: このtest_stages.pyはPyxel不要。
  原作のtest_model.pyではなく教材test_stages.pyを起動しているか確認。
- 何も動かない: 全ての操作キーを離す。01は参照だけ、02は観察だけ。
  04の未解決時はX、05の成功・失敗後はZかR。大文字入力は不要。
- ファイル出力失敗: --screenshot/--reportの親フォルダを先に作り、書込権限を確認。
- 異なる文字コード: .pyをUTF-8で保存し直す。本文ファイルはUTF-8対応エディタで開く。

限界と権利
時間制限・音・乱数・ネットワークなし。教材05は落下表示を即時解決へ簡略化。
Windows/macOS実機、ブラウザ、ネイティブOS入力、人の試遊、音の実聴は未検証。
日本語と空白を含むパス、無関係な作業フォルダ、cp932標準入出力はLinuxで検証。
ゲーム規則の照合は24固定除去経路+13境界配置。全履歴の網羅証明ではありません。
各.pyには原作MIT全文。LICENSEと参照するassets/NOTO-LICENSE.txtを同梱。
Noto字形データ自体は使用しません。再配布する時も権利表示を保持してください。

凍結済みのQAを再実行すると所要時間などが変わるためSHA256も変わります。
変更内容を再確認してから、必要な場合だけ tools/verify_frozen.py --write で再固定します。
