2014年11月7日金曜日

人狼知能作成tips 第3回 ゲームの実行

前回でエージェントが完成したので対戦させてみよう.
(2015.03.31修正しました.aiwolf-ver0.1.16対応版)

ゲームを実行するためのソースコードは以下の通り.

/**
 * 指定した回数ゲームを実行し,各陣営の勝利数を表示するMainクラス
 * @author inaba
 *
 */

 public class MyStarter {

/**
 * 参加エージェントの数
 */
static protected int PLAYER_NUM = 12;

/**
* 1回の実行で行うゲーム数
*/
static protected int GAME_NUM = 100;

public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException {
//村人側勝利数
int villagerWinNum = 0;
//人狼側勝利数
int werewolfWinNum = 0;


for(int i = 0;i<GAME_NUM;i++){
List<Player> playerList = new ArrayList<Player>();

for(int j=0;j<PLAYER_NUM;j++){
playerList.add(new RoleAssignPlayer()); //ここで作成したエージェントを指定
}

    GameServer gameServer = new DirectConnectServer(playerList); GameSetting gameSetting = GameSetting.getDefaultGame(PLAYER_NUM); AIWolfGame game = new AIWolfGame(gameSetting, gameServer); game.setRand(new Random(gameSetting.getRandomSeed())); game.start(); if(game.getWinner() == Team.VILLAGER){ villagerWinNum++; }else{ werewolfWinNum++; }

System.out.println("村人側勝利:" + villagerWinNum + " 人狼側勝利" + werewolfWinNum);

}

}

ソースコードの解説は人狼知能エージェントの作成・その3とかなり重複するので割愛.

プログラムを実行すると,100回ゲームを実行し,村人側と人狼側の勝利数をそれぞれ表示する.
ポイントは,ソースコード中央辺りで前回作成したRoleAssignPlayerをplayerListに12回(PLAYER_NUM回)追加している点である.
これにより,RoleAssignPlayer12体による対戦が行える.

実行するとコンソールにこんな感じで表示される.

Agent[11] request no role
Agent[09] request no role
Agent[01] request no role
Agent[12] request no role
Agent[06] request no role
Agent[04] request no role
Agent[08] request no role
Agent[10] request no role
Agent[02] request no role
Agent[05] request no role
Agent[03] request no role
Agent[07] request no role
=============================================
======
Agent[01] null ALIVE POSSESSED
Agent[02] null ALIVE VILLAGER
Agent[03] null ALIVE WEREWOLF
Agent[04] null ALIVE VILLAGER
Agent[05] null ALIVE VILLAGER
Agent[06] null ALIVE VILLAGER
Agent[07] null ALIVE WEREWOLF
Agent[08] null ALIVE VILLAGER
Agent[09] null ALIVE MEDIUM
Agent[10] null ALIVE VILLAGER
Agent[11] null ALIVE BODYGUARD
Agent[12] null ALIVE SEER
Human:10
Werewolf:2



Send finish to Agent[09]
Send finish to Agent[10]
Send finish to Agent[11]
Send finish to Agent[12]
Winner:VILLAGER



Send finish to Agent[09]
Send finish to Agent[10]
Send finish to Agent[11]
Send finish to Agent[12]
Winner:WEREWOLF
Villager:42 Werewolf:58

100回中,村人側が42回,人狼側が58回勝ったようだ.
現段階では人狼側のほうが強いらしい.それもそのはずで,前回作成したMySeerPlayerは占い結果を全く発表せず,投票もランダムで行っている.重要な役職の占い師がこの体たらくではこれも仕方ない.

というわけで,前回作成したRoleAssignPlayerのソースコードからthis.setSeerPlayer(new MySeerPlayer())をコメントアウトしてみよう.これですべてサンプルがゲームを行うことになる.
実行結果は以下のとおり.




Send finish to Agent[09]
Send finish to Agent[10]
Send finish to Agent[11]
Send finish to Agent[12]
Winner:VILLAGER
Villager:56 Werewolf:44

村人側が56回,人狼側が44回勝利,ということでやはり前回作成したSeerPlayerが諸悪の根源だったようだ(泣)
これでは残念すぎるので,次回はもっと強いエージェントを作っていこう.

0 件のコメント:

コメントを投稿