#概要
パズドラのアルゴリズムを再現を目指しました。なお筆者は曲芸師前後(2015年)に引退しているので古い可能性があります。
###はじめに
パズドラのアルゴリズムを検索しているとかなり難解(個人の感想です)な印象を受けました。ですが、深く考えてみるとアルゴリズムだけではプログラムを勉強し始めて一年目ぐらいの知識量でも作れそうということが分かったので公開しました。
###用語解説・定義
#####盤面
後述のドロップが動かせる範囲のこと。また、画面上に存在するドロップ全てのことを指す。
#####ドロップ
画像上にたくさんある〇や□のこと。各種属性に分かれている。盤面上のこれを操作してパズルを成立させる。
#####塊
記事内専用の造語。同属性ドロップが三つ以上縦か横につながっていることを指しており、塊同士がL字や十字やT字のように繋がっていると一つの塊とみなす。画像上では5コンボが成立しており、1と2の間の炎(赤)ドロップは三つ以上に並んでいないので繋がっていないものとみなす。
#考察
###ステップ分割
- 待機状態(☆)
- パズルフェイズ
- コンボフェイズ
- ダメージフェイズ
- ステージ移動・勝敗フェイズ
初期状態→パズルフェイズ→コンボフェイズ→ダメージフェイズ→(どちらかのHPが尽きるまで☆へ戻る)→ステージ移動、勝敗フェイズという流れになっている。
###ステップ解説
パズドラを知らない人のための解説。知っている人は読み飛ばして構いません。
#####待機状態
パズルが並んでいるだけの状態であり、ここからダンジョンが始まる。スキルと呼ばれる特殊技を使うことができる。盤面上のドロップをつかむことでパズルフェイズに移行。
#####パズルフェイズ
一つのドロップ(〇)を掴んで盤面内の好きな場所に動かすことで、ドロップ同士が入れ替わる。一定時間立つか、ドロップを離すことでコンボフェイズへ移行。
#####コンボフェイズ
今回の目玉。塊が成立している場合、繋がっている塊ごとに消えていく。その盤面上から塊が全てなくなるまで重力は働かず、全てなくなると上から新しいドロップが降って隙間が埋まる。塊が消えるごとにダメージは増え、最終コンボが終わるとダメージが確定。また、これ以上コンボを繋げられない状態になるとダメージフェイズに移行。
#####ダメージフェイズ
コンボフェイズの終了時にはダメージが確定しているので、その分敵にダメージを与え、その後敵の動きがあり、一ターンが終了。どちらかのHPが0になるまで待機ステップへ戻る。
#####ステージ移動・勝敗フェイズ
敵のHPが残っていてかつフロア数が残っている場合は次のフロアへ移動、最終フロアだった場合は勝利、プレイヤーのHPが0になった場合は敗北処理を行う。
#再現
##初期状態、ダメージフェイズ、ステージ移動・勝敗フェイズ
割愛
##パズルフェイズ
ドロップを持った状態で隣のマスに移動するとそこと入れ替えるようにする。当たり判定などを使用
##コンボフェイズ
盤面サイズの二次元配列(今回は5×6)を用意
それぞれ
- コンボ数(何コンボ目に消えるか)、整数
- 属性、整数or列挙型
を管理、保管する。
以下の変数を用意する
1.現在のコンボ数
###コンボ判定
左上から順番に、三つ先までの属性が一致しているかどうか判定をする
もし塊が成立している場合は、三つ先までのコンボ数の数値を(現在のコンボ数)+1する
現在判定しているドロップのうちどれかのコンボ数の値が1以上かつ塊が成立しているなら、
判定している全てのコンボ数を0以外の含んでいるコンボ数と同じにする
#終わりに
使う知識としては、if,for,変数,配列ぐらいのものでパズドラみたいな複雑なゲームのコンボ判定アルゴリズムが実装できるとわかりました。次回はUnityを使って実際にパズドラが作ってみようと思います。