最後の一匹：学習用5段階

このREADMEと01_button.pyが見えるフォルダーが教材ZIPのルートです。
ZIPを展開し、そのフォルダーをターミナルで開いてから実行してください。
原作ZIPのapp.pyを置き換えるものではありません。

必要なもの
- Python 3.11以降
- Pyxel 2.9.9（requirements.txtで固定）
- 通常プレイにはGUIとOpenGL対応環境
Pyxel以外の追加パッケージ、画像素材、音素材、日本語フォントは不要です。

1. 最初の準備

macOS / Linux：python3 --versionが3.11以上であることを確認します。

python3 --version
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt

Windows PowerShell / コマンドプロンプト：py -3 --versionが3.11以上であることを確認します。

py -3 --version
py -3 -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txt

初回のpipインストールにはインターネットが必要です。
共有PCや学校のPCでは管理者の利用ルールに従ってください。
失敗したら、Pythonのバージョンとエラー文を確認します。
ファイルをpyxel.py、フォルダーをpyxelと名付けると読み込みを邪魔することがあります。

2. 1本ずつ順番に起動

macOS / Linux：

.venv/bin/python 01_button.py
.venv/bin/python 02_meters.py
.venv/bin/python 03_cue.py
.venv/bin/python 04_release.py
.venv/bin/python 05_result.py

Windows：

.venv\Scripts\python.exe 01_button.py
.venv\Scripts\python.exe 02_meters.py
.venv\Scripts\python.exe 03_cue.py
.venv\Scripts\python.exe 04_release.py
.venv\Scripts\python.exe 05_result.py

起動したウィンドウを終了してから次のコマンドへ進んでください。
各.pyは単独で動き、他の段階のファイルを読み込みません。

Space：押している間は巻く、離すと緩める。
R：同じ初期状態からやり直す。
P：05のみ一時停止／再開。停止中もRは使えます。
Esc：終了。原作のEsc一時停止とは異なります。

01〜04は勝敗のないメーター練習です。
05は小魚1匹を釣るゲーム。DISTが0で成功、100で逃走、TENSIONが100で糸切れです。
巻き始めの5フレームはたるみ取りで、距離が減るのは6フレーム目からです。

最終段階の遊び方：Rで戻してすぐ巻き、本物の予兆REAL TURN INが10前後になったらSpaceを離します。
反転してGOOD TURNが出たら巻き直します。反転の瞬間に3〜18フレーム連続で離していれば成功です。
最初から押しっぱなしでも離しっぱなしでも、最初の反転で失敗します。

3. 読む → 動かす → 小さく変える

LESSON.mdに、各段階の考え方、実際のコード、見える結果、間違いやすい点、改造課題をまとめました。
lessons.jsonは同じ5段階を機械で読める配列、lesson_meta.jsonは教材と原作の対応表です。
解説中のpython ファイル名.pyは仮想環境を有効化した場合の短縮表記です。
迷ったら上の.venvを含む完全なコマンドを使ってください。

画面の英字：DIST=距離、TENSION=張力、STAMINA=疲れ、HELD=長押し、RELEASED=離した時間。
fはフレームです。30フレームで1秒。解説は日本語、画面はPyxel標準英字です。

4. 検査

純粋ロジック・構文・教材整合性と、明示的なスタブによる入力配線のテストです。
Pyxelの実画面を描くテストではなく、GUIなしで実行できます。

macOS / Linux：
.venv/bin/python -m unittest -v test_stages.py

Windows：
.venv\Scripts\python.exe -m unittest -v test_stages.py

作成時に32テストを確認しています。28件は純粋ロジック等、4件はスタブです。
勝敗、長押し／解放、リセット、停止、3・18フレームの成功境界、反転のlocal=59（60回目の更新）、5／6フレームの巻き始めを検査します。

実物のPyxelを12回更新・12回描画して終了する補助モード：

macOS / Linux：
.venv/bin/python 05_result.py --headless-smoke --screenshot smoke.png

Windows：
.venv\Scripts\python.exe 05_result.py --headless-smoke --screenshot smoke.png

01〜04も同じオプションが使えます。--screenshot PATHは12回目の描画を保存します。
既存ファイルと同じ名前なら画像を上書きするので、保存先を確かめてください。
通常起動で--screenshotだけを付けると12回目に保存し、その後もゲームは続きます。
OpenGLを含む実行環境によってはheadlessでも失敗します。
補助モードは入力なしの12フレームだけで、最後まで遊ぶテストではありません。

5. 原作との違い

残した核：長押しと解放、距離・張力、本物の予兆、3〜18フレームの成功報酬、疲れ、5フレームの巻き始め、勝敗。
最終段階は原作のsmall・variant=0に相当する小魚1匹に限定しています。
省略：5枠の魚群、魚種・seed、フェイント、魚間の選択、連続ボーナスの未確定／確定、確定で次の魚を見送る判断。
タイトル、日本語字形、統計ログ、録画も省略。01〜04の勝敗と巻き始め待ちは05で追加します。
教材を原作全体の再実装と見なさず、LESSON.md末尾の順で原作のFishとVoyageを読んでください。

6. 検証範囲と権利

実物のPyxel 2.9.9で全5段階の12フレーム起動・PNG保存を別途確認しています。
テスト成功は手操作の操作感、楽しさ、学習効果の保証ではありません。Windows実機は未確認です。

元コード・図形：MIT。Copyright (c) 2026 Pyxel 100 contributors。
教材の変更・追加コードもMITです。LICENSEと各.py冒頭の全文を保持してください。
LICENSE中のNoto例外は原作の表示をそのまま保持したものです。
この教材はassets/glyphs.jsonとNoto由来フォントを使用・同梱しません。
原作を別配布する場合は原作のassets/NOTO-LICENSE.txtも保持してください。
