/// <summary> /// 投票先候補を選ぶ /// </summary> /// <returns>投票先候補のエージェント</returns> protected override void ChooseVoteCandidate() { // 自分や殺されたエージェントを人狼と判定していて,生存している占い師を投票先候補とする var candidates = DivinationList .Where(j => j.Result == Species.WEREWOLF && (j.Target == Me || Killed(j.Target)) && Alive(j.Agent)) .Select(j => j.Agent).Distinct(); if (candidates.Count() > 0) { if (!candidates.Contains(voteCandidate)) { voteCandidate = candidates.Shuffle().First(); // 以前の投票先から変わる場合,新たに推測発言と占い要請をする if (CanTalk) { TalkQueue.Enqueue(new Content(new EstimateContentBuilder(voteCandidate, Role.WEREWOLF))); TalkQueue.Enqueue(new Content(new RequestContentBuilder(null, new Content(new DivinationContentBuilder(voteCandidate))))); } } } // 人狼候補がいない場合はランダム else { if (!AliveOthers.Contains(voteCandidate)) { voteCandidate = AliveOthers.Shuffle().First(); } } }
/// <summary> /// 投票先候補を選ぶ /// </summary> /// <returns>投票先候補のエージェント</returns> protected override void ChooseVoteCandidate() { // 霊媒師をカミングアウトしている他のエージェントは人狼候補 var fakeMediums = AliveOthers.Where(a => GetCoRole(a) == Role.MEDIUM); // 自分や殺されたエージェントを人狼と判定,あるいは自分と異なる判定の占い師は人狼候補 var fakeSeers = DivinationList .Where(j => (j.Result == Species.WEREWOLF && (j.Target == Me || Killed(j.Target))) || (myIdentMap.ContainsKey(j.Target) && j.Result != myIdentMap[j.Target])).Select(j => j.Agent); var candidates = fakeMediums.Concat(fakeSeers).Where(a => Alive(a)).Distinct(); if (candidates.Count() > 0) { if (!candidates.Contains(voteCandidate)) { voteCandidate = candidates.Shuffle().First(); // 以前の投票先から変わる場合,新たに推測発言と占い要請をする if (CanTalk) { TalkQueue.Enqueue(new Content(new EstimateContentBuilder(voteCandidate, Role.WEREWOLF))); TalkQueue.Enqueue(new Content(new RequestContentBuilder(null, new Content(new DivinationContentBuilder(voteCandidate))))); } } } // 人狼候補がいない場合はランダム else { if (!AliveOthers.Contains(voteCandidate)) { voteCandidate = AliveOthers.Shuffle().First(); } } }
/// <summary> /// 偽判定を返す /// </summary> /// <param name="fakeRole">偽役職</param> /// <returns>偽判定結果</returns> Judge GetFakeJudge(Role fakeRole) { Agent target = null; // 占い師騙りの場合 if (fakeRole == Role.SEER) { target = AliveOthers.Where(a => !judgedAgents.Contains(a) && GetCoRole(a) != Role.SEER) .Shuffle().FirstOrDefault(); if (target == null) { target = AliveOthers.Shuffle().First(); } } // 霊媒師騙りの場合 else if (fakeRole == Role.MEDIUM) { target = CurrentGameInfo.ExecutedAgent; } if (target != null) { Species result = Species.HUMAN; // 人間が偽占い対象の場合 if (humans.Contains(target)) { // 偽人狼に余裕があれば if (fakeJudgeList.Where(j => j.Result == Species.WEREWOLF).Count() < numWolves) { // 裏切り者,あるいはまだカミングアウトしていないエージェントの場合,判定は五分五分 if ((target == possessed || !IsCo(target))) { if (new Random().NextDouble() < 0.5) { result = Species.WEREWOLF; } } // それ以外は人狼判定 else { result = Species.WEREWOLF; } } } return(new Judge(Day, Me, target, result)); } else { return(null); } }
/// <summary> /// 偽占い結果を返す /// </summary> /// <returns>偽占い結果</returns> Judge GetFakeDivination() { Agent target = null; var candidates = AliveOthers.Where(a => !divinedAgents.Contains(a) && GetCoRole(a) != Role.SEER); if (candidates.Count() > 0) { target = candidates.Shuffle().First(); } else { target = AliveOthers.Shuffle().First(); } // 偽人狼に余裕があれば,人狼と人間の割合を勘案して,30%の確率で人狼と判定 Species result = Species.HUMAN; if (fakeDivinationList.Where(j => j.Result == Species.WEREWOLF).Count() < numWolves && new Random().NextDouble() < 0.3) { result = Species.WEREWOLF; } return(new Judge(Day, Me, target, result)); }
/// <summary> /// 投票先候補を選ぶ /// </summary> /// <returns>投票先候補のエージェント</returns> protected override void ChooseVoteCandidate() { // 生存人狼がいれば当然投票 var aliveWolves = blackList.Where(a => Alive(a)); if (aliveWolves.Count() > 0) { // 既定の投票先が生存人狼でない場合投票先を変える if (!aliveWolves.Contains(voteCandidate)) { voteCandidate = aliveWolves.Shuffle().First(); if (CanTalk) { TalkQueue.Enqueue(new Content(new RequestContentBuilder(null, new Content(new VoteContentBuilder(voteCandidate))))); } } return; } // 確定人狼がいない場合は推測する // 偽占い師 var fakeSeers = AliveOthers.Where(a => GetCoRole(a) == Role.SEER); // 偽霊媒師 var fakeMediums = IdentList.Where(j => myDivinationMap.ContainsKey(j.Target) && j.Result != myDivinationMap[j.Target]).Select(j => j.Agent); var candidates = fakeSeers.Concat(fakeMediums).Where(a => Alive(a)).Distinct(); // 人狼候補なのに人間⇒裏切り者 foreach (Agent possessed in candidates.Where(a => whiteList.Contains(a))) { if (!possessedList.Contains(possessed)) { TalkQueue.Enqueue(new Content(new EstimateContentBuilder(possessed, Role.POSSESSED))); possessedList.Add(possessed); } } semiWolves = candidates.Where(a => !whiteList.Contains(a)).ToList(); if (semiWolves.Count() > 0) { if (!semiWolves.Contains(voteCandidate)) { voteCandidate = semiWolves.Shuffle().First(); // 以前の投票先から変わる場合,新たに推測発言をする if (CanTalk) { TalkQueue.Enqueue(new Content(new EstimateContentBuilder(voteCandidate, Role.WEREWOLF))); } } } else { // 人狼候補がいない場合はグレイからランダム if (grayList.Count != 0) { if (!grayList.Contains(voteCandidate)) { voteCandidate = grayList.Shuffle().First(); } } // グレイがいない場合ランダム else { if (!AliveOthers.Contains(voteCandidate)) { voteCandidate = AliveOthers.Shuffle().First(); } } } }