パズドラ風ゲーム(VBA版)のアルゴリズム


パズドラ風ゲーム(VBA版)のアルゴリズムです。

 

今回のプログラムも大変なボリュームなので、重要部分に絞って解説します。パズドラの中でも重要な、コンボ処理がメインです。

 

なお、これはあくまで、パズドラを再現した自作プログラムの解説です。 

ガンホー様の本家パズドラのアルゴリズムではありませんのでご注意ください。 

1.初期盤面のセット


まずは、ドロップの初期盤面をセットするところから始めていきます。

パズドラには、火(赤)、水(青)、木(緑)、光(黄)、闇(紫)、回復(ピンク)の6色のドロップが存在していますよね。

初期盤面では、それらがランダムに設置されます。これは、乱数を使えば簡単にできます。

 

しかし、初期盤面ではさらに「コンボが発生しない」という条件が付きます。

コンボとは、縦か横に3つ以上同じ色のドロップが並んだ時のことですよね。

つまり、この状況にならない上で、ランダムに配置する必要があります。

 

 

今回のプログラムでは、いったん色をランダムに配置した後、コンボの判定と色の修正を行っています。

具体的には、左右または上下の色が同じで、その色と自分の色も同じだった場合、再びランダムで色を設定するようにしています。

これならば、3つ以上並んだ場合でも、上下左右に並んだ場合でも、コンボ状態をなくせます。

 

しかし、実はこれでも、100%コンボ状態をなくせるわけではありません。

色の再設定もランダムに行うわけですから、また同じ色になってしまう可能性があります(下図の左から1番目)。

また、左右とは違う色になっても、今度は上下と同じ色になってしまう可能性もあります(下図の左から2番目)。

 

では、上下の色・左右の色と違う色にすればよいのか。実はこれでも不可能です。

Excelファイルでは、左上から右下へ色を設定していますが、その場合だと下図左から3番目のような状況になる可能性があります。

この場合、上2つの黄色は既に確認済みなので変えることはできません。ここで黄色になってしまうと、上下の色が一致していなくても、コンボが成立してしまうのです。

 

というわけで・・・。今回はフラグを用いることで、コンボ状態を完全になくしています。

フラグを最初は0にしておき、コンボ状態が成立していて色を再設定したら、フラグを1に変えます。

そして、フラグが1になった(=色を再設定した)限りは、コンボ状態の確認を繰り返し行うようにします。

フラグが0のままになった時、色を再設定しなかった=コンボ状態がなかった ということですから、ループから抜けます。

こうすれば、100%コンボ状態をなくせるというわけなのです。

 

いっそのこと、上下左右の色と全く違う色にするという方法もありますが、完全なランダム性という部分に欠けるので、今回はフラグを用いた方法にしています。

 

なお、Excelファイルでは「Color_First」プロシージャで初期盤面セットの処理をしています。

※本来、ドロップの情報は配列に格納すると良いのですが、今回のVBAでは、可視化のためにExcelのセル[D9:I13]に値を入れています。

2.コンボ判定処理


パズドラの機能の肝、コンボ判定処理です。ここでは、「コンボによって消えるドロップなのか」の判定を行います。

 

※今回のVBAでは配列を用いていないため、コンボ判定用に新しいセル(横判定用:[D15:I19],縦判定用:[D21:D25])を使っています。

 

コンボの判定は、まず横方向と縦方向に分けて行います。

今回のExcelファイルでは左上から右下へ判定を行いますので、

横方向では右に3つ以上同じ色が並んでいれば、縦方向では下に3つ以上同じ色が並んでいれば、コンボで消えるドロップと判定します。

 

※VBA版では値を10倍にすることでコンボ状態としていますが、配列を用いればもっと簡単になります。

また、VBA版は同じ色が並んでいる数を調べることでコンボの判定を行っていますが、スタックやキューを用いた方がより効率的です。

さらに、VBA版は縦横全てのドロップについて調べていますが、後半2行および後半2列に関しては、そのドロップから3つ以上同じ色が並ぶことはないので、調べる必要はありません。

 

そして、縦横のコンボ判定が終わったら、各々の結果を統合します。縦横どちらかがコンボ状態であれば、コンボ状態とします。

 

