お弁当列車：5段階の教材

必要: Python3.11以上、Pyxel2.9.9。検査: Linux / Python3.12.14 / Pyxel2.9.9。
ZIPを全展開し、このREADMEのあるフォルダでターミナルを開きます。

Windows:
py -3 -m venv .venv
.venv\Scripts\python -m pip install -r requirements.txt
.venv\Scripts\python 01_hand.py
.venv\Scripts\python 05_undo.py

macOS/Linux:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python 01_hand.py
.venv/bin/python 05_undo.py

Windows/macOS手順は案内であり実機GUIの動作確認ではありません。
各.pyは単独で動きます。初回導入にはネットが必要ですが、ゲーム自体は外部ファイルを読みません。
説明・期待結果・課題はLESSON.md。mainの引数やCLIは自動確認用で、最初はState/step/control/drawを読みます。

操作:
上下: 棚A、棚B、手。準備中は移動先の棚A、棚B、倉庫。
左右: 04/05の準備中に品番号。
C: 取る。準備中は選択品と同じ棚の次を交換。
V: 手の品を選択棚の手前へ戻す。
Z: 02以降の販売。準備中は選択品を移動。
Space: 03以降の出発/早発車。
X: 05のUndo。R: 初期化。Esc: 終了。
一キーずつ押して離します。複数押しを拒否し全解放まで待ちます。新しいRだけは優先します。
原作の運行アニメーションや停止画面を省き、モデルを即時更新する教材用Controllerです。

品の種類: F魚、V野菜、E卵。
内部番号0〜5、画面番号1〜6。5:Eは内部番号4の卵です。
同品種でも個体番号を分け、棚/手/倉庫/売却先に一度だけ存在させます。

段階:
01: 手一個と手前アクセスの練習。注文/駅/作業数なし。
02: 一駅だけの販売、作業回数無制限の練習。
03: 原作Bの走行中ルール、初期棚から出発済みで開始。
04: 時間0の積載を加え、原作Bの通常モデル完成。
05: 準備・持替・販売・発車をUndo。

原作Bの目標は五個以上で、六個必須ではありません。判定は最終駅の発車時です。
倉庫へ残した品は出発後に取り出せません。手持ちは次駅にも保持します。
原作A/C、日本語字形、表紙/状況選択、説明停止、運行表示、前回棚の表示、奥取り比較、記録ファイルを省略。
元の原作ファイルは変更していません。

困ったとき:
No module named pyxel: 起動するものと同じ.venvのpythonでpip install。
ファイルがない: ZIPを展開し、READMEのフォルダへ移動。
キーが反応しない: ウィンドウをクリックし、全操作キーを離してから押す。
販売できない: 手前の品/選択元/現在駅の残注文を確認。拒否は作業を消費しません。
取れない: 手が埋まっていないか。戻せない: 棚が三個で満杯でないか。
六個売ったのに終わらない: 残作業がある最終駅からSpaceで発車します。
文字化け: 説明書とJSONをUTF-8として開きます。ゲーム内は標準ASCIIです。
描画初期化エラー: GUI/OpenGL対応の通常デスクトップで実行。headless検査成功は全OSでの表示保証ではありません。

標準ライブラリの検査:
python test_stages.py
任意の原作再照合: PYXEL048_ORIGINALを原作フォルダへ指定。なければその1件だけskipし、同梱fixtureとの比較は実行します。
比較範囲: 原作Bの初期提案から出発後の全3810状態/49530遷移、積載240標本/6000遷移、Undo20本×50操作。
全積載配置と全Undo履歴を列挙した主張ではありません。
qa/generate_reference.pyは別途与えた原作からfixtureを再生成します。
実Pyxel画像・別ディレクトリ起動・文字コード模擬・試験記録はqa/を参照。
実ブラウザー、Windows/macOS GUI、OSキー入力、人の遊びやすさ、音声は未確認。音は実装していません。

LICENSEは原作全文MIT通知を保持。assets/NOTO-LICENSE.txtも参照先原文のまま。
本教材はPyxel標準ASCIIと図形で、Noto由来字形データは使用しません。原作字形のOFLをMITへ変更していません。
