public void IsWolf_False2() { BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 3, MaxNum = 3 }; con.AddWerewolf(Agent.GetAgent(1)); con.AddWerewolf(Agent.GetAgent(15)); con.AddWerewolf(Agent.GetAgent(7)); Assert.AreEqual(con.IsMatch(pattern), false); }
public void IsWolf_True1() { BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 2, MaxNum = 2 }; con.AddWerewolf(Agent.GetAgent(1)); con.AddWerewolf(Agent.GetAgent(15)); con.AddWerewolf(Agent.GetAgent(7)); Assert.AreEqual(con.IsMatch(pattern), true); }
public void SpeedCheck1() { BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 2, MaxNum = 2 }; con.AddWerewolf(Agent.GetAgent(1)); con.AddWerewolf(Agent.GetAgent(15)); con.AddWerewolf(Agent.GetAgent(7)); for (int i = 0; i < loop; i++) { bool a = con.IsMatch(pattern); } }
public void bitMatchNum条件_複数エージェント狼() { for (int i = 0; i < loop; i++) { Viewpoint viewpoint = new Viewpoint(gameSetting15, gameInfo15); BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 1, MaxNum = 2 }; con.AddWerewolf(Agent.GetAgent(1)); con.AddWerewolf(Agent.GetAgent(2)); con.AddWerewolf(Agent.GetAgent(3)); viewpoint.RemoveMatchPattern(con); Assert.AreEqual(viewpoint.MonsterSidePattern.Count, 2652); } }
/// <summary> /// COから村騙りが無い場合の内訳を絞り込む /// </summary> /// <param name="role"></param> private void RemovePatternFromComingOut(Role role) { if (GameSetting.RoleNumMap.ContainsKey(role) && GameSetting.RoleNumMap[role] == 1) { List <Agent> coAgent = GetComingOutAgent(role); if (coAgent.Count >= 2) { BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 0, MaxNum = coAgent.Count - 2 }; foreach (Agent agent in coAgent) { con.AddWerewolfTeam(agent); } AllViewTrustInfo.RemoveMatchPattern(con); } } }
/// <summary> /// 日付変更時(昼の開始時)の処理 /// </summary> private void DayStart(GameInfo gameInfo) { // 昨日の情報を更新 YesterdayInfo = TodayInfo; if (YesterdayInfo != null && YesterdayInfo.Day != 0 && YesterdayInfo.Day + 1 == gameInfo.Day) { TodayInfo.UpdateFromTomorrow(gameInfo); } // 日の情報を作成 TodayInfo = new DayInfo(gameInfo); DayInfo.Add(gameInfo.Day, TodayInfo); // 死体で発見されたエージェントが人狼のパターンを削除する foreach (Agent agent in gameInfo.LastDeadAgentList) { ICondition condition = RoleCondition.GetCondition(agent, Role.WEREWOLF); AllViewSystemInfo.RemoveMatchPattern(condition); } //TODO 飽和が早い配役対応 (15人村→4日目から)(5人村→1狼のため必要無し) // 人狼生存人数がおかしいパターンを削除する int maxWolfNum = (gameInfo.AliveAgentList.Count - 1) / 2; maxWolfNum = Math.Min(maxWolfNum, GameSetting.RoleNumMap[Role.WEREWOLF]); if (gameInfo.Day > GameSetting.RoleNumMap[Role.WEREWOLF]) { BitMatchNumCondition condition = new BitMatchNumCondition() { MinNum = 1, MaxNum = maxWolfNum, }; foreach (Agent agent in gameInfo.AliveAgentList) { condition.AddWerewolf(agent); } AllViewSystemInfo.RemoveNotMatchPattern(condition); } // 自分の占い判定の追加 if (gameInfo.DivineResult != null) { MySeerJudge.Add(gameInfo.DivineResult); } // 自分の霊媒判定の追加 if (gameInfo.MediumResult != null) { MyMediumJudge.Add(gameInfo.MediumResult); } // 自分の護衛履歴の追加 if (gameInfo.GuardedAgent != null) { MyGuardHistory.Add(gameInfo.Day - 1, gameInfo.GuardedAgent); } // 護衛成功からのパターン削除 if (gameInfo.GuardedAgent != null && gameInfo.LastDeadAgentList.Count <= 0) { BitCondition condition = new BitCondition(); condition.AddWerewolf(gameInfo.GuardedAgent); AllViewSystemInfo.RemoveMatchPattern(condition); } talkOffset = 0; // debug /* * Console.Write(gameInfo.Day + "日目 : "); * Console.Write(SelfViewSystemInfo.MonsterSidePattern.Count); * Console.Write(" / "); * Console.Write(AllViewSystemInfo.MonsterSidePattern.Count); * Console.WriteLine(""); */ }
public void Update(GuessStrategyArgs args) { // 実行結果のクリア guessList.Clear(); // 自分の判定は100%信じる foreach (AIWolf.Lib.Judge judge in args.Agi.MySeerJudge) { guessList.Add(new PartGuess() { Condition = RoleCondition.GetCondition(judge.Target, Role.WEREWOLF), Correlation = (judge.Result == Species.WEREWOLF) ? 10.0 : 0.0, }); } // 役職CO者を取得 List <Agent> seerList = args.Agi.GetComingOutAgent(Role.SEER); // 判定騙りをするエージェントを取得(推測) AgentStatistics statistics = (AgentStatistics)args.Items["AgentStatistics"]; List <Agent> liarSeerList = new List <Agent>(); foreach (Agent agent in seerList) { int roleEveCnt = statistics.statistics[agent].eventCount[Role.SEER].GetOrDefault("1d_DevineWhite", 0); int roleEveCnt2 = statistics.statistics[agent].eventCount[Role.SEER].GetOrDefault("1d_DevineBlack", 0); if (roleEveCnt + roleEveCnt2 >= 5 && roleEveCnt2 > roleEveCnt) { liarSeerList.Add(agent); } } foreach (Wepwawet.Lib.Judge judge in args.Agi.SeerJudge) { double fakeBlaskJudgeRate = 0.1; if (liarSeerList.Contains(judge.Agent)) { fakeBlaskJudgeRate = 3.0 / 4.0 * 2.0 / 3.0; } // 村陣営が人間に人狼判定 if (judge.Result == Species.WEREWOLF) { BitCondition con = new BitCondition(); con.AddNotWerewolfTeam(judge.Agent); con.AddNotWerewolf(judge.Target); guessList.Add(new PartGuess() { Condition = con, Correlation = fakeBlaskJudgeRate, }); } // 村陣営が人狼に人間判定 if (judge.Result == Species.HUMAN) { BitCondition con = new BitCondition(); con.AddNotWerewolfTeam(judge.Agent); con.AddWerewolf(judge.Target); guessList.Add(new PartGuess() { Condition = con, Correlation = 0.1, }); } } // COから村騙りが無い場合の内訳を絞り込む List <Agent> coAgent = args.Agi.GetComingOutAgent(Role.SEER); if (coAgent.Count >= 2) { BitMatchNumCondition con = new BitMatchNumCondition() { MinNum = 0, MaxNum = coAgent.Count - 2 }; foreach (Agent agent in coAgent) { con.AddWerewolfTeam(agent); } guessList.Add(new PartGuess() { Condition = con, Correlation = 0.1, }); } // 実行成功にする isSuccess = true; }