なお、Excelファイルでは、横方向のコンボに関しては「Combo_Wide」、縦方向のコンボに関しては「Combo_Height」、コンボの統合については「Compare」プロシージャで処理を行っています。

3.コンボカウント処理


パズドラでは、コンボと判定されたドロップが同時ではなく、順番に消えていきます。

このためのカウント(何番目に消えるかの番号)を設定するのがコンボカウント処理です。

 

パズドラでは、左下から右上に向かってドロップが消えていくため、今回のプログラムもそれに従います。

 

さらに、同じ色が上下左右に隣接する場合は、同時に消えるというルールもあります。

十字消し等ができるのはこのためですね。

右図の①~④は、同時に消えるドロップの例です。

 

しかし、⑤は全てのドロップが隣接していますが、同時には消えません。

1→2の順でドロップが消えていきます。

(実は、以前のパズドラではバグで同時に消えてました。現在は修正されています)

なぜかといえば、「x」はコンボ状態ではないドロップだからです。

「x」の周りを見てみると、確かにどの方向でも3つ以上赤が並んでいません。

 

単に同じ色が隣接している場合ではなく、コンボ状態かつ同じ色のドロップが隣接している場合に、同じカウントで消えるのです。

 

そして、これをどう実現するかですが、VBA版では少しややこしい処理をしています。

左下からの判定と右下からの判定を行っています。

左下からの判定では、左・下と隣接していればそれらと同じカウントを設定し、それ以外はカウント+1にして新しいカウントとする。

右下からの判定では、右・下と隣接していればそれらと同じカウントを設定し、それ以外は左下からの判定と同じ値にする。

これで一応実現できています。

 

※キューを用いることで簡易化することもできます。主な手順は以下の通りです。

0. 盤面内のドロップを繰り返しで調べる。カウント未設定かつコンボ状態のドロップであれば、対象ドロップとする。

1. 対象ドロップに現在のカウントを設定する。

2. 対象ドロップの上下左右を調べ、コンボ状態かつ同じ色のドロップがあれば、ドロップの位置情報をキューに格納する。

3. キューからドロップの位置情報を取り出し、対象ドロップとする。

4. キューの中身が無くなるまで1~3を繰り返す。中身が無くなったら、カウントアップ(+1)して次のドロップの調査へ移る。

つまり、迷路探索アルゴリズムの「幅優先探索」とほぼ同じことをしています。迷路での「進めるマス」が、「コンボ状態かつ同じ色のドロップ」に変わっただけですね。

 

なお、Excelファイルでは「Count」プロシージャにてコンボカウント処理をしています。

4.ドロップ削除処理


ドロップ削除処理では、コンボカウントを基にドロップを消していきます。

 

単に消しているだけではなく、味方の攻撃力を求めるために、各属性のコンボ数や1コンボで消したドロップの数等を計算しています。

攻撃力については、このページでも解説したいのですが・・・。スペースの都合上、割愛させていただきます。

攻撃力の計算方法は検索すれば出てきますので、他のサイトでご覧ください。

 

なお、Excelファイルでは「Count_Delete」プロシージャにてドロップ削除処理をしています。

5.ドロップ落下処理


ドロップ落下処理は、コンボでドロップが消えた部分に、ドロップを移動させていく処理のことです。

この処理は、盤面に残ったドロップを落とす処理と、新しいドロップを落とす処理に分かれます。

 

盤面に残ったドロップを落とす処理では、各ドロップの下の空きマスを計算し、その空きマス分だけ下に移動させます。

この時、繰り返しは下から上への順番で行っていきます。

 

新しいドロップを落とす処理は、新しいドロップを生成する処理で代用しています。

盤面に残ったドロップを落とす処理の後、上部に残った空いたマスに新しい色をランダムで設定するだけなので、とても簡単です。

※簡単な代わりに、あまり落ちているという感じにはなりません。

 

そして、これらのドロップ落下処理は、コンボ状態のドロップが無くなるまで呼び出されます。

これがいわゆる「落ちコン」というものですね。

 

なお、Excelファイルでは、盤面に残ったドロップを落とす処理は「Drop_Combo」、新しいドロップを生成する処理は「Color_Reset」プロシージャで行っています。

2~5までがコンボ処理となります。

Excelファイルでは、これらの処理を「Combo_Delete」プロシージャにまとめています。