ASP.NET Core版 対コンピュータ対戦できるぷよぷよをつくる(4)の続きです。前回までのものはコンピュータ側は適当にぷよを積んでいくだけでした。そこで今回はデタラメに積むのではなくアルゴリズムを考えます。

ぷよは現在落下しているものと次回、そして次々回のものがわかっています。またひとつの組ぷよの置き方はどの列に配置するかと回転量をどうするかで全部で22通り存在します。そのため現在落下している組ぷよと次回、次々回のぷよが配置された結果として22の3乗個の結果が存在します。

今回はこの22の3乗個の結果に対して評価点を与え、そのなかで評価点がもっとも高いものを採用すればよいということになります。今回は基本部分だけ考えます。

AiActionResultクラスの定義

組ぷよを落としたあとの結果を格納するクラスを定義します。現在落下中の組ぷよと次回、次々回分の結果を格納できるように、メンバーはリストにします。右に○回移動して(左移動は負数回として考える)○回回転させたあと(最大で3回)落下させるとどうなるのか(処理後の固定されたぷよの状態、連鎖数、落下数、評価点、窒息していないか)をリストにして格納します。

そしてその複製を生成したり、複数のオブジェクトを合成できるようにしておきます。

AiBasicクラスの定義

AIの実装の基本になる動作を定義したクラスを作成します。

以降は名前空間を省略します。

ぷよを落とした結果を取得する

これはすでに固定されたぷよを示す二次元配列のコピーを返すメソッドです。

以下は固定されたぷよの二次元配列から消えるぷよのリストを返すメソッドです。

以下はぷよが消えたときにそのぷよの上にあるぷよを一段下げるメソッドです。

以下は組ぷよのそれぞれを落下できるところまで落下させるメソッドです。

以下はこの位置で組ぷよを落としたあと固定されたぷよがどうなるのか(連鎖発生後の状態)を取得するメソッドです。

以下は組ぷよを落としたときの結果が格納されているAiActionResultオブジェクトのリストを取得するメソッドです。落下させるために組ぷよを各列に移動させ回転させます。各列に移動する処理は6とおり、回転は4とおりあります。ただし端に移動させた場合は回転できない場合があるので考えるのは全部で22とおりです。これらをすべて総当たりで取得します。

GetFalledPuyosメソッドに引数をそのまま渡すと組ぷよの高さが変わってしまうので、引数をそのまま渡すのではなくコピーを渡します。あとは取得されたもののなかから