072 ひとつの温室 — 日本語で学ぶPyxel 5段階教材

必要なもの
Python 3.11以上、Pyxel 2.9.9。実行時依存はPyxelとPython標準ライブラリのみ。
これはローカルPythonアプリです。ブラウザ上で遊ぶHTMLゲームではありません。
LESSON.mdを読みながら01から順に起動してください。
各.pyは単独で動き、別の段階、原作、画像、字形、JSONを実行時に読みません。
画面は英語ASCII、解説・コメントは日本語。音はありません。

Windows（PowerShell / コマンドプロンプト）
1. 教材フォルダを展開し、そこでターミナルを開く。
2. py -3 --version
   3.11以上を確認してください。
3. py -3 -m venv .venv
4. .venv\Scripts\python.exe -m pip install -r requirements.txt
5. .venv\Scripts\python.exe 01_sun.py

macOS / Linux
1. 教材フォルダを展開し、そこでターミナルを開く。
2. python3 --version
   3.11以上を確認してください。
3. python3 -m venv .venv
4. .venv/bin/python -m pip install -r requirements.txt
5. .venv/bin/python 01_sun.py

既存の別プロジェクトの環境と混ぜず、この.venvを使うと確認しやすくなります。
activateは必須でなく、上のように環境内pythonを直接呼べます。
日本語や空白のあるパスを指定するときは全体を引用符で囲んでください。
例（macOS/Linux、別の作業フォルダから）:
  "/home/yourname/温室 教材/.venv/bin/python" "/home/yourname/温室 教材/05_forecast_undo.py"
上のパスは書式の例です。自分の保存場所へ置き換えてください。
Windowsでは例: .venv\Scripts\python.exe "C:\Users\YourName\温室 教材\05_forecast_undo.py"

段階
01_sun.py             3区画のT/H、日差し・土、0〜12制限
02_windows.py         窓を開いたままにし、外気へ最大2近づける
03_diffusion.py       同じ旧値から2本の流れを計算して同時拡散
04_plants.py          最終値で成長、8刻で両鉢3以上を目指す
05_forecast_undo.py   開閉候補、同じstepの1刻予告、全状態Undo

操作
Space: 窓を変えず1刻。R: 初期化。Esc: 終了。
02以降の左右: 区画選択（時刻は進まない）。
02〜04のEnter: 選択中の窓を開閉して1刻。
05はZで開閉候補、Enterで候補を確定して1刻。候補なしEnterは待つ。
05のSpaceは候補を無視して窓を変えず1刻。Xで1刻戻す。
毎回すべてのキーを離してください。長押しは1操作、同時押しは不採用。
窓を開閉した効果はその刻から始まり、閉じるまで残ります。

完成範囲
原作A通常モードのみ。03で環境更新、04/05で成長と目標も原作と一致。
01/02は学習用の部分模型であり、原作と同じ結果にはなりません。
B/C、拡散なし比較、各段階の完全なTickReportログ、JSON記録保存、全期間試算、
日本語字形、表紙・停止・原作の判断/イベント上限などは省略しています。
詳しい差分はlesson_meta.jsonとLESSON.md末尾を参照。
T/Hはゲームの整数目盛で、摂氏・相対湿度や現実の栽培の助言ではありません。

困ったとき
・python / pyが見つからない: Python 3.11以上のインストールとPATHを確認。
・No module named pyxel: 起動する.venv内のpythonで上記pipコマンドを実行。
・Linuxでvenv作成に失敗: OSのPython用venvパッケージが必要な場合があります。
  利用OSの公式手順に従ってください。この教材はOSの設定を変更しません。
・画面が開かない: 通常起動はGUI表示環境が必要。リモート端末だけでは表示できない場合があります。
  自動チェックだけなら --headless-smoke を付けられます。
・文字化け: .py / .md / .txt / .jsonをUTF-8対応エディタで開く。ファイルI/OはUTF-8を明示済み。
・Enterを押しても窓が開かない: 05では先にZで候補を置いてからEnter。
・矢印/Zで時刻が進まない: 候補と実行を分ける仕様。SpaceまたはEnterで確定。
・8刻で止まる: 1日の終了です。05はXで戻るか、Rで初めから。
・同時押し後に反応しない: すべてのキーを一度離してから一つずつ。
・予告と異なる結果: Spaceは候補を使いません。候補を適用するキーはEnterです。

検査（原作ファイル不要）
Windows: .venv\Scripts\python.exe -B -m unittest discover -v -p test_stages.py
macOS/Linux: .venv/bin/python -B -m unittest discover -v -p test_stages.py
必要なfixtureはqa/original_A_fixture.jsonとして同梱しています。
実Pyxel描画・日本語/空白パス隔離・配布隔離・文字コード検査:
  .venv/bin/python -B run_qa.py
Windowsでは先頭を.venv\Scripts\python.exeへ置き換えてください。
run_qa.pyはqa/へPNG/JSON/ログを書き、教材内の一時フォルダを終了時に片づけます。
画像だけ試す例:
  .venv/bin/python 05_forecast_undo.py --headless-smoke --demo-checkpoint --screenshot qa/my_check.png
--headless-smokeは短い自動終了、--demo-checkpointは自動キーで見本状態へ進める指定です。
これらを外せば手動で遊べます。通常起動ではファイルを書きません。

任意: 原作を持っている場合のみ直接照合
  .venv/bin/python -B qa/compare_original.py "原作の072_shared_greenhouseフォルダ"
-Bで原作に__pycache__を作らず読み取り、qa/original_A_fixture.jsonを再生成します。
原作Aの全65,536完走列・87,381接頭状態を教材03〜05と比較。
これは教材の試験です。原作の40テストと自動デモの結果は別に扱います。

証跡
QA.txt、qa/render_results.json、qa/isolation_results.json、qa/standalone_tests.txt、
qa/cp932_tests.txt、qa/direct_comparison.txt、qa/original_A_fixture.json、
qa/provenance.json、qa/visual_review.txt、FROZEN_SHA256.jsonを同梱。
diffs/は隣の段階への実際のunified diffです。
qa/build_materials.pyとqa/write_lessons.pyは作成用補助で通常起動・標準試験には不要。
作成用build_materials.pyだけは元配布のライセンスを読むため原作を必要とします。

確認限界
Linuxの実Pyxel headless描画と自動キー検査。人の初見理解/面白さ、OSキーボード入力、
Windows/macOS GUI、ブラウザ、音の実聴は未確認。CP932模擬はWindows実機確認ではありません。

ライセンス
LICENSEは原作LICENSE.txtをそのまま保存。各.pyにも完全なMITコメントを保持。
末尾のNoto字形例外は原作の通知で、教材にはその字形データ自体を含めません。
Pyxel本体は配布物に含めず、requirements.txtで公式パッケージを指定します。
