こんにちは、モリカトロン株式会社チーフエンジニアの松原です。
今日は弊社が開発した「AIネット対戦システム」を紹介いたします。
「AIネット対戦システム」はインターネット上でいつでも誰でもゲームの対戦ができるシステムです。AIと人間とが分け隔てなくゲームを楽しめるシステムであると同時に、強化学習のゲームAIプレイヤー育成基盤にもなり得ます。
ゲームAIやボードゲームAIに興味のある方、ゲームAI開発者、AI育成のためのサーバークライアントシステムに興味のある方々は、ぜひご一読ください。
目次
はじめに
ゲームAIの研究開発を行なっているモリカトロンでは、設立当初から「ゲームをプレイするAI」の開発に注力してまいりました。2019年にはAlpha Zero方式*1による完全情報ゲーム/不完全情報ゲーム/不確定&不完全情報ゲームのAIプレイヤー開発に挑戦しました。*2
また、IGDA日本SIG-AIさん主催のボードゲームAIワークショップにおいては、ガイスター(ものすごく面白い不完全情報ボードゲーム)の思考AIの雛形を提供し、世話役の方々や参加者の皆さまといっしょにAIプレイヤーの作り方について考えたりもしました。*3
そうしたゲームAIに関するさまざまな課題に挑戦するうちに、次のような欲求が出てきました。
- いろいろな人が作ったAIプレイヤー同士を戦わせたい
- いろいろなAIプレイヤーと人間が対戦できるようにしたい
- ron
- 自動対戦しながら勝手に強くなっていくAIも作りたい
- 人間同士でも対戦できるといいよね
- そんな対戦を、誰でも観戦できると楽しいよね
こういった様々な欲求を実現するための基盤として開発したのが、今回紹介する「AIネット対戦システム」です。
AIネット対戦システムとは
AIネット対戦システムは、インターネット上で[人間x人間][人間xAI][AIxAI]のゲーム対戦を実現するサーバー&クライアントシステムの枠組みです。このシステムの上にゲーム(現在は2人対戦のボードゲーム)を実装することで、いつでも・どこでも・だれとでも24時間ネット対戦を行うことができるようになります。
以下にシステムの動きをざっくりと説明します。
- クライアント(人間もしくはAI)がサーバーに入るとまずはロビー(対戦中の部屋リスト)があります。
- ロビーで新しい対戦部屋を作成して入室して対戦相手が来るのを待つか、すでに対戦相手待ちの部屋(上図のroom #2や#3)に入室します。「観戦者」としての入室も可能です。
- ひとつの部屋に2名のプレイヤーがそろったら、手番を選択します(どちらのプレイヤーが先手かを決める)。
- 開始前に設定が必要なゲーム(たとえばガイスターの開始フォーメーションなど)は、このタイミングで設定を行います。
- 手番が決まり、設定も終わったら、ゲームがスタートします。
- ゲーム中は交互に手を打ちます。
- 勝敗が決まったらゲームが終わります。
- 部屋から抜けた(オフラインになった)プレイヤーは「負け」となります。
このようなロビーの仕組み、部屋の生成と消滅、プレイヤーや観戦者の出入りなどを管理し、サーバーとクライアント間の通信プロトコルを厳密にコントロールすることで、システム全体を円滑に運用する、それがAIネット対戦システムです。
AIネット対戦システムのサーバー
AIネット対戦システムのサーバーはPythonで書いています。その構造は以前このブログ↓で紹介したサーバープログラムとほぼ同じです。
サーバープログラムをPythonで書いている都合上、サーバー上で動作するゲーム(リバーシとか、将棋とか、ガイスターといった)のコードはPythonで実装する必要があります(何らかのブリッジを入れれば別の言語で書いてあっても動かせると思います)。ゲームの実装には、次のような要素を組み込みます。*4
- 盤面の初期化
- ある盤面の状況で可能なアクション(打ち手)のリストアップ
- アクションの実行、および次の盤面生成
- ゲームの勝敗(終了)判定
- スコアのカウント
AIネット対戦システムのクライアント
サーバーとクライアントはWebSocketsで通信を行います。クライアントは本システムで規定している通信プロトコルを守りさえすれば何で動作していてもかまいません。すなわちPythonスクリプトでも、HTML + JavaScriptでも、C++のような言語で書かれていてもOKです。
クライアントには人間がプレイできる「対人クライアント」と、プログラムが直接プレイする「AIクライアント」の二種類が考えられます。*5
対人クライアントは、人間が操作できるWebブラウザ上で動くなら、何で、どのように作っても構いません。シンプルなHTML+JavaScriptでも実装できますし、ゲームエンジン(Unity・UE・Cocosなど)を利用してリッチなWebアプリを作っても良いです。
AIクライアントは、WebSocketsを使った通信プロトコルに準拠していればOK。好きな言語で作れます。
AIネット対戦システムの実証実験
モリカトロンではAIネット対戦システムの実証実験のため、次のゲームを実装してみました。
- 6x6盤のリバーシ(盤が小さい方が実験に適しているので)
- 8x8盤のリバーシ(一般的なリバーシ)
- ガイスター(自駒の正体を相手からかくして戦う不完全情報ボードゲーム)
- バトルライン(戦術カードを除外した簡易版)
そして対人クライアントはCocos Creator、AIクライアントはPythonで書きました。以下は開発サーバ上で動かした時のスクリーンショットです。
▲この画面はCocos Creatorで作った対人プレイヤー用のクライアント。WebブラウザでサーバーのURLに接続すると、この画面(ロビー画面)が表示されます。ラジオボタンで4種類のゲームが選択できます。ゲームごとに部屋のリストがわかれており、上図の場合は6x6盤リバーシの部屋リストが表示されています。部屋リスト最上段の「? vs ?」のFightボタンを押すと、新しい部屋が作られて相手待ちに入ります。「Random vs ?」はAIプレイヤー(ランダムだから超絶弱い)が待っている部屋、「MorikaAI277 vs ?」は、モリカトロンが開発したAlphaZeroベースのAIプレイヤーが待っている部屋です。ちなみに277はAIをトレーニングしたときのチェックポイント(学習途中のモデルを保存したもの)の番号です。さっそくこのMorikaAI277部屋のFightボタンを押してみましょう。
▲MorikaAI277が待っている対戦部屋に入りました。画面の左半分が盤面、右半分がチャット&システムメッセージの表示場所です。現在は手番の選択ウインドウが出ています。First moveを選ぶと「先手を希望」します。Second moveは「後手を希望」。Whicheverは「どっちでもいいよ」です。システムは両プレイヤーの希望通りに手番を決定しますが、バッティングした場合はランダムに決定します。MorikaAI227はすでに「どっちでもいい」を選んだ、とチャットに表示されています。
ここはとりあえあずFirst moveのままOKを押します。
▲私が先手(黒)で始まりました。画面中央にある黒い石は、現在黒の手番であることを示す点滅表示となっています(わかりやすい!)。盤面の黒の半透明のセルは、「そこに打てる」ことを示しています(親切!)。画面中央下にある数字「51」は、「残り51秒で打たないと時間切れですよ」の表示です。リアル対戦なら相手が寝ていれば「こらっ」と叩けば起きてくれますが(もしくは喧嘩になりますが)、ネット対戦ですと声も手も届きませんし、AIとの対戦ならハングアップや超々長考といった危険がありますので、タイマー監視は必須です(タイムアウト値はサーバーのパラメータで自由に設定できます)。 というわけで、ここからどんどん手を打って行きます。さて、MorikaAI277に勝てるでしょうか。
▲勝てませんでした。というか完敗じゃないですかこれ。チャットで「勝てない……」とつぶやいてしまいました。こっそり観戦していた人からのメッセージも表示されていますね(完敗をみられた。はずかしい……)。
勝敗がつくと、Rematch(再戦)と、Finish(終わる)が選べます。両プレイヤーがRematchを選ぶともう一局。どちらからがFinishを選ぶと対戦が終了します。Rematchを選んだプレイヤーはそのまま対戦部屋で次の相手が来るのを待つこともできます。
次はガイスター部屋のMorikaAIと戦ってみましょう。ガイスターは不完全情報ゲームなのでAlphaZeroベースのAIにはなかなか難しい課題です。つまり人間には大いに有利なゲームです。
▲ガイスターの手番の選択画面です。 先手を選びます。
▲ガイスターはスタート前にコマの配置を選べます。とりあえずデフォルトのままでStartします。MorikaAIはすでにStartしていますね。
▲これがプレイ中の画面です。自コマのうちの右端の赤いコマを動かそうとマウスでドラッグしはじめると、このように「移動可能な場所」が半透明のコマで表示されます(わかりやすい!)。ガイスターではこうして赤コマ4個と青コマ4個を動かしますが、敵のコマの色はわかりません(それが不完全情報の部分)。相手のコマ色を推測しながらゲームを進めることになります。したがってプレイヤーの画面には敵コマの色が表示されないようになっています。クライアントへ送る盤面データの段階ですでに敵コマの色は「不明」状態で送られるようになっていますから、受信データをプログラムでハックして敵コマの色をのぞきみることはできない仕組みとなっています。
▲観戦者の画面では両プレイヤーのコマ色がわからない状態で進みます。これはプレイヤーが「観戦者」になりすまして敵のコマ色を覗き見るようなカンニングを防止するための措置です。
▲ゲームが終わりました。なんとMorikaAIに負けてしまいました。これじゃぁまるで底辺プレイヤーみたいな……。それはともかく、ゲームが終わったら両プレイヤーの手の内(全コマの色)が明かされます。
▲このゲームの終盤盤面を観戦者から見ると、このようにゲーム中は見えなかった全コマの色が見える状態になっています。
まとめと次回予告
AIネット対戦システムは、このようにAIと人間とが分け隔てなく対戦を楽しむための枠組みです。リバーシ、ガイスター、バトルラインの三種類のゲームを実装して実証実験を行いました。将来的には対戦部屋を拡張して、多数のAIプレイヤーによるリーグ戦やトーナメント戦の全自動実行といった機能を搭載する予定です*6
今回の記事ではCocos Creatorで作った対人クライアントのスクリーンショットを中心に紹介しましたが、次回はAIクライアントのプログラムを紹介いたします。クライアントのコア部分はごく簡単に実装できるよう工夫しておりますので、どうぞお楽しみに。
コンタクト先
現在「AIネット対戦システム」の一般公開はしておらず、モリカトロン社内のクローズドな開発サーバーにて実験運用している段階です。AIネット対戦システムに興味があるかたは、モリカトロンのホームページのコンタクトシート https://morikatron.com/#contact からご連絡ください。もうすこし知りたい、使ってみたい、自社のAI開発に利用したい、AI開発のワークショップに使いたいなど、どんな内容でもかまいませんので、どうぞお気軽にお送りください。
*1:DeepMindが発表したAlphaZeroの論文はこちら→
[1712.01815] Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm
*2:CEDEC2019: AIは自分でボードゲームの勝ち方を見つけられるか?
*3:AIに不可欠な知識表現とは? IGDAボードゲームAIワークショップをレポート | モリカトロンAIラボ
*4:雛形となるclass定義やリバーシのサンプル実装を用意しています。
*5:将来的には、AIの助言を受けながら人間がプレイする(またはその逆の)ようなハイブリッド・クライアントを作ってみたいですね。楽しそう!
*6:モリカトロン杯=ゲームAIプレイヤー天下一決定戦の開催が夢です。