ARMERIA

Rubyと競技プログラミングの話 AtCoderやCodeforcesの問題解説記事が多め。

パズルゲームのAIってどうやって作ればいいんだろう

今日、将棋の棋士とコンピュータが戦う電王戦(in ニコニコ生放送)を観てました。私は第3戦から見始めたのですが、すごく面白かったですね。多くの解説者やコメントが、無条件に棋士を応援する感じだったのは、ちょっと違うよなあと思ったのですが。

パネポンのAIを作りたい

さて、あの将棋ソフトのようなすごいものを作ろうとは全く思ってないのですが、パネルでポンのクローンとして作っている「Rubyでポン」にも、AIを付けたいとは思っていまして。

パネル交換や消滅といった基本動作、連鎖と同時消しの判定まではできてきたので、次にやるとしたら対戦かなと。対戦だとおじゃまを落とすとかの機能ももちろん必要なのですが、対戦相手のAIはとにかく何をすれば良い感じに実装できるのか全く予想がつかないので、最近は「パズルゲーム AI」みたいなので検索をかけてたりしたわけです。いまいち良い情報はなかったですが。

というわけで、どういう要素を作ればいいのかもやーっと考えているものを、整理も兼ねて書き出してみようと思います。評価関数式とか強化学習とか今の自分の知識じゃできっこないのでルールベースです。

ルール1:パネルを消す

横を入れ替えて行けば消せるパネルを探して消す。基本となる操作です。横1列に同色パネルが3つあるか、隣り合う横3列で1個以上ずつ同じ色のパネルがあれば、揃えにいく、とかですか。

パネルを一度落とさないと(高さの座標を崩さないと)消せないパターンについては、上記の単純な方法だと探せないので、難しいかも。

ルール2:同時消しを狙う

基本的には縦消しが主だと思いますが、隣り合う横4列以上に同じ色があった場合、同時消しを狙うようにします。

ルール3:連鎖を狙う

ちょっと難しくなってきました。組み連鎖のパターンを覚えてもらって、その形が横移動だけで作れそうかということを判定するとか(ぷよぷよだと、連鎖の形はかなり定跡化されてますよね)。ただそれだとパネポンっぽくないので、なんとかしてアクティブ連鎖をさせられないかなー。

ルール4:整地する

対戦ですぐ死なないようにするためには必要でしょう。特に実装は難しくなさそう?

消える処理の探索を簡単にするために、常にある程度は整地しておく、というアルゴもありかなーとは思います。

ルール5:おじゃまを優先して消す

これも対戦用。おじゃまを待ち構える連鎖(いわゆるカウンター)もできるといいですね。

本当は詰み防止の消せるパネル残しとかもやりたいけど、とりあえずそこまではいいかな…

さあ、作ろう

みたいなのを考えつつも、まだ全然コードに手をつけられていない自分。明日は書こうと思います。