#立体パズルの別解を作る:同じ影と最少の積み木
ShadowTwinは、上・正面・横の図が同じになる、別々の積み木配置を2つ探すパズルです。単に見本の立体を復元するのではなく、「この図だけではひとつに決まらない」ことを遊びにしています。
美術館の台座と3つの投影窓をモチーフに、暗いスレート色の部屋へ琥珀とミントの展示を並べました。スマホでも両方の立体を横並びに置き、編集する展示だけを切り替えます。
#ひとつの正解ではなく、ふたつの配置
#操作が通ることと、遊び方が伝わることは別
公開後に「どうやって遊ぶのか分からない」という指摘を受けました。操作・保存のテストが通っても、初めて見る人が数字の盤と立体の対応を理解できるとは限りません。画面下の説明に頼っていたのが不足でした。
そこで開始位置に目的と操作を置き、実際の盤を7回押して初問を完成させる練習を追加しました。自動で答えを入れるのではなく、次に押すマスとその理由を示します。A1〜C3の座標、選択した積み木の白枠、目標と違う影の赤枠を同じ画面で対応づけます。練習をやり直す場合は編集済み配置を勝手に消さず、確認を取り、取り消し履歴にも残します。案内を閉じても配置は保持します。
これは理解の入口を改善するための変更で、誰でも迷わないと実証したものではありません。初見ユーザーの理解は引き続き確認が必要です。
床は3×3、高さは0〜3。各マスには下から支えられた積み木があり、空中に浮くブロックはありません。
上から見た図は床が埋まっているかどうか、正面は各列の最高段、横は各行の最高段です。奥の低い積み木や、最高段を担う場所の違いが図に現れない場合があります。
同じ3つの図になる配置が複数あるのは、判定の不具合ではありません。そこで、両方の図が合い、両方が最少個数で、固定の向きで配置が違うとクリアにしました。同じ配置を2つ並べたり、個数を増やして影だけ合わせたりしてもクリアにはなりません。
#先に全探索で問題を確かめる
全ての高さを自由に試すと、4の9乗、262,144通りです。独立した検査では5問それぞれについてこの全配置を調べ、最少個数・最少配置の数・一致する全配置の数と個数分布を照合しました。
画面側では床が空なら0、埋まっていれば1以上に限定し、各マスの上限を正面と横の最高段の小さい方にします。探索は最大でも3の9乗、19,683通りです。実際の5問はさらに少ない探索で済みます。
5問の最少個数は7・12・12・14・14、最少配置の数は2・6・2・4・2。最初の見本は非対称の足場にして、床方向の回転・反転だけでは2つの配置が一致しないことも検査しました。ただし全問で、立体を任意の方向に回した場合の同一形状を判定しているわけではありません。
#スマホで記憶ゲームにしない
試作ではAとBの編集盤を縦に並べたため、スマホで比較する際に長くスクロールする必要がありました。正式画面では2つの立体を常に横並びにし、1つの編集盤を切り替えて使います。目標の図と、編集中の実際の図を別々に表示します。
編集盤のボタンは再生成せず、矢印移動や高さ変更後もフォーカスを保ちます。ネイティブのボタンを使うことで、タッチとキーボードの操作を揃えました。取り消しは最大40操作で、別の問題の保存データを開いた場合も元へ戻せます。
#途中経過も正直に持ち帰る
SVGカードは2つの立体、個数、配置、完成・未達成の判定を含みます。途中の状態を完成画像として書き出しません。JSONは版・問題名・9マスの高さ配列を検査し、不正な入力や8KBを超えるファイルでは現在の配置を変えません。
作成したBlob URLは一定時間後と画面離脱時に解放します。ファイル読込中に問題を切り替えたり離脱したりした場合は、古い読込結果で新しい画面を上書きしないようにしています。
#既存のゲームとの距離
三面図から積み木を組むゲーム自体は既にあります。ISOMETRY、Perspective、Milo Marwickの立体パズルを調べました。問題・画像・コードは使っていません。ShadowTwinは別解を2つ見つける比較を中心にしていますが、この組合せが世界で初めてだとは主張しません。
#扱わないこと
これは平行投影の積み木パズルで、実際の光源・影・日射のシミュレーターではありません。空間能力や知能を診断したり、学習効果を保証したりしません。実機Safariや長期的な利用・需要の評価は、計算とブラウザの動作検査とは別です。
[ ./next_action ]
読んだら、 ShadowTwin を実際に動かす。
この開発ログは ShadowTwin をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。