ぷよぷよ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を起動すると、このようなウィンドウが出てきます。
まずは思考エンジンを登録します。
設定(P) → エンジン管理をクリック
pui_default_ai1.1.exeを選び、開く
をクリック
するとエンジンが登録されます。エンジン管理画面に、default1.1
が表示されます。
されない場合はpui_default_ai1.1.exe
を直接ダブルクリックで起動してやってからもう一度↑の手順をやってみてください。
エンジン管理画面を閉じると、↓の方のドロップダウンにdefault1.1
が出てきています。2PにAI
にチェックを入れてください。
これでスタートを押すと、1P: 人間、2P: 思考エンジンで対戦できます。
1P: 思考エンジン、2P: 思考エンジンとして対戦する方法
これで対戦すると思考エンジン同士での対戦がはじまります。
ただ、同じ思考エンジンなので同じ手を置き続け、永遠に対戦が終わりません。
ということで、put_default_engine1.2.exe
を追加します。
この状態で対戦を始めると、1pと2pで違う置き方をするので、いい感じに対戦してくれます。
これから作りたいもの
- 通信対戦機能
-
ネット対戦サーバ
(floodgate的なもの)を作って、upi-gui
で接続できるようにしたいです。
-
-
UPIプロトコル
のブラッシュアップ- 正直、対戦相手もいないので、仮決定している今のUPIプロトコルにどんな問題が潜んでいるかかわからない状態です。問題があればぜひご指摘いただいて、どんどんブラッシュアップしていきたいです。
最後に
リリースというより、こんなものを作っている、という紹介です。
いろんな方(ぷよらーの方やAI開発者の方)の意見が聞きたいと思い、この記事を書かせていただきました。
(モチベーション維持のためでもあります…)
現時点でエンジンと対戦することはできますので、GUIの動作でおかしいところや、UPIプロトコルのおかしいところをご指摘いただければ幸いです。