014 流れ星の清掃員
Python 3.10+ / Pyxel 2.9.9 / 2026-10-02 UTC
実装・機能検証済み。面白さ・初見理解は人による確認待ち。

何をするゲーム？
十字の星くずを、SPACEを押しながら移動して全部掃除する。
掃いた跡は約2.4秒だけ光の壁となり、岩を跳ね返す。
一度離れた線は自分も通れない。「どこを掃くか」が次の道を変える。

起動
Windows: setup.bat を一度実行し、終わったら play.bat。
macOS/Linux: bash setup.sh を一度実行し、bash play.sh。
Python本体が必要。ゲーム実行の依存は requirements.txt の Pyxel のみ。
フォントの再生成だけは Pillow と Noto Sans CJK が必要。通常起動には不要。
フォルダ丸ごと移せる。日本語・空白を含むパス、別の作業ディレクトリで検査済み。
Windows実機のSDL起動は未確認。cp932既定文字コードの模擬検査は通過。

操作
タイトル: 左右で区画を選び、SPACEで開始。
方向キー: 移動。斜めでも速さは同じ。
SPACE長押し: 掃除。離せば線を残さず移動。
P: 一時停止／再開。停止中は岩・線の寿命・巻戻しも進まない。
Z: 1秒前へ巻戻す。1秒未満なら開始時まで。何度でも使用可。
R: 同じ区画の最初から。成功後N: 次の区画。ESC: 終了。
F12: media/manual_runtime.png に現在画面を保存。

ルール
・星くずは掃除中の移動線から5px以内で回収。静止では足元だけ。
・線は最大2pxの小区間で記録し、各区間が生まれてから2.4秒で消える。
  区間を伸ばしても寿命を更新しない。区間化の時間差は最大約0.048秒。
・足元に重なる線は点線。完全に離れるまでは自分を邪魔しない。
  生後0.18秒の猶予後、離れた線へ戻ると止まる。昔の線へ再適用しない。
・岩には線が生まれた瞬間から有効。岩は反射し、ごみは消えない。
・線の白い粒と色の変化が寿命の目安。残り0.5秒で破線になる。
・線に触れても失敗しない。通路が開くまで安全な場所で待てる。
・岩に触れると停止し、接触箇所を輪で示す。ZかRで再挑戦できる。
・全部掃いた時点で成功。出口への往復、時間制限、必須スコアはない。
・巻戻しは位置、岩の速度、壁、回収したごみも戻す。使用回数は別記録。

3つの区画と選択
A 開いた三日月: 岩なし。弧に沿う、途中で線を離す、壁が消えるのを待つ。
B 横切る岩: 下を横に掃き、岩の折返しを作ってから上へ向かう。
  上の星くずを先に取り、大きく回る別解も検証済み。
C 出口を残す丸: 円形8個と離れた1個。外を先に掃く最短巡回と、
  円から先に掃いて下側へ抜ける経路の両方が成功する。
  初期案の2岩は1岩に減らした。機械的な速度の締付けを避けるため。
  半径28pxを一周する間に古い線は消えるため、必ず閉じ込められるとはしない。

設計案からの調整
Aは表示領域内で弧を読みやすく再配置。
Bの岩はx104、速さ18。掃いた横壁を先に置ける時間の余白を確保。
Cは円の外に1個を追加。円を全部取っても直ちに成功して出口判断が消える問題を解消。
岩数を1個にして、巡回順と自作の線の両方を読みやすくした。

再現・検査
python -m unittest -v test_model test_ui
python solve.py
python experiment.py
python tools/test_portability.py
python app.py --demo --headless
python tools/capture_comparison.py --headless --baseline
python tools/capture_comparison.py --headless

構成
model.py: Pyxel非依存モデル、固定1/120秒刻み、30Hz入力、巻戻し。
app.py: 日本語UI、実Pyxel描画。assets/glyphs.json: 同梱ビットマップ字形。
solve.py / media/success_inputs.json: 3区画の成功入力。テレポートなし。
experiment.py / experiment_results.json: 方策監査と一項目比較。
test_model.py / test_ui.py: モデル・入力・字形検査。
QA.txt / MANUAL_QA.txt: 機能検査と実画面観察の範囲。
NOTE.txt / X_POSTS.txt: 未公開の投稿原稿。

映像
media/sweeper_automatic_silent.mp4: 実Pyxel描画、8方向の自動入力、無音。
809フレーム、30fps、26.966667秒、768x656、H.264、音声ストリームなし。
GIFはPyxelの10ms単位丸めで短くなるため、MP4化で各フレームを1/30秒へ復元。
人が遊んだ映像や音の実聴確認ではない。ゲーム自体も意図して無音。
