078 夜の花壇設計

同じ花壇に、昼と夜の二つの景色を植える小さな創作玩具です。
依頼を満たしても、自分の好きな色や並びへ直しても。美しさの隠し得点はありません。

起動
Windows: Python 3を入れ、setup.batを一度実行。その後play.bat。
macOS/Linux: Python 3でsetup.sh、続いてplay.sh。実行時はPyxel＋標準ライブラリのみ。
Linux / Python 3.12 / Pyxel 2.9.9で検証。Windows/macOS実機は未確認です。

操作
Spaceで開始。矢印で4×3の枠を選び、Tabで昼花D／夜花Nを切替、Zで植えます。
同じ種類へZを押すと三色を順送りします。Dは黄→白→赤、Nは青→白→紫。
違う種類なら先頭色へ植え替えます。Backspaceで抜く、Xで直前の編集を戻す。
Spaceは昼夜表示だけを切替。Bは横並び／切替のみの表示実験です。
Enterで提出。未達でもSで自分の案として保存できます。提出後も編集可能です。
S保存／L読込の後、左右か1～3で保存枠、Zで確定、Xで取消。上書きは別の確認が出ます。
読込は編集一手としてXで戻せます。保存はローカルのsavesに三枠。外部投稿はありません。
Rで空の花壇、1～3で依頼。未保存の配置から別依頼へ移る時と終了時は確認します。
H/Pで説明、Mで表紙、F12で画像、Escで終了確認。確認はZ、取消はX。
キーを押し続けても初回のみ。すべて離すまで次の操作を採用しません。
同じフレームの複数新規操作は不採用。説明・確認・提出結果中もキー解放を追跡します。
一試行の記録は2048操作まで。上限ではSで保存し、Rで空にしてLで読み直せます。

共通ルール
1枠1本、最大6本。各依頼はちょうど6本と二つの条件があります。
石と通路へは植えられません。選択枠や仮の花は配置に数えません。
昼はDだけ咲き、Nは葉。夜はNだけ咲き、Dは葉。同じ配列から両方を描きます。
時間経過、成長、枯死、色別の在庫制限はありません。昼夜切替で配列は変わりません。
連結は咲く花だけの縦横隣接。斜めや閉じた花は橋渡しになりません。空集合は合格しません。
条件ごとに合致／不足を表示。条件外の自分の案は依頼達成と区別して保存します。
保存JSONは版・状況・花配列・昼夜表示・提出状態・再計算した条件・案の区分を含みます。
破損、異版、不正座標、石への花、改ざんされた成功判定は理由付きで拒否します。
保存はUTF-8の一時ファイルから置換。テストは一時フォルダだけを使います。

三つの依頼
A: 石は中央の二枠。昼の入口側（下段）に2本以上、夜のベンチ側（上段）に2本以上。
B: 同じ石。昼花3本が縦横で一まとまり、夜花3本も一まとまり。
C: 石は2列2行、通路は2列3行。昼の白が2本以上、夜の青が2本以上。
残りの色や場所は自由。反転だけではない三案ずつをsolution_logs.jsonに保存しました。

設計検査と比較
各依頼の植えられる10枠をD/N/空の3^10通りで検査。6本配置を抽出し、Cの色条件は昼白／夜青の割当可能性を別に検査しました。7^12通りを列挙したとは称しません。
原案の条件を変える必要はありませんでした。多くの解があることは、創りたい気持ちの証明ではありません。
Bキーの横並び有無は表示補助だけの比較で、ゲーム規則変更ではありません。
植物、条件、同じ花壇の達成判定は固定。架空の旧版や美的優劣の比較ではありません。

記録と検証
model.pyは純粋な配置・評価、controller.pyは入力、storage.pyはファイル、app.pyは描画です。
意味入力、版、状況、完全状態、正規化JSON SHA-256を各mediaセッションへ記録。
python -m unittest -vでテスト。experiments.pyは開発専用の有限列挙です。
--demoは実際のPyxel自動操作で二案を編集・保存・読込し、無音映像を生成します。
--qaは手動実窓QAの保存先を当該mediaセッションへ隔離します。通常のplayではsavesを使います。
最終動画は実レンダラーの全ソースフレームを一度ずつ30fpsへ変換。元の撮影ソースは保持します。
人の試遊、創作の満足、Windows/macOS実機、音声出力は未確認。音を使わない作品です。

権利
自作ソースはLICENSE.txtのMIT。日本語文字はNoto Sans CJK由来、SIL OFL全文同梱。
Pyxelのライセンス全文をassetsに同梱。外部の画像・音楽・アカウントは不要です。
