Submit Search
Upload
人狼知能エージェント作成方法
•
Download as PPTX, PDF
•
3 likes
•
1,992 views
K
kengo009
Follow
How to make AIWolf agent
Read less
Read more
Science
Report
Share
Report
Share
1 of 69
Download now
Recommended
人狼知能セミナー資料20160507
人狼知能セミナー資料20160507
Fujio Toriumi
人狼知能セミナー資料20160427
人狼知能セミナー資料20160427
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能セミナー資料2017(案)0.4.5対応版
人狼知能セミナー資料2017(案)0.4.5対応版
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼エージェント作成講座
人狼エージェント作成講座
kengo009
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
Kosuke Shinoda
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
Kosuke Shinoda
Recommended
人狼知能セミナー資料20160507
人狼知能セミナー資料20160507
Fujio Toriumi
人狼知能セミナー資料20160427
人狼知能セミナー資料20160427
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能セミナー資料2017(案)0.4.5対応版
人狼知能セミナー資料2017(案)0.4.5対応版
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼エージェント作成講座
人狼エージェント作成講座
kengo009
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
Kosuke Shinoda
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
Kosuke Shinoda
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_ja
Takedaatsushi
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
David Buck
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
LINE Corporation
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Nishida Kansuke
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Masataka Motokurumada
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
furusin
Aiwolfseminar2020
Aiwolfseminar2020
Takedaatsushi
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
UnityTechnologiesJapan002
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
dcubeio
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMO GlobalSign Holdings K.K.
Google Play Game Servicesについて
Google Play Game Servicesについて
Kenzo Ishii
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorial
Ryo Shimizu
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Unity Technologies Japan K.K.
コルーチンを使おう
コルーチンを使おう
amusementcreators
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Tomoaki Shimizu
0621 ndk game
0621 ndk game
cat kaotaro
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
実践 NestJS
実践 NestJS
Ayumi Goto
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
Tatsuya Ishikawa
More Related Content
What's hot
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_ja
Takedaatsushi
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
David Buck
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
LINE Corporation
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Nishida Kansuke
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Masataka Motokurumada
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
furusin
What's hot
(9)
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_ja
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
Similar to 人狼知能エージェント作成方法
Aiwolfseminar2020
Aiwolfseminar2020
Takedaatsushi
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
UnityTechnologiesJapan002
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
dcubeio
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMO GlobalSign Holdings K.K.
Google Play Game Servicesについて
Google Play Game Servicesについて
Kenzo Ishii
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorial
Ryo Shimizu
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Unity Technologies Japan K.K.
コルーチンを使おう
コルーチンを使おう
amusementcreators
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Tomoaki Shimizu
0621 ndk game
0621 ndk game
cat kaotaro
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
実践 NestJS
実践 NestJS
Ayumi Goto
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
Tatsuya Ishikawa
社内勉強会 20120518
社内勉強会 20120518
yoshinori matsumoto
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Michio Koyama
Similar to 人狼知能エージェント作成方法
(16)
Aiwolfseminar2020
Aiwolfseminar2020
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
Play2 scalaを2年やって学んだこと
Play2 scalaを2年やって学んだこと
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
Google Play Game Servicesについて
Google Play Game Servicesについて
enchant.js meetup Tokyo vol.2 Tutorial
enchant.js meetup Tokyo vol.2 Tutorial
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
コルーチンを使おう
コルーチンを使おう
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
0621 ndk game
0621 ndk game
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
実践 NestJS
実践 NestJS
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
社内勉強会 20120518
社内勉強会 20120518
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
人狼知能エージェント作成方法
1.
人狼知能エージェント作成方法 東京大学工学系研究科システム創成学専攻 大橋・鳥海研究室
梶原健吾
2.
目次 • 自作Playerを用いた人狼の実行方法
– ビルド・パスの構成,実行の構成 • 実際にPlayerを実装 – 占い師を実装
3.
新規プロジェクトの作成 ファイル>新規>Javaプロジェクト
4.
新規プロジェクトの作成 • 適当なプロジェクト名を入力して完了(ここで
はMyAgent)
5.
ビルド・パスの構成 • プレイヤー作成に必要なjarファイルをビルド・
パスに追加 – http://www.aiwolf.org/から「資料>人狼知能 サーバ>aiwolf-ver0.1.13」をダウンロード – 中身は3つのjarファイル
6.
Jarファイルの概要 • aiwolf-client
– プレイヤーを作成する際に用いる • aiwolf-common – serverとclient両方で用いる • aiwolf-server – ゲームを実行する際に用いる
7.
新規フォルダーの作成 プロジェクトを右クリック>新規>フォルダー
8.
新規フォルダーの作成 • 適当なフォルダー名を入力して完了
9.
新規フォルダーの作成 • フォルダー内に3つのjarファイルをドラッグ&
ドロップ →これらのjarファイルをビルド・パスに追加
10.
ビルド・パスの構成 プロジェクトを右クリック>ビルド・パス>ビル ド・パスの構成
11.
ビルド・パスの構成 ライブラリー>Jar追加
12.
ビルド・パスの構成 フォルダー内に入れた3つのjarファイルを選択 して「OK」
13.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを
作成 2. 実行の構成を変更 3. 各役職のPlayerを作成 4. RoleAssignPlayerで各役職のPlayerをセット
14.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを
作成 2. 実行の構成を変更 3. 各役職のPlayerを作成 4. RoleAssignPlayerで各役職のPlayerをセット まず実行できる環境を整える
15.
新規パッケージ作成 MyAgent>srcを右クリック>新規>パッケージ
16.
新規パッケージ作成 • 適当なパッケージ名を入力して完了
17.
新規クラス作成 作成したパッケージを右クリック>新規>クラス
18.
新規クラス作成 スーパークラス>参照から ”AbstractRoleAssignPlayer”を選択
19.
新規クラス作成 • 適当なクラス名を入力して完了
20.
実行の構成 プロジェクトを右クリック>実行>実行の構成
21.
実行の構成 • メイン・クラス>検索から
“RoleRequestStarter”を選択
22.
実行の構成 引数>プログラムの引数に下記を入力 「-n
11 -c org.aiwolf.myAgent.MyRoleAssignPlayer SEER」 プレイヤー数パッケージ名クラス名希望役職
23.
実行の構成 10人のサンプルプレイヤーと自分のプレイヤー でゲームを行う状態(自分は占い師だと設定)
プレイ ヤー プレイ ヤー ・・・自分 プレイ ヤー サーバ
24.
実行結果 • 適用→実行を押すと実行結果が表示されて
ゲームが実行出来る状態に
25.
Playerの実装
26.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを
作成 2. 実行の構成を変更 3. 各役職のPlayerを作成 4. RoleAssignPlayerで各役職のPlayerをセット 例として占い師を作ってみよう
27.
新規クラスの作成 • MyRoleAssignPlayerの作成と同様に新規クラ
スを作成 – スーパークラスはAbstractSeerPlayerを選択
28.
MyRoleAssignPlayerを変更 • MyRoleAssignPlayerに次のようなコンストラク
タを追加 – 役職として占い師を振り分けられた時に MySeerPlayerを呼び出す – 他の役職の場合はデフォルトでサンプルプレイ ヤーが呼び出される public MyRoleAssignPlayer(){ setSeerPlayer(new MySeerPlayer()); }
29.
ゲーム実行 • もう一度ゲームを実行→エラーが出ればOK
• MySeerPlayerはまだ実装すべきメソッドを実 装していないからエラーが発生 実装すべきメソッドとは?
30.
Playerインターフェース Playerインターフェース内のAbstract Method
• getName() • update(GameInfo gameinfo) • initialize(GameInfo gameinfo) • dayStart() • talk() • whisper() • vote() • attack() • divine() • guard() • finish() ゲームの各タイミングでサーバがプレイヤーの これらのメソッドを呼び出す
31.
ゲームの流れ initialize(GameInfo) update(GameInfo)
dayStart() update(GameInfo) whisper()(人狼のみ) talk() vote() divine()(占い師のみ) attack()(人狼のみ) guard()(狩人のみ) update(GameInfo) finish() 会話終了 ゲーム終了 1日
32.
Playerインターフェース Playerインターフェース内のAbstract Method
• getName() • update(GameInfo gameinfo) • initialize(GameInfo gameinfo) • dayStart() • talk() • whisper() • vote() • attack() • divine() • guard() 全体,もしくは囁き• finish() で発話するメソッド 戻り値:String 上記6つのメソッドは適切な値を返さないとエラー発生 – 今は全部nullを返しているからエラー 対象プレイヤーを選択する メソッド 戻り値:Agent
33.
MySeerPlayerの実装 • MySeerPlayerが継承したAbstractSeerPlayer
– 占い師に必要ないメソッド(attack, guard等)を事 前に消してある – 毎朝,サーバから送られた占い結果をListに格納 する等の簡単な実装がしてある • talk, divine, vote を実装すればちゃんと動く
34.
実際に実装してみましょう
35.
戻り値を適切な値に変更 とりあえずエラーが出ないように 占い師はtalk()でString型を,vote()とdivine()でAgent型を返
せば良い ↓ talk()で空白文字を返す vote(),divine()で自分自身を返す
36.
@Override public Agent
divine() { return getMe(); } @Override public void finish() { } 戻り値を適切な値に変更 ←getMe()はAbstractPlayer内のメソッドで,自分 自身を返す @Override public String talk() { return ""; } @Override public Agent vote() { return getMe(); } これで実行は可能に.次はvote()をちゃんと実装してみる
37.
vote()の実装 実装例 –
生きているプレイヤーから自分を除いてランダム に投票してみる
38.
@Override public Agent
vote(){ //投票対象の候補者リスト List<Agent> voteCandidates = new ArrayList<Agent>(); //生きているプレイヤーを候補者リストに加える voteCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //自分自身と白判定のプレイヤーは候補から外す voteCandidates.remove(getMe()); return randomSelect(voteCandidates); } vote()の実装 ↑getLatestDayGameInfo()はAbstractPlayer内のメソッド で,最新のGameInfoを返す GameInfoはサーバから送られてくるゲーム内情報.ロ グや占い結果等の全ての情報はここから取得する 続く
39.
vote()の実装 /** *
引数のAgentのリストからランダムにAgentを選択する * @param agentList * @return */ private Agent randomSelect(List<Agent> agentList){ int num = new Random().nextInt(agentList.size()); return agentList.get(num); }
40.
vote()の実装(全体像) @Override public
Agent vote(){ //投票対象の候補者リスト List<Agent> voteCandidates = new ArrayList<Agent>(); //生きているプレイヤーを候補者リストに加える voteCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //自分自身と白判定のプレイヤーは候補から外す voteCandidates.remove(getMe()); return randomSelect(voteCandidates); } /** * 引数のAgentのリストからランダムにAgentを選択する * @param agentList * @return */ private Agent randomSelect(List<Agent> agentList){ int num = new Random().nextInt(agentList.size()); return agentList.get(num); } } 次はdivine()を実装してみよう
41.
divine()の実装 実装例 –
自分を除いて,まだ占っていないプレイヤーからラ ンダムに選択 ※既に死んでいるプレイヤーから選択しないように注意
42.
divine()の実装 @Override public
Agent divine() { //占い対象の候補者リスト List<Agent> divineCandidates = new ArrayList<Agent>(); //生きているプレイヤーを候補者リストに加える divineCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //自分自身と既に占ったことのあるプレイヤーは候補から外す divineCandidates.remove(getMe()); for(Judge judge: getMyJudgeList()){ if(divineCandidates.contains(judge.getTarget())){ divineCandidates.remove(judge.getTarget()); } } 続く
43.
divine()の実装 if(divineCandidates.size() >
0){ //候補者リストからランダムに選択 return randomSelect(divineCandidates); }else{ //候補者がいない場合は自分を占い return getMe(); } }
44.
divine()の実装(全体像) @Override public
Agent divine() { //占い対象の候補者リスト List<Agent> divineCandidates = new ArrayList<Agent>(); //生きているプレイヤーを候補者リストに加える divineCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //自分自身と既に占ったことのあるプレイヤーは候補から外す divineCandidates.remove(getMe()); for(Judge judge: getMyJudgeList()){ if(divineCandidates.contains(judge.getTarget())){ divineCandidates.remove(judge.getTarget()); } } if(divineCandidates.size() > 0){ //候補者リストからランダムに選択 return randomSelect(divineCandidates); }else{ //候補者がいない場合は自分を占い return getMe(); } } 次は占い結果を投票に反映させてみましょう
45.
vote()の実装2 実装例 –
占いで人狼を見つけていたらその中からランダム – 人狼を見つけていなければ,自分と白判定が出たプレイ ヤー以外からランダム – まだ占っていない場合は,自分以外からランダム ※既に死んでいるプレイヤーから選択しないように注意
46.
vote()の実装2 @Override public
Agent vote() { List<Agent> whiteAgent = new ArrayList<Agent>(), //白判定だったプレイヤー blackAgent = new ArrayList<Agent>(); //黒判定だったプレイヤー //今まで占ったプレイヤーをwhiteAgentとblackAgentに分ける for(Judge judge: getMyJudgeList()){ if(getLatestDayGameInfo().getAliveAgentList().contains(judge.getTarget())){ switch (judge.getResult()) { case HUMAN: whiteAgent.add(judge.getTarget());] break; case WEREWOLF: blackAgent.add(judge.getTarget()); } } } 続く
47.
vote()の実装2 if(blackAgent.size() >
0){ //blackAgentがいればその中から選択 return randomSelect(blackAgent); }else{ //投票対象の候補者リスト List<Agent> voteCandidates = new ArrayList<Agent>(); voteCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //生きているプレイヤーを候補者リストに加える //自分自身と白判定のプレイヤーは候補から外す voteCandidates.remove(getMe()); voteCandidates.removeAll(whiteAgent); return randomSelect(voteCandidates); } }
48.
vote()の実装2(全体像) @Override public
Agent vote() { List<Agent> whiteAgent = new ArrayList<Agent>(), //白判定だったプレイヤー blackAgent = new ArrayList<Agent>(); //黒判定だったプレイヤー for(Judge judge: getMyJudgeList()){ if(getLatestDayGameInfo().getAliveAgentList().contains(judge.getTarget())){ switch (judge.getResult()) { case HUMAN: whiteAgent.add(judge.getTarget());] break; case WEREWOLF: blackAgent.add(judge.getTarget()); } } } if(blackAgent.size() > 0){ return randomSelect(blackAgent); }else{ //投票対象の候補者リスト List<Agent> voteCandidates = new ArrayList<Agent>(); voteCandidates.addAll(getLatestDayGameInfo().getAliveAgentList()); //生きているプレイヤーを候補者リストに加える //自分自身と白判定のプレイヤーは候補から外す voteCandidates.remove(getMe()); voteCandidates.removeAll(whiteAgent); return randomSelect(voteCandidates); } } 次は占い結果を発話してみましょう
49.
talk, whisperでの発話 主な発話は
org.aiwolf.client.lib.TemplateTalkFactory(全体用) org.aiwolf.client.lib.TemplateWhisperFactory(囁き用) で簡単に作成可能
50.
TemplateTalkFactoryクラス • estimate(Agent,
Role) – Agentの役職はRoleだと思う • comingout(Agent, Role) – AgentがRoleをカミングアウトする • divined(Agent, Species) – Agentを占った結果Speciesだった • inquested(Agent, Species) – Agentの霊能結果がSpeciesだった • guarded(Agent) – Agentを守った • vote(Agent) – Agentに投票する • (dis)agree(TalkType, day, id) – 対象の発話に同意(反対)する • skip() – まだ今日話したいことがある • over() – もう今日は話すことない
51.
TemplateTalkFactoryの使用例 今日の占い結果を報告する発話を生成 //占いの情報の取得
Judge judge = getLatestDayGameInfo().getDivineResult(); //発話の作成 String talk = TemplateTalkFactory.divined(judge.getTarget(), judge.getResult());
52.
talk()の実装 実装例 –
占いで人狼を見つけたらカミングアウト – カミングアウトした後は占い結果を報告する – 話すことが無ければ”Over” (プレイヤーが全員Overを返せば会話のターンが終了)
53.
talk()の実装 //既に役職のカミングアウトをしているか boolean
isComingOut = false; @Override public String talk() { //占いで人狼を見つけたらカミングアウトする if(!isComingOut){ for(Judge judge: getMyJudgeList()){ if(judge.getResult() == Species.WEREWOLF){ //占い結果が人狼の場合 String comingoutTalk = TemplateTalkFactory.comingout(getMe(), getMyRole()); isComingOut = true; return comingoutTalk; } } } 続く
54.
talk()の実装 //カミングアウトした後は,まだ言っていない占い結果を順次報告 else{
for(Judge judge: getMyJudgeList()){ if(!myToldJudgeList.contains(judge)){ //まだ報告していないJudgeの場合 String resultTalk = TemplateTalkFactory.divined(judge.getTarget(), judge.getResult()); myToldJudgeList.add(judge); return resultTalk; } } } //話すことが無ければ会話終了 return Talk.OVER; }
55.
talk()の実装(全体像) //既に役職のカミングアウトをしているか boolean
isComingOut = false; @Override public String talk() { //占いで人狼を見つけたらカミングアウトする if(!isComingOut){ for(Judge judge: getMyJudgeList()){ if(judge.getResult() == Species.WEREWOLF){ //占い結果が人狼の場合 String comingoutTalk = TemplateTalkFactory.comingout(getMe(), getMyRole()); isComingOut = true; return comingoutTalk; } } } //カミングアウトした後は,まだ言っていない占い結果を順次報告 else{ for(Judge judge: getMyJudgeList()){ if(!myToldJudgeList.contains(judge)){ //まだ報告していないJudgeの場合 String resultTalk = TemplateTalkFactory.divined(judge.getTarget(), judge.getResult()); myToldJudgeList.add(judge); return resultTalk; } } } //話すことが無ければ会話終了 return Talk.OVER; } 次は他の人の発話を読み込んでみましょう
56.
ログの読み込み ログはGameInfo.getTalkList()でList<Talk>型として取得 Talkクラス内のメソッドは4つ
– getAgent():発話したAgentを取得 – getContent():発話内容(String)を取得 – getDay():発話日(int)を取得 – getIdx():その日の何番目の発話か(int)を取得
57.
ログの読み込み Talk.getContent()で得られるStringの中身は “DIVINED
Agent[04] HUMAN” のように人狼言語で記載 →Utteranceクラスでパース //コンストラクタに発話内容のStringを代入すると自動的にパースさ れる Utterance utterance = new Utterance(talk.getContent());
58.
Utteranceクラスの使い方 戻り値メソッド名と説明 String
getText() 発話内容をそのまま返す Topic getTopic() 発話のTopicを返す(COMINGOUTやDIVINED等) Agent getTarget() 発話内の目的語となるプレイヤーを返す(例えば”DIVINED Agent[01] HUMAN” → Agent[01]) Role getRole() 発話の目的語となる役職を返す(例えば”COMINGOUT Agent[02] SEER” → SEER) Species getResult() 占い(霊能)の結果を返す(例えば”INQUESTED Agent[03] WEREWOLF” → WEREWOLF) TalkType getTalkType() TopicがAGREE,DISAGREEの時,対象発話のTalkType(全体ログor囁き)を返す int getTalkDay() TopicがAGREE,DISAGREEの時,対象発話の発話日を返す int getTalkID() TopicがAGREE,DISAGREEの時,対象発話の発話IDを返す
59.
@Override public void
update(GameInfo gameInfo) { super.update(gameInfo); //今日のログを取得 List<Talk> talkList = gameInfo.getTalkList(); for(int i = 0; i < talkList.size(); i++){ Talk talk = talkList.get(i); //発話をパース Utterance utterance = new Utterance(talk.getContent()); //発話のトピックごとに処理 switch (utterance.getTopic()) { case COMINGOUT: //カミングアウトの発話の処理 break; case DIVINED: // 占い結果の発話の処理 break; } } } ログの読み込み このままだと,update()が呼ばれる度に,その日のログを全部読み込む → 一度読み込んだTalkは読まないように変更してみる
60.
ログの読み込み2 //その日のログの何番目まで読み込んだか int
readTalkNum = 0; @Override public void dayStart(){ super.dayStart(); readTalkNum = 0; } オレンジ部分:追加 赤部分:修正
61.
@Override public void
update(GameInfo gameInfo) { ログの読み込み2 super.update(gameInfo); //今日のログを取得 List<Talk> talkList = gameInfo.getTalkList(); for(int i = readTalkNum; i < talkList.size(); i++){ Talk talk = talkList.get(i); //発話をパース Utterance utterance = new Utterance(talk.getContent()); //発話のトピックごとに処理 switch (utterance.getTopic()) { case COMINGOUT: //カミングアウトの発話の処理 break; case DIVINED: // 占い結果の発話の処理 break; } readTalkNum++; } } オレンジ部分:追加 赤部分:修正
62.
ログの読み込み2(全体像) //その日のログの何番目まで読み込んだか int
readTalkNum = 0; @Override public void dayStart(){ super.dayStart(); readTalkNum = 0; } @Override public void update(GameInfo gameInfo) { super.update(gameInfo); //今日のログを取得 List<Talk> talkList = gameInfo.getTalkList(); for(int i = readTalkNum; i < talkList.size(); i++){ Talk talk = talkList.get(i); //発話をパース Utterance utterance = new Utterance(talk.getContent()); //発話のトピックごとに処理 switch (utterance.getTopic()) { case COMINGOUT: //カミングアウトの発話の処理 break; case DIVINED: // 占い結果の発話の処理 break; } readTalkNum++; } } オレンジ部分:追加 赤部分:修正 ←自分以外に占い師COしているプレイヤー を敵リストに追加してみましょう
63.
//偽占い師COしているプレイヤーのリスト List<Agent> fakeSeerCOAgent
= new ArrayList<Agent>(); @Override public void update(GameInfo gameInfo) { super.update(gameInfo); //今日のログを取得 List<Talk> talkList = gameInfo.getTalkList(); for(int i = readTalkNum; i < talkList.size(); i++){ Talk talk = talkList.get(i); //発話をパース Utterance utterance = new Utterance(talk.getContent()); //発話のトピックごとに処理 switch (utterance.getTopic()) { case COMINGOUT: //自分以外で占い師COしているプレイヤーの場合 if(utterance.getRole() == Role.SEER && !talk.getAgent().equals(getMe())){ fakeSeerCOAgent.add(utterance.getTarget()); } break; case DIVINED: // 占い結果の発話の処理 break; } readTalkNum++; } } オレンジ部分:追加 赤部分:修正 ログの読み込み3(全体像)
64.
65.
補足
66.
Playerの各メソッドの説明 • initialize(GameInfo)
– ゲーム開始時に一度だけ 呼ばれる – サーバから送られてくる GameInfoを取得 • update(GameInfo) – 各行動の前に呼ばれる – サーバから送られてくる GameInfoを取得 • dayStart() – 日の初めに呼ばれる • finish() – ゲームが終了した時に呼 ばれる
67.
Playerの各メソッドの説明 • vote()
1日の終わりに呼ばれるメソッド – 投票する相手を選択する • attack() – 襲撃する相手を選択する – 人狼のみ呼ばれる • divine() – 占いする相手を選択する – 占い師のみ呼ばれる • guard() – 護衛する相手を選択する – 狩人のみ呼ばれる Agentを返す必要あり
68.
Playerの各メソッドの説明 • talk()
発話のメソッド – 全体に対して発話する – 全員呼ばれるメソッド • whisper() – 人狼だけに対して発話す る – 人狼のプレイヤーだけが 使用するメソッド Stringを返す必要あり
69.
GameInfoの説明 戻り値メソッド名と説明 int
getDay() 日にちを返す Role getRole() 自分の役職を返す Agent getAgent() 自分(Agent型)を返す List<Agent> getAgentList() 全プレイヤーのリストを返す Species getMediumResult() 霊能結果を返す(霊能者のみ) Species getDivineResult() 占い結果を返す(占い師のみ) Agent getExecutedAgent() 処刑されたプレイヤーを返す Agent getAttackedAgent() 襲撃されたプレイヤーを返す List<Vote> getVoteList() 処刑の際の投票リストを返す List<Vote> getAttackVoteList() 襲撃の際の人狼による投票のリストを返す(人狼のみ) List<Talk> getTalkList() 会話のログを返す List<Talk> getWhisperList() 囁きのログを返す(人狼のみ) List<Agent> getHumanList() 人間のプレイヤーのリストを返す(ゲーム終了時のみ) List<Agent> getWolfList() 人狼のプレイヤーのリストを返す(ゲーム終了時のみ) List<Agent> getAliveAgentList() 生きているプレイヤーのリストを返す Map<Agent, Status> getStatusMap() 各プレイヤーの生死の状態を返す Map<Agent, Role> getRoleMap() 各プレイヤーの役職を返す(ゲーム終了時のみ)
Download now