今回は,他のエージェントの発話の処理の仕方と,発言の仕方について.
なお,人狼サーバのバージョンは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() + " と発言");
}
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() + "が占い師カミングアウト");
}
}
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.comingout(info.getAgent(), Role.SEER);
TemplateTalkFactory.skip();
TemplateTalkFactory.over();
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();
}
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();
}