今回は,他のエージェントの発話の処理の仕方と,発言の仕方について.
なお,人狼サーバのバージョンは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();
}
初めまして。
返信削除こちらのブログを参考にしたのですが私が未熟なためか複数エラーが発生し上手く実行できませんでした。(CentOS6.5、Eclipse3.6、人狼サーバaiwolf-ver0.1.9で実行)
もしよろしければソースコードを公開してもらないでしょうか?
どのようなエラーが出ているのか不明なのでなんとも言えませんが,
削除おそらく必要なメソッド(voteメソッドなど)でnullを返していることが原因ではないでしょうか.
新しく第2回も投稿しましたので,そちらもご参照ください.