Submit Search
Upload
人狼知能セミナー資料2017(案)0.4.5対応版
•
Download as PPTX, PDF
•
1 like
•
4,299 views
Fujio Toriumi
Follow
人狼知能セミナーに利用する予定の資料です. 予告なく変更される可能性があります.
Read less
Read more
Software
Report
Share
Report
Share
1 of 91
Download now
Recommended
人狼知能セミナー資料20160427
人狼知能セミナー資料20160427
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能セミナー資料20160507
人狼知能セミナー資料20160507
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼エージェント作成講座
人狼エージェント作成講座
kengo009
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
Kosuke Shinoda
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
Kosuke Shinoda
Recommended
人狼知能セミナー資料20160427
人狼知能セミナー資料20160427
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能セミナー資料20160507
人狼知能セミナー資料20160507
Fujio Toriumi
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼知能エージェント作成方法
人狼知能エージェント作成方法
kengo009
人狼エージェント作成講座
人狼エージェント作成講座
kengo009
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
Kosuke Shinoda
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
Kosuke Shinoda
Aiwolfseminar2020
Aiwolfseminar2020
Takedaatsushi
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
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
furusin
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
Jetpack datastore入門
Jetpack datastore入門
furusin
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Unity Technologies Japan K.K.
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Nishida Kansuke
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Masataka Motokurumada
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Fujishiro Takuya
人狼知能プロジェクト・プロトコル解説
人狼知能プロジェクト・プロトコル解説
Hirotaka Osawa
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
Fujio Toriumi
ネットコミュニケーションにおけるリスク分析
ネットコミュニケーションにおけるリスク分析
Fujio Toriumi
人狼知能コンテストとは何か
人狼知能コンテストとは何か
Fujio Toriumi
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
Fujio Toriumi
徳納的シビックテック
徳納的シビックテック
Hirokazu Tokuno
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったこと
Satoshi KOBAYASHI
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMO GlobalSign Holdings K.K.
0621 ndk game
0621 ndk game
cat kaotaro
More Related Content
What's hot
Aiwolfseminar2020
Aiwolfseminar2020
Takedaatsushi
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
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
furusin
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
Jetpack datastore入門
Jetpack datastore入門
furusin
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Unity Technologies Japan K.K.
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Nishida Kansuke
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Masataka Motokurumada
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Fujishiro Takuya
What's hot
(13)
Aiwolfseminar2020
Aiwolfseminar2020
Aiwolf seminar 2019_ja
Aiwolf seminar 2019_ja
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
Paging Libraryの利用をやめたいお気持ち表明
Paging Libraryの利用をやめたいお気持ち表明
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Jetpack datastore入門
Jetpack datastore入門
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Viewers also liked
人狼知能プロジェクト・プロトコル解説
人狼知能プロジェクト・プロトコル解説
Hirotaka Osawa
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
Fujio Toriumi
ネットコミュニケーションにおけるリスク分析
ネットコミュニケーションにおけるリスク分析
Fujio Toriumi
人狼知能コンテストとは何か
人狼知能コンテストとは何か
Fujio Toriumi
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
Fujio Toriumi
徳納的シビックテック
徳納的シビックテック
Hirokazu Tokuno
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったこと
Satoshi KOBAYASHI
Viewers also liked
(7)
人狼知能プロジェクト・プロトコル解説
人狼知能プロジェクト・プロトコル解説
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
脱初心者!経験は人狼力を向上させるのか?~データから見るベテランの実力~
ネットコミュニケーションにおけるリスク分析
ネットコミュニケーションにおけるリスク分析
人狼知能コンテストとは何か
人狼知能コンテストとは何か
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
人工知能は人狼の夢を見るか~人狼知能セミナー20141119
徳納的シビックテック
徳納的シビックテック
アルゴリズム取引のシステムを開発・運用してみて分かったこと
アルゴリズム取引のシステムを開発・運用してみて分かったこと
Similar to 人狼知能セミナー資料2017(案)0.4.5対応版
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMO GlobalSign Holdings K.K.
0621 ndk game
0621 ndk game
cat kaotaro
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
GMO GlobalSign Holdings K.K.
Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門
Yasunobu Ikeda
HoloLensハンズオン(ショート)
HoloLensハンズオン(ショート)
Kaoru NAKAMURA
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
Mori Shingo
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
Masamitsu Maehara
日本Androidの会のハンズオンセミナー資料(20130315)
日本Androidの会のハンズオンセミナー資料(20130315)
eijikushida
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
Naruto TAKAHASHI
How to django at first
How to django at first
Maito Kuwahara
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
Katsushi Suzuki
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Tomoaki Shimizu
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
Michio Koyama
視聴者参加型のライブ動画を実現!GenvidをUE4に実装する方法 | UNREAL FEST EXTREME 2020 WINTER
視聴者参加型のライブ動画を実現!GenvidをUE4に実装する方法 | UNREAL FEST EXTREME 2020 WINTER
エピック・ゲームズ・ジャパン Epic Games Japan
Titanium勉強会
Titanium勉強会
洋平 前田
OpenShiftでJBoss EAP構築
OpenShiftでJBoss EAP構築
Daein Park
QGISセミナー初級・実践編(V2.4)
QGISセミナー初級・実践編(V2.4)
IWASAKI NOBUSUKE
QGISセミナー初級編 ~QGISの使い方・実践編~ Ver. 2.4版
QGISセミナー初級編 ~QGISの使い方・実践編~ Ver. 2.4版
FOSS4G_MEXT
Sohu邮箱的python经验
Sohu邮箱的python经验
Ryan Poy
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
Similar to 人狼知能セミナー資料2017(案)0.4.5対応版
(20)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
0621 ndk game
0621 ndk game
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】
Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門
HoloLensハンズオン(ショート)
HoloLensハンズオン(ショート)
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
日本Androidの会のハンズオンセミナー資料(20130315)
日本Androidの会のハンズオンセミナー資料(20130315)
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
How to django at first
How to django at first
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
視聴者参加型のライブ動画を実現!GenvidをUE4に実装する方法 | UNREAL FEST EXTREME 2020 WINTER
視聴者参加型のライブ動画を実現!GenvidをUE4に実装する方法 | UNREAL FEST EXTREME 2020 WINTER
Titanium勉強会
Titanium勉強会
OpenShiftでJBoss EAP構築
OpenShiftでJBoss EAP構築
QGISセミナー初級・実践編(V2.4)
QGISセミナー初級・実践編(V2.4)
QGISセミナー初級編 ~QGISの使い方・実践編~ Ver. 2.4版
QGISセミナー初級編 ~QGISの使い方・実践編~ Ver. 2.4版
Sohu邮箱的python经验
Sohu邮箱的python经验
emc++ chapter32
emc++ chapter32
More from Fujio Toriumi
新しい言論空間がもたらす社会的リスクとその解決~計算社会科学による情報的健康の実現~
新しい言論空間がもたらす社会的リスクとその解決~計算社会科学による情報的健康の実現~
Fujio Toriumi
「計算社会科学入門」5章 ネットワーク
「計算社会科学入門」5章 ネットワーク
Fujio Toriumi
ソーシャルデータからどこまで社会を見られるか
ソーシャルデータからどこまで社会を見られるか
Fujio Toriumi
計算社会科学におけるWebマイニング
計算社会科学におけるWebマイニング
Fujio Toriumi
AI Wolf Contest -Development of Game AI using Collective Intelligence-
AI Wolf Contest -Development of Game AI using Collective Intelligence-
Fujio Toriumi
Yet Another ShortShort AI
Yet Another ShortShort AI
Fujio Toriumi
金融情報における時系列分析
金融情報における時系列分析
Fujio Toriumi
SNS とゲーム理論~人はなぜ投稿するのか?~
SNS とゲーム理論~人はなぜ投稿するのか?~
Fujio Toriumi
「人工知能」の表紙に関するTweetの分析・続報
「人工知能」の表紙に関するTweetの分析・続報
Fujio Toriumi
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
Fujio Toriumi
More from Fujio Toriumi
(10)
新しい言論空間がもたらす社会的リスクとその解決~計算社会科学による情報的健康の実現~
新しい言論空間がもたらす社会的リスクとその解決~計算社会科学による情報的健康の実現~
「計算社会科学入門」5章 ネットワーク
「計算社会科学入門」5章 ネットワーク
ソーシャルデータからどこまで社会を見られるか
ソーシャルデータからどこまで社会を見られるか
計算社会科学におけるWebマイニング
計算社会科学におけるWebマイニング
AI Wolf Contest -Development of Game AI using Collective Intelligence-
AI Wolf Contest -Development of Game AI using Collective Intelligence-
Yet Another ShortShort AI
Yet Another ShortShort AI
金融情報における時系列分析
金融情報における時系列分析
SNS とゲーム理論~人はなぜ投稿するのか?~
SNS とゲーム理論~人はなぜ投稿するのか?~
「人工知能」の表紙に関するTweetの分析・続報
「人工知能」の表紙に関するTweetの分析・続報
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
人工知能は人狼の夢を見るか-日本デジタルゲーム学会年次大会2013@函館
人狼知能セミナー資料2017(案)0.4.5対応版
1.
人狼知能エージェント作成方法
2.
目次 • 自作プレイヤーを用いた人狼の実行方法 – プロジェクトの作成 –
ビルド・パスの構成 – Javadocを参照 – 自作プレイヤーでゲーム実行 • 実際にPlayerを実装 – 占い師を実装
3.
プロジェクトの作成(1) ファイル>新規>Javaプロジェクト
4.
プロジェクトの作成(2) 適当なプロジェクト名 (ここではDemoAgent) を入力して[完了]
5.
ビルド・パスの構成(1) 人狼知能プラットフォームのダウンロード • http://www.aiwolf.org/ から 開発関連>人狼知能プラットフォーム とたどり aiwolf-ver0.4.5.zip
と aiwolf-docs-ver0.4.5.zip をダウンロード • aiwolf-ver0.4.5.zipを解凍すると AIWolf-ver0.4.5フォルダーができる
6.
ビルド・パスの構成(2) AIWolf-ver0.4.5フォルダーの中身 • 5つのJARファイル このうち開発に使用するのは以下の2つ aiwolf-client.jar ,
aiwolf-common.jar • 4つのシェルスクリプトファイル(*.sh) • 4つのバッチファイル(*.bat) • 2つのAutoStarter用設定ファイル (AutoStarter.ini, SampleSetting.cfg)
7.
ビルド・パスの構成(3) 開発に使うJARファイルの概要 • aiwolf-client.jar プレイヤーを作成する際に用いる • aiwolf-common.jar プレイヤー作成とゲーム実行の両方で用いる
8.
ビルド・パスの構成(4) 他のファイルはゲームを実行するために使用 • StartServer ゲームサーバーをGUIで起動させる • StartClient サーバーに接続するクライアントを起動 •
StartGUIClient サーバーに接続するクライアントをGUIで起動 • AutoStarter 設定ファイル(AutoStarter.iniと SampleSetting.cfg)の通りにゲームを実行
9.
ビルド・パスの構成(5) プロジェクトを右クリック>新規>フォルダー
10.
ビルド・パスの構成(6) フォルダー名(ここではlib)を入力して[完了]
11.
ビルド・パスの構成(7) 1. 作成したフォルダーに aiwolf-client.jar, aiwolf-common.jar をドラッグ&ドロップでコピー 2.
これらのjarファイルを,以下に述べる方法で ビルド・パスに追加
12.
ビルド・パスの構成(8) プロジェクトを右クリック>ビルド・パス>ビル ド・パスの構成
13.
ビルド・パスの構成(9) ライブラリー>JARの追加
14.
ビルド・パスの構成(10) フォルダー内に入れた2つのjarファイルを選択 して[OK]
15.
Javadocの参照(1) aiwolf-client.jar>Javadoc>編集
16.
Javadocの参照(2) アーカイブ内のJavadoc>外部ファイル>アーカ イブ・パス>参照
17.
Javadocの参照(3) ダウンロードしたaiwolf-docs-ver0.4.5.zipを, アーカイブ内のパスにはdocsを指定し[検証]
18.
Javadocの参照(4) • ロケーションが有効であることが確認できたら [OK] • aiwolf-common.jarも同様にJavadocを参照
19.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを 作成 2. ゲーム実行の準備 3.
各役職のPlayerを作成 4. RoleAssignPlayerに各役職のPlayerをセット
20.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを 作成 2. ゲーム実行の準備 3.
各役職のPlayerを作成 4. RoleAssignPlayerで各役職のPlayerをセット まず実行できる環境を整える
21.
新規パッケージ作成(1) DemoAgent>srcを右クリック>新規>パッケージ
22.
新規パッケージ作成(2) パッケージ名を入力して[完了] パッケージ名は自分のアドレスを逆から入力 例) demo@aiwolf.org →
org.aiwolf.demo
23.
新規クラス作成(1) 作成したパッケージを右クリック>新規>クラス
24.
新規クラス作成(2) スーパークラス>参照から org.aiwolf.sample.libのAbstractRoleAssignPlayerを選択 ※org.aiwolf.client.base.playerの方は 非推奨なのでNG
25.
新規クラス作成(3) クラス名(ここではDemoRoleAssignPlayer)を 入力して[完了] これだけでサンプル プレイヤーと同等の プレイヤーが完成
26.
JARファイル作成方法(1) プロジェクトを右クリック>エクスポート
27.
JARファイル作成方法(2) JAVA>JARファイル を選択して次へ
28.
JARファイル作成方法(3) • エクスポート先はAIWolf-ver0.4.5フォルダー • JARファイルの名前はdemoAgent.jarとする
29.
実行の構成 1つのサーバに複数のクライアント(人狼知能) プログラムを接続し,ゲームを実行 サンプ ル サンプ ル サンプ ル 自分 ・・・ サーバ
30.
設定ファイルの記述 • AutoStarter.iniのSample1とSample2の行末にある役 職指定(WEREWOLFとSEER)を削除 • AutoStarter.iniのSample5から始まる行をコメントアウ ト(行頭に#を挿入) •
AutoStarter.iniの末尾に以下の行を追加 [任意の名前(下の例ではDemo)],[パッケージ名].[クラス名] サンプル4体と 自分のエージェント1体で ゲームを行う設定 lib=./ log=./log/ port=10000 game=10 view=true setting=./SampleSetting.cfg #agent=5 Sample1,org.aiwolf.sample.player.SampleRoleAssignPlayer Sample2,org.aiwolf.sample.player.SampleRoleAssignPlayer Sample3,org.aiwolf.sample.player.SampleRoleAssignPlayer Sample4,org.aiwolf.sample.player.SampleRoleAssignPlayer #Sample5,org.aiwolf.sample.player.SampleRoleAssignPlayer Demo,org.aiwolf.demo.DemoRoleAssignPlayer
31.
ゲームの実行 • Windowsの場合 :AutoStarter.batを実行 •
Mac/Linuxの場合 : AutoStarter.shを実行 作成したDemoが ゲームに参加中
32.
Playerの実装
33.
自作プレイヤーでゲーム実行 1. AbstractRoleAssignPlayerを継承したクラスを 作成 2. ゲーム実行の準備 3.
各役職のPlayerを作成 4. RoleAssignPlayerで各役職のPlayerをセット 例として占い師を作ってみましょう
34.
占い師用の新規クラスの作成 • RoleAssignPlayerの作成と同様に新規クラスを 作成(例えばDemoSeer) • スーパークラスは org.aiwolf.sample.lib のAbstractSeer
35.
RoleAssignPlayerを変更 • RoleAssignPlayerに次のコンストラクタを追加 (DemoRoleAssignPlayerの場合) – 役職として占い師を振り分けられた時に DemoSeerを呼び出す –
他の役職の場合はデフォルトでサンプルプレイ ヤーが呼び出される public DemoRoleAssignPlayer(){ setSeerPlayer(new DemoSeer()); }
36.
ゲーム実行 • もう一度JARをエクスポートし,AutoStarterを 実行して動けばOK • DemoSeerはまだ実装すべきメソッドを実装し ていないから何もしない 実装すべきメソッドとは?
37.
Playerインターフェース Playerインターフェース内で定義されるメソッド • ゲームの各タイミングでサーバがプレイヤーのこれ らのメソッドを呼び出す • updateはinitialize以外のメソッドの直前に呼ばれる
initialize(GameInfo, GameSetting) update(GameInfo) getName() dayStart() talk() whisper() vote() attack() divine() guard() finish()
38.
ゲームの流れ initialize 夜のフェーズ divine(占い師のみ) whisper(人狼のみ) guard(狩人のみ) attack(人狼のみ) 昼のフェーズ talk vote finish 1日 dayStart ゲーム終了? 初日? whisper(人狼のみ) divine(占い師のみ) YES NO NO YES 夜のフェーズではvoteによる追放結果を利用可能
39.
各メソッドの戻り値 • void • String •
Agent(対象プレイヤーを選択するメソッド) initialize(GameInfo, GameSetting) update(GameInfo) dayStart() finish() vote() attack() divine() guard() getName() talk() whisper()
40.
Seerの実装 • Seer(DemoSeer)が継承したAbstractSeer – 占い師に必要ないattack(),
guard(), whisper()は 継承されず,万一呼ばれた場合は例外を投げる • それ以外のメソッドを実装する
41.
実際に実装してみましょう
42.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
43.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
44.
フィールドの定義 /** 自分 */ Agent
me; /** 最新のGameInfo */ GameInfo currentGameInfo; /** 未報告の占い結果が入る待ち行列 */ Deque<Judge> myDivinationQueue = new LinkedList<>(); /** 白(人間)リスト */ List<Agent> whiteList = new ArrayList<>(); /** 黒(人狼)リスト */ List<Agent> blackList = new ArrayList<>(); /** 灰色(未確定)リスト */ List<Agent> grayList; /** カミングアウト済みか */ boolean isCO = false;
45.
ユーティリティメソッドの定義 /** エージェントが生きているかどうかを返す */ boolean
isAlive(Agent agent) { return currentGameInfo.getAliveAgentList().contains(agent); } /** リストからランダムに選んで返す */ <T> T randomSelect(List<T> list) { if (list.isEmpty()) { return null; } else { return list.get((int) (Math.random() * list.size())); } }
46.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
47.
getName(), update()の実装 public String
getName() { return "DemoSeer"; } public void update(GameInfo gameInfo) { // currentGameInfoをアップデート currentGameInfo = gameInfo; }
48.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
49.
initialize()の実装 public void initialize(GameInfo
gameInfo, GameSetting gameSetting) { // フィールドの初期化 me = gameInfo.getAgent(); grayList = new ArrayList<>(gameInfo.getAgentList()); grayList.remove(me); whiteList.clear(); blackList.clear(); myDivinationQueue.clear(); } 前ゲームの情報が残ったままにならないように フィールドを初期化しておく
50.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
51.
dayStart()の実装 public void dayStart()
{ // 占い結果の取り込み Judge divination = currentGameInfo.getDivineResult(); if (divination != null) { myDivinationQueue.offer(divination); Agent target = divination.getTarget(); Species result = divination.getResult(); // 灰色リスト・白リスト・黒リストのアップデート grayList.remove(target); if (result == Species.HUMAN) { whiteList.add(target); } else { blackList.add(target); } } } 待ち行列の最後に要素を追加
52.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
53.
vote()の実装 1. 生きている人狼の中からランダムに投票 2. 生きている人狼がいなければ,生きている 灰色のプレイヤーからランダムに投票 3.
上記2項に該当するプレイヤーがいない場 合は自分以外の生きているプレイヤーから ランダムに投票(生存者全員白の場合なの であり得ない状況ではあるが・・・)
54.
vote()の実装 public Agent vote()
{ // 候補者リスト List<Agent> candidates = new ArrayList<>(); // 生きている人狼を候補者リストに加える for (Agent agent : blackList) { if (isAlive(agent)) { candidates.add(agent); } } // 候補者がいない場合は生きている灰色のプレイヤーを候補者リストに加える if (candidates.isEmpty()) { for (Agent agent : grayList) { if (isAlive(agent)) { candidates.add(agent); } } } 続く
55.
vote()の実装 // 候補者がいない場合はnullを返す(自分以外の生存プレイヤーからランダム) if (candidates.isEmpty())
{ return null; } // 候補者リストからランダムに投票先を選ぶ return randomSelect(candidates); }
56.
vote()の実装(全体像) public Agent vote()
{ // 候補者リスト List<Agent> candidates = new ArrayList<>(); // 生きている人狼を候補者リストに加える for (Agent agent : blackList) { if (isAlive(agent)) { candidates.add(agent); } } // 候補者がいない場合は生きている灰色のプレイヤーを候補者リストに加える if (candidates.isEmpty()) { for (Agent agent : grayList) { if (isAlive(agent)) { candidates.add(agent); } } } // 候補者がいない場合はnullを返す(自分以外の生存プレイヤーからランダム) if (candidates.isEmpty()) { return null; } // 候補者リストからランダムに投票先を選ぶ return randomSelect(candidates); } 次はdivine()を実装してみましょう
57.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
58.
divine()の実装 まだ占っていない自分以外の生存プレイヤー からランダムに選択
59.
divine()の実装 public Agent divine()
{ // 候補者リスト List<Agent> candidates = new ArrayList<>(); // 生きている灰色のプレイヤーを候補者リストに加える for (Agent agent : grayList) { if (isAlive(agent)) { candidates.add(agent); } } // 候補者がいない場合は誰も占わない if (candidates.isEmpty()) { return null; } // 候補者リストからランダムに占う return randomSelect(candidates); } 次は占い結果を発話してみましょう
60.
実装の流れ 1. フィールド・ユーティリティメソッドの定義 2. getName,
updateの実装 3. initializeの実装 4. dayStartの実装 5. voteの実装:占い結果を考慮して投票 6. divineの実装:ランダムに占う 7. talkの実装:カミングアウト,占い結果の報告
61.
talk, whisperでの発話 org.aiwolf.client.lib.Contentクラスと org.aiwolf.client.lib.ContentBuilderのサブクラスで生成 以下の手順で得られるtextが発話テキストとなる ContentBuilder builder
= 発話の種類に応じたContentBuilder; Content content = new Content(builder); String text = content.getText();
62.
各種ContentBuilderクラス(1) 1. EstimateContentBuilder(target, role):
targetの役職はroleだと思う 2. ComingoutContentBuilder (target, role) : targetの役職はroleだ 3. DivinationContentBuilder(target) : targetを占う 4. DivinedResultContentBuilder(target, result) : targetを占った結果result だった 5. IdentContentBuilder(target, result) : targetは霊媒の結果resultだった 6. GuardCandidateContentBuilder(target) : targetを護衛する 7. GuardedAgentContentBuilder(target) : targetを護衛した 8. VoteContentBuilder(target) : targetに投票する 9. AttackContentBuilder(target) : targetに襲撃投票する 10. AgreeContentBuilder(talkType, talkDay, talkID) : talkDay日目,種類 talkType,talkID番目の発話に同意する
63.
各種ContentBuilderクラス(2) 11. DisagreeContentBuilder(talkType, talkDay,
talkID) : talkDay日目,種類 talkType,talkID番目の発話に反対する 12. RequestContentBuilder(agent, content) : agentにcontentを要求する 13. OverContentBuilder() : もう話すことはない 以下で定義される定数Content.OVERが用意されている OVER = new Content(new OverContentBuilder()); 14. SkipContentBuilder() : 様子を見る 以下で定義される定数Content.SKIPが用意されている SKIP = new Content(new SkipContentBuilder()); 詳細は,aiwolf-ver0.4.4.zip(1つ前のリリース)内の 「 0.4.4での発話生成の方法(修正版2).pdf」を参照
64.
発話生成の例 //占いの情報の取得 Judge judge =
getLatestDayGameInfo().getDivineResult(); //発話の作成 ContentBuilder builder = new DivinedResultContentBuilder(judge.getTarget(), judge.getResult(); String talk = new Content(builder).getText(); 今日の占い結果を報告する発話を生成
65.
talk()の実装 1. 占いで人狼を見つけたらカミングアウト 2. カミングアウトした後は占い結果を報告する
66.
talk()の実装 public String talk()
{ // 占いで人狼を見つけたらカミングアウトする if (!isCO) { if (!myDivinationQueue.isEmpty() && myDivinationQueue.peek().getResult() == Species.WEREWOLF) { isCO = true; ContentBuilder builder = new ComingoutContentBuilder(me, Role.SEER) return new Content(builder).getText(); } } 続く待ち行列の先頭の要素を取り出さずに取得
67.
talk()の実装 // カミングアウトした後は、まだ報告していない占い結果を順次報告 else { if
(!myDivinationQueue.isEmpty()) { Judge divination = myDivinationQueue.poll(); ContentBuilder builder = new DivinedResultContentBuilder(divination.getTarget(), divination.getResult()); return new Content(builder).getText(); } } return Content.OVER.getText(); } 待ち行列の先頭の要素を取り出す
68.
talk()の実装(全体像) public String talk()
{ // 占いで人狼を見つけたらカミングアウトする if (!isCO) { if (!myDivinationQueue.isEmpty() && myDivinationQueue.peek().getResult() == Species.WEREWOLF) { isCO = true; ContentBuilder builder = new ComingoutContentBuilder(me, Role.SEER) return new Content(builder).getText(); } } // カミングアウトした後は、まだ報告していない占い結果を順次報告 else { if (!myDivinationQueue.isEmpty()) { Judge divination = myDivinationQueue.poll(); ContentBuilder builder = new DivinedResultContentBuilder(divination.getTarget(), divination.getResult()); return new Content(builder).getText(); } } return Content.OVER.getText(); } 次は他の人の発話を読み込んでみましょう
69.
会話内容の取り込み • 会話のリストは GameInfo.getTalkList()でList<Talk>型 として取得 •
Talkクラスのメソッド – getAgent():発話したAgentを取得 – getText():発話内容(String)を取得 – getDay():発話日(int)を取得 – getIdx():その日の何番目の発話か(int)を取得 – getTurn():その日の何番目のターンの発話か (int)を取得
70.
会話内容の取り込み Talk.getText()で得られる文字列は人狼知能プロトコルに準拠 例:“DIVINED Agent[04] HUMAN” この文字列をparseするには,Contentクラスのコンストラクタの 引数として与える //Contentクラスのコンストラクタの引数に発話内容のStringを入れると 自動的にパースされる Content
content = new Content(talk.getText());
71.
Contentクラスの使い方 戻り値 メソッド名 説明 String
getText() 発話内容をそのまま返す Operator getOperator() 発話内容の演算子を返す.発話が単文の場合はnull Agent getSubject() 発話内容の主語を返す Topic getTopic() 発話内容のトピックを返す(COMINGOUTやDIVINED等) Agent getTarget() 発話内容の目的語となるプレイヤーを返す(例えば”DIVINED Agent[01] HUMAN” → Agent[01]) Role getRole() 発話の目的語となる役職を返す(例えば”COMINGOUT Agent[02] SEER” → SEER) Species getResult() 占い(霊媒)の結果を返す(例えば”IDENTIFIED Agent[03] WEREWOLF” → WEREWOLF) TalkType getTalkType() TopicがAGREE/DISAGREEの時,対象発話のタイプ(TALK/WHISPER)を返す int getTalkDay() TopicがAGREE/DISAGREEの時,対象発話の発話日を返す int getTalkID() TopicがAGREE/DISAGREEの時,対象発話の発話IDを返す List<Content> getContentList() 発話内容が複文・重文の場合,節のリストを返す
72.
会話内容を取り込むように update()を修正(1) /** GameInfo.talkList読み込みのヘッド */ int
talkListHead; // dayStart()中で0に初期化しておくこと public void update(GameInfo gameInfo) { currentGameInfo = gameInfo; // GameInfo.talkListからカミングアウト・占い報告・霊媒報告を抽出 for (int i = talkListHead; i < currentGameInfo.getTalkList().size(); i++) { Talk talk = currentGameInfo.getTalkList().get(i); Agent talker = talk.getAgent(); if (talker == me) { continue; } Content content = new Content(talk.getText()); // 発話をparse 続く
73.
会話内容を取り込むように update()を修正(2) switch (content.getTopic()) { case
COMINGOUT: // カミングアウト発話の処理 break; case DIVINED: // 占い結果報告発話の処理 break; case IDENTIFIED: // 霊媒結果報告発話の処理 break; default: break; } } talkListHead = currentGameInfo.getTalkList().size(); }
74.
修正したupdate()の全体像 /** GameInfo.talkList読み込みのヘッド */ int
talkListHead; // dayStart()中で0に初期化しておくこと public void update(GameInfo gameInfo) { currentGameInfo = gameInfo; // GameInfo.talkListからカミングアウト・占い報告・霊媒報告を抽出 for (int i = talkListHead; i < currentGameInfo.getTalkList().size(); i++) { Talk talk = currentGameInfo.getTalkList().get(i); Agent talker = talk.getAgent(); if (talker == me) { continue; } Content content = new Content(talk.getText()); // 発話をparse switch (content.getTopic()) { case COMINGOUT: // カミングアウト発話の処理 break; case DIVINED: // 占い結果報告発話の処理 break; case IDENTIFIED: // 霊媒結果報告発話の処理 break; default: break; } } talkListHead = currentGameInfo.getTalkList().size(); } 実際にカミングアウトの情報を 取り込んでみましょう
75.
カミングアウト情報の取り込み例 /** カミングアウト状況 */ Map<Agent,
Role> comingoutMap = new HashMap<>(); // initializeで初期化しておくこと public void update(GameInfo gameInfo) { currentGameInfo = gameInfo; // GameInfo.talkListからカミングアウト・占い報告・霊媒報告を抽出 for (int i = talkListHead; i < currentGameInfo.getTalkList().size(); i++) { Talk talk = currentGameInfo.getTalkList().get(i); Agent talker = talk.getAgent(); if (talker == me) { continue; } Content content = new Content(talk.getText()); // 発話をparse switch (content.getTopic()) { case COMINGOUT: // カミングアウト情報の取り込み comingoutMap.put(talker, content.getRole()); break; case DIVINED: // 占い結果報告発話の処理 break; case IDENTIFIED: // 霊媒結果報告発話の処理 break; default: break; } } talkListHead = currentGameInfo.getTalkList().size(); }
76.
カミングアウト情報が取り込めたら • 例えば,偽の占い師が現れたことがわかる – 自分のカミングアウト前だったらどうする? –
偽占い師は人狼か,それとも裏切り者か・・・ などについて,対応を考えてみましょう
77.
78.
補足
79.
Playerの各メソッドの説明 • initialize(GameInfo) – ゲーム開始時に一度だけ 呼ばれる –
サーバから送られてくる GameInfoを取得 • update(GameInfo) – 各行動の前に呼ばれる – サーバから送られてくる GameInfoを取得 • dayStart() – 日の初めに呼ばれる • finish() – ゲームが終了した時に呼 ばれる
80.
Playerの各メソッドの説明 • vote() – 投票する相手を選択する •
attack() – 襲撃する相手を選択する – 人狼のみ呼ばれる • divine() – 占いする相手を選択する – 占い師のみ呼ばれる • guard() – 護衛する相手を選択する – 狩人のみ呼ばれる 1日の終わりに呼ばれるメソッド Agentを返す必要あり
81.
Playerの各メソッドの説明 • talk() – 全体に対して発話する –
全員呼ばれるメソッド • whisper() – 人狼だけに対して発話す る – 人狼のプレイヤーだけが 使用するメソッド 発話のメソッド Stringを返す必要あり
82.
GameInfoの説明 戻り値 メソッド名 説明 int
getDay() 日にちを返す Role getRole() 自分の役職を返す List<Agent> getExistingRoles() このゲームに存在する役職のリストを返す Agent getAgent() 自分(Agent型)を返す List<Agent> getAgentList() 全プレイヤーのリストを返す Species getMediumResult() 霊媒結果を返す(霊媒師のみ) Species getDivineResult() 占い結果を返す(占い師のみ) Agent getGuardedAgent() 前日護衛したプレイヤーを返す(狩人のみ) List<Agent> getLastDeadAgentList() 前日死亡したプレイヤーのリストを返す(呪殺された妖狐を含む) Agent getExecutedAgent() 前日追放されたプレイヤーを返す Agent getLatestExecutedAgent() 当日追放が決まったプレイヤーを返す.決定前はnull Agent getAttackedAgent() 襲撃の成否にかかわらず,襲撃したプレイヤーを返す(人狼のみ) List<Vote> getVoteList() 前日の追放の際の投票リストを返す List<Vote> getLatestVoteList() 追放再投票の場合,前投票のリストを返す List<Vote> getAttackVoteList() 襲撃投票のリストを返す(人狼のみ) List<Vote> getLatestAttackVoteList() 襲撃再投票の場合,前投票のリストを返す(人狼のみ) List<Talk> getTalkList() 会話のリストを返す List<Talk> getWhisperList() 囁きのリストを返す(人狼のみ) List<Agent> getAliveAgentList() 生きているプレイヤーのリストを返す Map<Agent, Status> getStatusMap() 各プレイヤーの生死の状態を返す Map<Agent, Role> getRoleMap() 各プレイヤーの役職を返す.ゲーム中は自分の分かる役職のみ(村人な ら自分だけ,人狼なら仲間の人狼も).ゲーム終了時は全員の役職.
83.
84.
付録:GUIによるゲームの実行
85.
GUIによるゲームの実行 • サーバの起動 – Windowsの場合
: StartServer.batをダブルクリック – Mac/Linuxの場合 : StartSerber.shをダブルクリック
86.
サーバの設定 • Num of
playersを5に設定 • Connectをクリックしてサーバを起動
87.
クライアントの接続 (1/3) • クライアント接続用プログラム –
Windowsの場合 :StartGuiClient.batを起動 – Mac/Linuxの場合 : StartGuiClient.shを起動
88.
クライアントの接続 (2/3) • 先ほど作成したjarとaiwolf-client.jarをJarFiles 欄にドラッグアンドドロップ
89.
クライアントの接続 (3/3) • Jarファイル,接続するプレイヤークラスを選択 •
Connect Agentを選択 • Role欄で役職をリクエストすることもできる
90.
ゲームの実行 • 自分のエージェント1体と SampleRoleAssignPlayerを4体Connect • Server
StarterでStart Gameをクリック 5体のエージェントが接続されて いるのを確認(ServerStarter)
91.
実行結果 • 実行結果が右側の欄に表示される この例では村人側(Villager)の勝利
Download now