022 ことばの橋
Python + Pyxel / 小さなルールカード・橋パズル

「いま渡れる石」より、「文を替えられる陸」を先に見つける。
川の羽印は軽い石、錘印は重い石です。掲示板の「浮く」「沈む」の札は
各1枚。文を替えると、同じ印の石が川全体で一斉に上下します。
背中の荷物を右の旗まで届ければ成功。時間制限、残機、点数罰はありません。

Windows
1. Python 3.10以降を python.org の公式インストーラーなどで用意します。
2. このフォルダーを丸ごと展開し、setup.bat をダブルクリック。
3. 準備後、play.bat をダブルクリック。
setup.bat はこのフォルダーの .venv に requirements.txt を入れます。
BATはASCII、パスは引用符付き、失敗時はpauseでエラーを残します。
Pythonがない・pyコマンドがない場合は、その準備を先に行ってください。
日本語と空白のパス、cp932既定の模擬試験は成功。Windows実機未検証。

macOS / Linux
Python 3.10以降を用意し、ターミナルから bash setup.sh、bash play.sh。
または python -m venv .venv → .venv/bin/python -m pip install -r requirements.txt
→ .venv/bin/python app.py。macOS実機未検証。Linux Pyxel実描画を検証。
実行時に必要なのはPyxel 2.9.9のみ。ネットワーク接続はインストール時のみ。
モデルとゲームは通信・LLM・外部サービスを使いません。

操作
題名画面：左右で3つの川を選択、Spaceで開始。
矢印：1回押すごとに1歩。押しっぱなしで歩き続けません。
Space：2行を交換する予告。キーを離して、もう一度Spaceで確定。
  予告中の点線＝次に浮く石、下向き矢印＝次に沈む石。
  2行の文は予告内容。確定するまで川の実際のルールは変わりません。
  予告中は矢印キーで歩かず、Zで予告を取り消します。
Z：通常時は1つ前の確定行動へ戻る。移動も文変更も戻せます。
R：同じ川を初めから。P：停止／再開。Q：題名画面。Esc：終了。
成功後：Nで次の川、Zで成功直前へ、Rで同じ川をもう一度。
同時の矢印入力は上→下→左→右の優先順で1つだけ処理します。
開始、次の川、文予告の出入り、停止などの後は、操作キーを全て
いったん離してから次を受け付けます。状態をまたぐ長押し誤入力を防ぎます。

ルールは2通りだけ
・軽いは浮く／重いは沈む
・軽いは沈む／重いは浮く
水・沈んだ石には歩けません。足元が石のとき文変更は拒否されます。
陸は文に関係なく安全。島を含む全ての乾いた陸から変更できます。
荷物は目的を示す絵で、石の重量・移動速度に影響しません。
不合法入力は位置、札、手数、履歴を変えません。

3つの川
1. 短い文：最初の岸から、どちらの石を浮かせるか。
2. 中ほどの句点：途中の乾いた島で、次の橋へつなぐ。
3. 近く見える継ぎ目：近道の継ぎ目に陸がない。先にどこへ向かうか。
A/Bは導入、Cの「変更後も立てる場所を確保する」が中心の発見です。
面数・歩数やメニュー操作の多さを深さと評価していません。

主なファイル
model.py：描画と独立した不変Level/State、合法判定・原子的遷移。
game.py：undo、予告、停止、入力端とキー解除ゲート。
app.py：実際のPyxel画面。assets/glyphs.json：同梱日本語字形。
solver.py / solver_results.json：有限グラフの全探索と独立した再生検査。
test_model.py / test_ui.py：34項目のモデル・入力・全画面字形検査。
QA.txt：技術検証と未確認事項。EXPERIMENT.txt：予告だけを変える比較。
NOTE.txt / X_POSTS.txt：日本語の発信用下書き。公開投稿していません。
media/：実画面PNG、自動操作・無音MP4、GIF、入力と状態hashの記録。

検証コマンド（このフォルダーで）
python -m unittest -v
python solver.py
python experiment.py
python tools/test_portability.py
python app.py --headless --demo
開発用動画変換・フォント再生成はPillowとffmpegが別途必要です。
無音設計。音の実聴評価はありません。人による面白さ・初見理解は確認待ち。
