Mais conteúdo relacionado
Semelhante a 人狼エージェント作成講座 (20)
人狼エージェント作成講座
- 2. エージェント作成フロー
1. 環境構築
– プロジェクトのダウンロード
– Jarファイルの導入
2. Playerクラスの実装
– BasePlayerの実装
– 各役職Playerの実装
- 3. エージェント作成フロー
1. 環境構築
– プロジェクトのダウンロード
– Jarファイルの導入
2. Playerクラスの実装
– BasePlayerの実装
– 各役職Playerの実装
- 5. Jarファイルの概要
• aiwolf-client
– エージェントを作成する際に用いる
• aiwolf-common
– サーバとクライアント両方で用いる
• aiwolf-server
– ゲームの進行を行うサーバ
– エージェント作成時に用いることは無い
- 8. エージェント作成フロー
1. 環境構築
– プロジェクトのダウンロード
– Jarファイルの導入
2. Playerクラスの実装
– BasePlayerの実装
– 各役職Playerの実装
- 9. Playerインターフェースの実装
• ゲーム実行に必要なクラス
→org.aiwolf.common.data.Playerを継承したクラス
• Playerインターフェース内のAbstract Method
• getName()
• vote()
• update(GameInfo gameinfo)
• attack()
• initialize(GameInfo gameinfo)
• divine()
• dayStart()
• guard()
• talk()
• finish()
• whisper()
- 13. ゲームの流れ
update(GameInfo)
initialize()
update(GameInfo)
dayStart()
update(GameInfo)
whisper()(人狼のみ)
talk()
vote()
divine()(占い師のみ)
attack()(人狼のみ)
guard()(狩人のみ)
update(GameInfo)
finish()
会話終了
ゲーム終了
- 21. RoleBasePlayerの継承
↓コピペ用
import org.aiwolf.client.base.player.RoleBasePlayer;
import org.aiwolf.common.net.GameInfo;
public class SamplePlayer extends RoleBasePlayer{
public SamplePlayer(){
//各役職で用いるプレイヤークラスをセットする
setVillagerPlayer(new SampleVillagerPlayer());
setSeerPlayer(new SampleSeerPlayer());
//setしていない役職はサンプルエージェントが自動的に割り振られる
}
@Override
public void initialize(GameInfo gameinfo) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public String getName() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
}
- 22. 各役職プレイヤーの作成
• org.aiwolf.client.base.player.AbstractVillagerPlayer
– 村人に必要ないメソッド(attackやdivine等)は実装
しないで良い様にした抽象クラス
– これを継承すると少し楽
↓コピペ用
package com.aaa;
import org.aiwolf.client.base.player.AbstractVillagerPlayer;
import org.aiwolf.common.data.Agent;
import org.aiwolf.common.net.GameInfo;
public class SampleVillagerPlayer extends AbstractVillagerPlayer{
@Override
public void initialize(GameInfo gameinfo) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void dayStart() {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void finish() {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public String talk() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
@Override
public Agent vote() {
// TODO 自動生成されたメソッド・スタブ
return null;
}
}
- 23. update(GameInfo)の実装
• 各行動の前に呼ばれる
• 会話ログの読み込み等をすべき
↓例
//会話のログを取得
List<Talk> talks = gameInfo.getTalkList();
//各トークについて処理
for(Talk talk: talks){
Protocol protocol = new Protocol(talk.getContent());
List<Utterance> utterances = protocol.getUtterances();
//トーク内の各内容について処理
for(Utterance utterance: utterances){
Passage passage = utterance.getPassage();
//発話内容がカミングアウトの時
if(passage.getCategory() == Category.COMINGOUT){
//カミングアウトしたエージェントを取得
Agent comingoutAgent = passage.getSubject();
//カミングアウトした役職を取得
Role comingoutRole = passage.getObject();
}
}
}
- 25. talk()の実装
• 発話を行う時に呼ばれる
• 返り値はString型だが,人狼プロトコルで
• 人狼プロトコルは,
org.aiwolf.client.lib.TemplateTalkFactoryで簡
単に表現可能
- 26. TemplateTalkFactoryクラス
• estimate(Agent, Role)
– Agentの役職はRoleだと思う
• comingout(Agent, Role)
– AgentがRoleをカミングアウトする
• inspected(Agent, Species)
– Agentを占った結果Speciesだった
• medium_telled(Agent, Species)
– Agentの霊能結果がSpeciesだった
• guarded(Agent)
– Agentを守った
• skip()
– まだ今日話したいことがある
• over()
– もう今日は話すことない
- 27. talk()の例
Judge judge = getLatestDayGameInfo().getDivineResult();
Utterance utterance = TemplateTalkFactory.inspected(judge.getTarget(),
judge.getResult());
Protocol protocol = new Protocol(utterance);
return protocol.getText();