🐺

【人狼知能プロジェクト】AIで人狼を遊ぶ方法 ~基本編~

2023/01/22に公開

皆様こんにちは。33c33と申します。「人狼知能プロジェクト」では、Python・プロトコル部門で1人チームをやっております。この記事では、まずは「汝は人狼なりや?」(以下・人狼)というゲームでAIを作るプロジェクトについて紹介して、次にサーバーとサンプルAIの使い方について説明します。
この記事の続きとして、Pythonライブラリ「AIWolf」の仕様について説明することを予定しています。

人狼知能プロジェクトとは

「人狼」とは

人狼というゲームはご存じでしょうか?このゲームは複数人で行うトークゲームです。
簡単にルールを説明すると、

  • 進行役(ゲームマスター)と2つのチームのプレイヤーに分かれて遊ぶ
  • プレイヤーは「役職」によって所属するチームが変わる
  • 「毎夜、『人狼』が『人間』を1人襲撃する(ゲームから退場させる)」という設定で、人狼チーム・人間チームのうち最後に生存したチームが勝ち
  • プレイヤーは夜のパートが来るたびに『人狼』らしい人物を投票で追放する、人狼をすべて追放すれば『人間』の勝利
  • 『人狼』はすべての人間チームのプレイヤーを襲撃すれば勝利
  • 追放する人物は昼のパートの会話で決定する
    となっています。

このゲームを面白くしている理由は、「プレイヤーはお互いの役職を知らないため誰が敵かだれが味方かわからない」「昼の会話の内容でプレイヤーの個性がでる」ことでしょう。
また、プレイヤー同士の思っていることや投票対象は会話で決まることから、会話を制する者が
このゲームを制します。
場の操作が上手いプレイヤーなら勝利するだけでなく、勝敗以上に場を盛り上げること間違いないでしょう。

人狼知能プロジェクト内の「人狼」の説明

公式サイト
http://aiwolf.org/
ゲーム性含めての説明
https://www.jstage.jst.go.jp/article/jjsai/30/1/30_65/_article/-char/ja

人狼知能プロジェクトでは、プログラムで「人狼」をプレイする環境が整えられています。使用が想定されている言語はJava、C#、Pythonです。JavaのGUIで建てられたサーバーに接続して、各クライアントはそこにアクセスしてプレイする流れになります。サーバーから「このメソッドを実行しなさい」という命令が来て、各クライアントはその命令通りに行動することになります。(例として、「ゲームの開始の準備」ではinitialize()メソッドが呼ばれて、会話するときは順番が回ってきたときにtalk()メソッドが呼ばれます。)

人狼知能プロジェクトのチームには、プログラミング言語以外にも「プロトコル部門」「自然言語部門」が存在します。
どちらも「人狼知能プラットフォーム」でプログラムを実行します。

プロトコル部門

プロトコル部門では、プログラム同士の会話を以下のPDFに書かれた「人狼知能プロトコル」で行います。

http://aiwolf.org/control-panel/wp-content/uploads/2019/02/protocol_2019_3_6m.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」というのもあります。好みに合わせて使ってください。

https://github.com/AIWolfSharp/aiwolf-python

インストールはpipで行います。

pip install git+https://github.com/AIWolfSharp/aiwolf-python.git

Javaの「人狼知能プラットフォーム」とサンプルAI

「人狼知能プラットフォーム」は、ここからダウンロードします。最新バージョンをダウンロードしてください。

http://aiwolf.org/server

自分はWindowsのWSL(Linux)の環境のため、以下のようにしてサーバーを起動させました。
このとき、ポートは10000を使います。

cd AIWolf-ver0.6.3
./StartServer.sh

この時、以下のようなGUIが出るため、Connectボタンを押します。

AIWolf Server Starter

次に、サンプル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 

AIWolf Server Starter2

ここで、Start Gameを押すと、以下のようにゲームがスタートされて自動でゲームが進行します。サーバーの方のウィンドウではログが出力されます。
AIWolf Server Starter3

結果のログは、AIWolf-ver0.6.3/logに格納されます。

自動で接続・起動を行う場合は、AutoStarter.iniを編集して、AutoStarter.batAutoStarter.shを使います。

次回予告

今回は、人狼知能プロジェクトの説明と、サンプルAIの動かし方について説明しました。
次回は、ライブラリ「AIWolf」の使い方について説明します。

当プロジェクトでは参加者を募集しております。コメントなどで感想よろしくお願いします。

Discussion