2014年9月21日日曜日

人狼知能作成tips 第1回 発話の処理と発言のやり方

人狼知能エージェントを作る際に役立つことを書いていく.
今回は,他のエージェントの発話の処理の仕方と,発言の仕方について.
なお,人狼サーバのバージョンは0.1.9を使用している.



発話の処理のやり方

プレイヤーの発話のリストは,GameInfoクラスのgetTalkListメソッドで取得できる.
なので,何番のエージェントがどんな発言をしたかということは,以下のコードで取得できる.


GameInfo info = this.getLatestDayGameInfo();
List<Talk> talkList = info.getTalkList();

for(Talk t : talkList){
  System.out.println(t.getAgent().getAgentIdx() + " 番が " + t.getContent() + " と発言");
}

上のコードのように,getContent()を使用すれば発話の内容が取得できるが,ただの文字列なので,このままでは使いづらい.
人狼知能作成キットには,人狼言語パーサとしてUtteranceクラスが用意されているので,これを使う.

ここで,Utteranceクラスを使って占い師COをしたエージェントを取得してみる.

GameInfo info = this.getLatestDayGameInfo();
List<Talk> talkList = info.getTalkList();

for(Talk t : talkList){
Utterance u = new Utterance(t.getContent());
if(u.getTopic() == Topic.COMINGOUT && u.getRole() == Role.SEER){
System.out.println(t.getAgent().getAgentIdx() + "が占い師カミングアウト");
}
}


発言のやり方

次に自分のエージェントに発言をさせてみる.
こちらでは人狼言語を簡単に生成できるTemplateTalkFactoryクラスが用意されているのでこれを使う.

自分が占い師COをする人狼言語を作成するためには,以下のようにすればいい.

GameInfo info = this.getLatestDayGameInfo();
TemplateTalkFactory.comingout(info.getAgent(), Role.SEER);
また,発言はせず,様子見をする場合に使うSKIPや,話すことが無くなったことを明示するOVERなども同様に生成できる.

TemplateTalkFactory.skip();
TemplateTalkFactory.over();


まとめ

最後に,他のプレイヤーが占い師COしてきた際に,対抗COするtalkメソッドを書いてみる.

@Override
public String talk() {
GameInfo info = this.getLatestDayGameInfo();
List<Talk> talkList = info.getTalkList();

for(Talk t : talkList){
Utterance u = new Utterance(t.getContent());
if(u.getTopic() == Topic.COMINGOUT && u.getRole() == Role.SEER){
//対抗占い師CO
return TemplateTalkFactory.comingout(info.getAgent(), Role.SEER);
}
}

//占い師COがない場合はSKIP
return TemplateTalkFactory.skip();
}