LoginSignup
72
29

More than 3 years have passed since last update.

ぷよぷよAIを作りやすくしてみた

Last updated at Posted at 2019-08-12

ぷよぷよAIを作ることは中々面倒であるという話

私はとあるぷよぷよ好きなプログラマです。
以前はコンピュータ将棋に力を入れて開発していたのですが、最近はぷよぷよAIにハマっています。
こっそり自分で作って、動いているところを見て一人で楽しんでいましたが、やはり他の方が作ったプログラムと対戦させてみたい欲がでてきました。
ただこれが、現状だと難しいのです。
というのも、ぷよぷよAI界は、コンピュータ将棋界ほどインフラが整備されていないからです。

何が足りないのか

1. GUIを作らずに済む仕組みがない

まず、ぷよぷよAIを作るうえで面倒なのは、GUIを作らないといけないという点でしょうか。
探索評価のアルゴリズムだけを追求したい開発者にとって、絵を書いたり、音声を探したり、はたまたそれらを動かしたりするプログラムを書くのは苦痛です。(コンソールだけでも作れなくはないですが……)
将棋には、この問題を解決するための仕組みとして、USIプロトコルがあります。
USIプロトコルとは、GUIと思考エンジンの通信プロトコルです。
なんのこっちゃと思うかもしれませんが、根底にある考えは、「GUI思考部分をプログラム的に独立させること」です。
すなわち、GUIプログラム思考プログラムは別々に作り、相互に通信することで動くようにするということです。その通信方法の取り決めがUSIプロトコルです。
このような作りにしておくと、GUIは「他の誰かが作ったもの」を使用できるため、エンジン開発者一人一人がGUIを作る必要がなくなります。
この辺の考えについては以下のページがよくまとまっているので、ご参照ください。
http://shogidokoro.starfree.jp/why.html

ぷよぷよにもこのような仕組みがあれば、面倒なGUI作成から解放されますね。

2. ルールが統一化されていない

ぷよぷよは将棋ほどルールが明確ではありません。ゲームの種類(ぷよぷよ通、ぷよぷよテトリス、ぷよぷよeスポーツ等)によって動作に違いがあります。
例えば、落下速度、硬直時間、連鎖時間、お邪魔ぷよ相殺時の振る舞い(クロス、割り込み)等です。
この辺が統一化されていないと、エンジン開発者はどのルールに合わせて作ればいいのかわかりませんね。
この問題の解決方法として、ルールを統一化するのではなく、「複数のルールが存在すること」= 「将棋でいう持ち時間の違いのようなもの」と考える、という方法があります。
つまり、思考エンジン同士が通信対戦を開始する前に、通信対戦サーバが「このルールでやるよ!」ということを各思考エンジンに通知し、思考エンジンは、対戦中はそのルールに従って思考すればよいのです。
つまり、通信対戦サーバと、思考エンジンとの通信プロトコル次第で解決する問題であるということです。

3. 思考エンジン同士が対戦ができる環境がない

インターネット上

将棋にはfloodgateという環境がありまして、ここで24時間365日、思考エンジン同士の戦いが繰り広げられています。
いつでもだれでも参加できるので、思考エンジン開発者の大きなモチベーションになっていると思います。
ぷよぷよにもこういった環境があれば、人口が増えて盛り上がりそうです。

リアル

将棋には世界コンピュータ将棋選手権と、もう終わってしまいましたが将棋電王トーナメントがありました。
ぷよぷよAIのリアル大会はあるとお聞きしたことはありますし、大会の様子を配信されているのも見たことはあるのですが、現在もどこかでどなたが募集されているんでしょうか。。機会があればぜひお誘いください。

既存のフレームワークについて

もちろん、上記に書いたことを解決する方法を考えた先人の方がいらっしゃいます。puyoaiです。
実質、下記3点すべてを解決するフレームワークです。

  • GUIを作らずに済む仕組みがない
  • ルールが統一化されていない
  • 思考エンジン同士が対戦ができる環境がない

puyoaiは、実機でぷよぷよAIを動かすことを目的としており、「人間と同じ土俵で戦う」というポリシーが感じられます。
ただ、自作のぷよぷよプログラム上で動くAIを作ることは目的とされていないように見受けられましたので、本フレームワークは使用しませんでした。
puyoaiの目的や用途について間違っていたら申し訳ございません。

それで、結局作ったもの

  • UPIプロトコル
  • UPIプロトコル準拠のGUI
  • UPIプロトコル準拠の思考エンジン

UPIプロトコル

先ほど述べた、GUIを作らなくて済む仕組みを作るために考案しました。プロトコル本文は下のリンクを参照ください。
https://github.com/TukamotoRyuzo/upi-protocol/blob/master/README.md

USIプロトコルをベースとしています。これで完成というわけではなく、あくまで案なので、改善案があれば教えてください。

UPIプロトコル準拠のGUI

upi-guiと名付けました。詳細は下のリンクを参照ください。
https://github.com/TukamotoRyuzo/upi-gui

ダウンロードリンク
https://github.com/TukamotoRyuzo/upi-gui/releases

UPIプロトコル準拠の思考エンジン

ソースは公開していません。 実行バイナリはupi-guiとともにダウンロードできます。
10連鎖以上を安定して組める方なら勝てると思います。

(2019/11/27 追記)
思考エンジンをpythonで書きました。通信部や思考ルーチンのサンプルとしてご活用ください。
https://github.com/TukamotoRyuzo/upi-engine

使い方(2020/3/13 追記)

1P: 人間、2P: 思考エンジンとして対戦する方法

upi-gui.exeを起動すると、このようなウィンドウが出てきます。
image.png

まずは思考エンジンを登録します。
設定(P) → エンジン管理をクリック
image.png

出てきたウィンドウで追加をクリック
image.png

pui_default_ai1.1.exeを選び、開くをクリック
image.png

するとエンジンが登録されます。エンジン管理画面に、default1.1が表示されます。
されない場合はpui_default_ai1.1.exeを直接ダブルクリックで起動してやってからもう一度↑の手順をやってみてください。
image.png

エンジン管理画面を閉じると、↓の方のドロップダウンにdefault1.1が出てきています。2PにAIにチェックを入れてください。
image.png

これでスタートを押すと、1P: 人間、2P: 思考エンジンで対戦できます。
image.png

1P: 思考エンジン、2P: 思考エンジンとして対戦する方法

1P側のAIにもチェックを入れてください。
image.png

これで対戦すると思考エンジン同士での対戦がはじまります。
ただ、同じ思考エンジンなので同じ手を置き続け、永遠に対戦が終わりません。
ということで、put_default_engine1.2.exeを追加します。
image.png

するとdefault1.2を選べるようになります。
image.png

この状態で対戦を始めると、1pと2pで違う置き方をするので、いい感じに対戦してくれます。

これから作りたいもの

  • 通信対戦機能
    • ネット対戦サーバ(floodgate的なもの)を作って、upi-guiで接続できるようにしたいです。
  • UPIプロトコルのブラッシュアップ
    • 正直、対戦相手もいないので、仮決定している今のUPIプロトコルにどんな問題が潜んでいるかかわからない状態です。問題があればぜひご指摘いただいて、どんどんブラッシュアップしていきたいです。

最後に

リリースというより、こんなものを作っている、という紹介です。
いろんな方(ぷよらーの方やAI開発者の方)の意見が聞きたいと思い、この記事を書かせていただきました。
(モチベーション維持のためでもあります…)
現時点でエンジンと対戦することはできますので、GUIの動作でおかしいところや、UPIプロトコルのおかしいところをご指摘いただければ幸いです。

72
29
16

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
29