コインソート は、色と形の違うコインを筒に仕分けて揃える、水ソート系のパズルゲームです。
目次
作った理由
水ソート系のパズルが好きでよく遊んでいたのですが、どれも途中で手が止まります。数レベル進むと全画面の広告が入り、スタミナが尽きて待たされ、復帰用のアイテムを買うかどうかを聞かれる。パズルそのものは面白いのに、遊びたいテンポで遊べないことが不満でした。
やりたいのは単純で、ソートパズルだけをひたすら解き続けることです。それならいっそ自分で作ってしまおう、というのがきっかけでした。だから最初に決めた仕様は、ゲーム性ではなく遊び方のほうです。スタミナを作らない、レベルの解放待ちを作らない、通信なしで遊べるようにする。この3つを満たした上で、中身を詰めていきました。
全100レベルで、どのレベルにもいつでも飛べます。レベル1から順に解かないと次へ進めない作りにはしていません。難しいところで詰まったら飛ばして、気が向いたら戻ってくればいい、という距離感にしています。
水ソートに「形」という軸を足す
水ソート系のルールはよくできていますが、遊んでいるうちに「色を揃える」以外の判断材料がなく、作業に近くなる瞬間があります。そこでコインに形という属性を足しました。
コインは、まる・さんかく・しかく・ひしがた の4種類の形を持ちます。そして筒は、原則として同じ形のコインしか受け付けません。丸いコインは円柱に、三角のコインは三角柱に入ります。
問題は四角いコインでした。四角柱にただ入れるだけだと、なぜ丸いコインが入らないのか見た目で納得できません。そこで四角のコインを中心に穴の空いたワッシャー型にして、四角柱の底から芯棒を立てました。穴のないコインは芯棒に通らないので入らない、という理屈が絵で伝わります。ルールを文章で説明しなくても、見ればわかる形にしたかったのです。
さらに、破線で描かれたフリー筒を用意しました。こちらは芯棒のないただの箱なので、どの形のコインでも置けます。形の制限が厳しすぎると詰みやすくなるため、逃げ道として機能します。
この「形」という軸が入ったことで、色だけを見て動かしていると手が止まるようになりました。色は合っているのに形が違うから置けない、という状況が生まれるからです。
必ず解ける盤面しか出さない
パズルゲームで一番やってはいけないのは、そもそも解けない問題を出すことだと思っています。プレイヤーは自分の腕を疑って延々と考え込むことになり、時間を無駄にさせてしまいます。
コインソートでは、レベル番号を乱数の種にして盤面を作り、その盤面を深さ優先探索のソルバーに通して、解けることを確認できたものだけを採用しています。 解けなかった盤面は捨てて作り直します。だから全100レベル、すべて解けることが保証されています。
この方式の副産物として、レベル番号が同じなら誰の端末でも同じ盤面が出ます。種が同じなら同じ乱数列になるためです。盤面データをアプリに持たせる必要がないので、容量も増えません。
難易度はレベルが上がるにつれ、形の種類・色の数・かき混ぜの回数が増えていく形で調整しています。
ヘクサモード 筒をなくしたらどうなるか
ノーマルモードを作り終えたあと、筒という制約をなくしたらどうなるかを試したくなりました。それがヘクサモードです。
六角形のマスが並んだ台紙の上に、六角形のコインを積みます。筒がないので高さの上限はありません。代わりに、同じ色が8枚重なるとその場で消えます。 動かせるのは辺が隣り合っているマスだけなので、ノーマルモードとは違って「どこへでも運べる」わけではなく、経路を考える必要が出てきます。
作ってみて最初につまずいたのは視点でした。真上から見ると何枚積んであるか分からず、斜めから見ると手前の山が奥のマスを隠してしまいます。どちらか一方に決められなかったので、盤面を上下にドラッグすると視点の角度が変わるようにしました。枚数を読みたいときは斜めに、奥のマスを触りたいときは真上寄りに、プレイヤーが好きに切り替えられます。
もうひとつ苦労したのが盤面の生成です。コインをランダムに置いただけの盤面は、隣接マスしか動かせない厳しいルールではほぼ解けません。そこで発想を逆にして、最初からクリアできている配置を作り、それを逆向きの手順でかき混ぜる方式にしました。逆再生した手順をそのまま戻せば必ず解けるので、解ける盤面だけを安定して作れます。
4目ならべを足した理由
ソートパズルは一人で黙々と遊ぶものです。ただ、同じ端末で誰かと向かい合って遊べるものも入れておきたくて、4目ならべを足しました。7列×6段の盤に交互にコインを落として、先に4つ並べたら勝ちという、あのゲームです。コインを使うという点でソートモードと世界観が揃うので、無理なく同居できました。
CPUはミニマックス探索にアルファベータ枝刈りを入れたものです。強さの調整は評価関数をいじるのではなく、何手先まで読むかで変えています。よわいが1手、ふつうが4手、つよいが8手です。読みの深さだけで強さが素直に変わるので、調整がわかりやすくて済みました。
CPU戦の「1手戻す」は、自分の手番単位で戻るようにしています。1手だけ戻すとCPUの手番から再開してしまい、戻した意味がなくなるためです。負けた直後にも使えるので、詰めを読み直したいときに便利です。
ヒントは答えを教えるのではなく進める
ヒント機能の作り方は少し迷いました。「この筒からこの筒へ動かせます」と候補を表示するだけだと、その手を指してもクリアに近づくとは限りません。 動かせる手と、正解につながる手は別物だからです。
そこでヒントは、盤面の生成に使っているのと同じソルバーにクリアまでつながる手を探させて、見つかった一手を実際に進めるようにしました。移動元と移動先を一瞬だけ光らせてから動きます。
この作りにすると、副次的な効果がありました。どう動かしても解けない盤面では、ソルバーが手を見つけられないので、その旨が表示されます。つまり「もう詰んでいるから戻ったほうがいい」という判断材料になります。 ヒントが詰み判定を兼ねる形です。
ヘクサモードにはアシスト表示も用意しました。コインを選ぶと移動先の候補が白く光り、そこへ動かすと同じ色が何枚重なるか(8枚なら消える)がバッジで出ます。慣れてきたら切るとノーヒントの盤面になります。
作ってみてわかったこと
最初は単純な水ソートのつもりで作り始めたのですが、形という軸を1本足しただけで、別のゲームになりました。 色を合わせるだけだった作業に、置けるか置けないかという判断が入ります。ルールの要素を増やすより、既存の要素に直交する軸を足すほうが、手応えが変わりやすいのだと思います。
もうひとつ実感したのは、ソルバーを先に書いておくと後が楽だということです。レベル生成の検証にも、ヒント機能にも、詰み判定にも、同じソルバーをそのまま使い回せました。パズルゲームを作るなら、面白さを詰める前に解答プログラムを先に書くのが近道だと思います。
広告はバナーを画面上部に置いているだけで、プレイを止める全画面広告は入れていません。スタミナもありません。通信も不要なので、機内モードでも遊べます。自分が遊びたかった形にはできたので、同じ不満を持っている方に届けばうれしいです。