【人狼知能プロジェクト】AIで人狼を遊ぶ方法 ~基本編~
皆様こんにちは。33c33と申します。「人狼知能プロジェクト」では、Python・プロトコル部門で1人チームをやっております。この記事では、まずは「汝は人狼なりや?」(以下・人狼)というゲームでAIを作るプロジェクトについて紹介して、次にサーバーとサンプルAIの使い方について説明します。
この記事の続きとして、Pythonライブラリ「AIWolf」の仕様について説明することを予定しています。
人狼知能プロジェクトとは
「人狼」とは
人狼というゲームはご存じでしょうか?このゲームは複数人で行うトークゲームです。
簡単にルールを説明すると、
- 進行役(ゲームマスター)と2つのチームのプレイヤーに分かれて遊ぶ
- プレイヤーは「役職」によって所属するチームが変わる
- 「毎夜、『人狼』が『人間』を1人襲撃する(ゲームから退場させる)」という設定で、人狼チーム・人間チームのうち最後に生存したチームが勝ち
- プレイヤーは夜のパートが来るたびに『人狼』らしい人物を投票で追放する、人狼をすべて追放すれば『人間』の勝利
- 『人狼』はすべての人間チームのプレイヤーを襲撃すれば勝利
- 追放する人物は昼のパートの会話で決定する
となっています。
このゲームを面白くしている理由は、「プレイヤーはお互いの役職を知らないため誰が敵かだれが味方かわからない」「昼の会話の内容でプレイヤーの個性がでる」ことでしょう。
また、プレイヤー同士の思っていることや投票対象は会話で決まることから、会話を制する者が
このゲームを制します。
場の操作が上手いプレイヤーなら勝利するだけでなく、勝敗以上に場を盛り上げること間違いないでしょう。
人狼知能プロジェクト内の「人狼」の説明
公式サイト
ゲーム性含めての説明人狼知能プロジェクトでは、プログラムで「人狼」をプレイする環境が整えられています。使用が想定されている言語はJava、C#、Pythonです。JavaのGUIで建てられたサーバーに接続して、各クライアントはそこにアクセスしてプレイする流れになります。サーバーから「このメソッドを実行しなさい」という命令が来て、各クライアントはその命令通りに行動することになります。(例として、「ゲームの開始の準備」ではinitialize()メソッドが呼ばれて、会話するときは順番が回ってきたときにtalk()メソッドが呼ばれます。)
人狼知能プロジェクトのチームには、プログラミング言語以外にも「プロトコル部門」「自然言語部門」が存在します。
どちらも「人狼知能プラットフォーム」でプログラムを実行します。
プロトコル部門
プロトコル部門では、プログラム同士の会話を以下のPDFに書かれた「人狼知能プロトコル」で行います。
例えば、「Agent 01はAgent 02が人狼だと思う」は
Agent01 ESTIMATE Agent02 WEREWOLF
という文法になります(発言者が主語のときは主語を省略できます)。
また、過去に言及することも可能で、「4日目にはAgent03は『自分は占い師だ』とカミングアウトしていたとAgent04は述べる」は
Agent04 DAY 04 Agent03 COMINGOUT SEENER
となります。この中で、Agent03 COMINGOUT SEENER
は1つの文です。
更に、特定の会話に言及することもでき、「(Agent05は)会話64に賛成だ」は
Agent05 AGREE ID:64
となります。
会話を終わらせるときは「Over」、今は話さないときは「Skip」という単語が用意されています。
このように、人狼知能プロトコルは単純化しながらもゲームの駆け引きを再現するには十分なプロトコルとなっています。
このような会話を簡潔に記述するために、人狼知能プロジェクトではライブラリが用意されています。
人狼知能プロジェクトでは、本来はプロトコル部門における簡易AIのジェネレータが用意されていましたが、現在はトラブルでサービスを停止しています。
自然言語部門
自然言語部門では、自然言語で「人狼知能プロトコル」で会話を行います。上手く会話ができれば、より人間に近いプレイができるのではないかと想定されています。
ゲーム内の役職
「5人ルール」と「15人ルール」が存在します。この中で役職が多い15人ルールの役職について説明します。
- 村人(Villager) 人間サイド。会話と投票ができる。基本8人。
- 人狼(Werewolf) 人狼サイド。村人のできることのほかに、「人狼同士の相談(whisper)」ができる。基本3人。
- 狩人(Bodyguard) 人間サイド。自分以外の誰かを襲撃から「防御(guard)」できる。基本1人。
- 占い師(Seener) 人間サイド。生存している特定の人物1人が人間か人狼か見抜く(divine)。基本1人。
- 霊媒師(Medium) 人間サイド。前のターンに襲撃された人物が人間か人狼かを知ることができる。基本1人。
- 狂人(Possessed) 人狼サイド。人間だが人狼の味方をする。占い師・霊媒師の診断では人間と判定される。基本1人。
Pythonのライブラリ「AIWolf」のインストール
さて、ゲームの流れに応じた行動と会話を実装するのは非常に大変です。Pythonでは2つライブラリがあり(先輩たちに感謝します)、今回と次回の記事では新しい「AIWolf」を紹介します。
「AIWolfPy」というのもあります。好みに合わせて使ってください。
インストールはpipで行います。
pip install git+https://github.com/AIWolfSharp/aiwolf-python.git
Javaの「人狼知能プラットフォーム」とサンプルAI
「人狼知能プラットフォーム」は、ここからダウンロードします。最新バージョンをダウンロードしてください。
自分はWindowsのWSL(Linux)の環境のため、以下のようにしてサーバーを起動させました。
このとき、ポートは10000を使います。
cd AIWolf-ver0.6.3
./StartServer.sh
この時、以下のようなGUIが出るため、Connect
ボタンを押します。
次に、サンプルAIをダウンロードします。aiwolfをインストールしたら、以下のリンクからgit clone
します。
git clone https://github.com/AIWolfSharp/sample-python-agent
次に、WSLを別のウィンドウで開き、以下のように並列で15個のクライアントを起動して接続します。
cd sample-python-agent
for i in `seq 1 15`
do
python start.py -h localhost -p 10000 -n name_you_like &
done
ここで、Start Game
を押すと、以下のようにゲームがスタートされて自動でゲームが進行します。サーバーの方のウィンドウではログが出力されます。
結果のログは、AIWolf-ver0.6.3/log
に格納されます。
自動で接続・起動を行う場合は、AutoStarter.ini
を編集して、AutoStarter.bat
やAutoStarter.sh
を使います。
次回予告
今回は、人狼知能プロジェクトの説明と、サンプルAIの動かし方について説明しました。
次回は、ライブラリ「AIWolf」の使い方について説明します。
当プロジェクトでは参加者を募集しております。コメントなどで感想よろしくお願いします。
Discussion