075 ちいさな錬金冷蔵庫：Python/Pyxel教材 5段階

必要: Python 3.11以上 / Pyxel 2.9.9。通常起動にはGUI/OpenGL対応PCが必要です。
ASCIIと図形だけで表示し、音は使いません。日本語説明はこのREADMEとLESSON.mdです。
架空の反応パズルです。現実の食品保存、化学、調理の安全を教えるものではありません。

ZIPを全展開して、このREADMEとrequirements.txtがあるフォルダーを開きます。
以下は全てZIPルートを作業場所とする相対コマンドです。01から順に1本ずつ起動し、
Escで閉じて次へ進みます。各.pyは独立しており、前段階の実行や他の教材.pyは不要です。
--versionが3.11以上か確認。venv作成は一度だけ。初回pip installにはネット接続が必要です。

Windows (PowerShell / cmd):
py -3 --version
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt
.venv\Scripts\python.exe -B 01_hand.py
.venv\Scripts\python.exe -B 02_rows.py
.venv\Scripts\python.exe -B 03_catalyst.py
.venv\Scripts\python.exe -B 04_two_ticks.py
.venv\Scripts\python.exe -B 05_request_undo.py

macOS / Linux:
python3 --version
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -B 01_hand.py
.venv/bin/python -B 02_rows.py
.venv/bin/python -B 03_catalyst.py
.venv/bin/python -B 04_two_ticks.py
.venv/bin/python -B 05_request_undo.py

共通操作:
矢印: 六枠を選択。左右は同じ段で循環、上下は反対の段へ移動。
Z: 手と枠を交換（持つ・空枠へ置く・別の瓶と交換）。
R: 同じ初期状態へ戻す。Esc: 終了。全キーを離してから次の一つを押してください。
04/05: Enterで扉を閉める。手持ちがあると開始不可。Spaceで一刻。
05: Xで直前の変更を戻す。結果からX三回で開始前。Rは履歴も消します。
選択移動、予告を見る時間、実時間の経過では刻は進みません。

固定ケースAと解:
画面の1,2,3が冷段、4,5,6が温段。コードの番号は0から5です。
初期は1番F1、4番F2、5番M1。Fはひかりの実、Mはすず葉。
原作表のCはくもの素、Bは火花石ですが、この固定ケースには出ません。
Mを5番から2番へ: R、下、右、Z、上、Z（各キーを一回ずつ離す）。
04/05では続けてEnter、Space、Space。05で月ジャム1瓶＋金ジャム1瓶を達成します。
01〜03の「結果」検証画像は配置変更後/予告の画像で、ゲームの完成状態ではありません。

画面のP番号（03以降の反応表の上から順）:
P0 MOON JAM 月ジャム / P1 ICE CANDY 氷あめ / P2 STAR POP 星はじけ / P3 GOLD JAM 金ジャム
P4 FROST CREAM 霜クリーム / P5 CLOUD JELLY 雲ゼリー / P6 PUFF CLOUD ふくらむ雲 / P7 WHITE PUDDING 白プリン
NEXT Pは予告。Pだけなら二刻後に確定した完成品。M/Bと空枠には完成品がありません。
冷段のF/Cは縦横にMがあれば触媒あり、温段のF/Cは縦横にBがあれば触媒ありです。
触媒自身の段は制限しません。斜めや上段右端→下段左端は隣ではありません。
触媒は消費されず、二刻目に全瓶が同じ変更前の棚から完成。完成品からの連鎖はありません。

純粋モデル・明示stub試験（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
reference/canonical_model.pyは原作model.pyの未変更コピーでテスト専用。教材の起動には使いません。

実Pyxelの12フレーム描画（自動操作、無音。人間の試遊ではありません）:
Windows: .venv\Scripts\python.exe -B 05_request_undo.py --headless-smoke12frames --smoke-scene initial --screenshot qa\05_initial.png
Windows: .venv\Scripts\python.exe -B 05_request_undo.py --headless-smoke12frames --smoke-scene result --screenshot qa\05_result.png
macOS/Linux: .venv/bin/python -B 05_request_undo.py --headless-smoke12frames --smoke-scene initial --screenshot qa/05_initial.png
macOS/Linux: .venv/bin/python -B 05_request_undo.py --headless-smoke12frames --smoke-scene result --screenshot qa/05_result.png
全5本が同じオプション対応。--headless-smokeは同義。--screenshotにはheadlessオプションが必要です。
resultは短い自動入力でMを移動し、04/05では二刻進めます。05はさらにUndo→再び二刻目を実行。
通常起動に自動操作はありません。qa/QA.txtに検証範囲と未検証項目を記載します。

原作との差:
固定A、縦横版に限定。B/C依頼、左右だけ比較、図鑑、保存、自動運転、表紙/説明画面、
発見表示、判断数/ログ上限、プレイ記録を省略。01〜04の未追加機能はLESSON.mdに明記。
原作は別途配布された完成版を参照。この教材は原作一式の置き換えではありません。
05には全State互換の日本語reasonを保持しますが、画面は短いASCIIのnoticeを表示します。
図鑑が省略されているため、原作由来reason内の図鑑への言及は画面に表示しません。

MITの全文権利表記はLICENSEと全5本の先頭にあります。原作Noto例外も全文保持していますが、
この教材には字形データやNoto依存はありません。Pyxelは別途そのライセンスが適用されます。
Windows/macOS実機、人間の操作、面白さ、音声出力は未検証です。
