Пример #1
0
        /// <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();
                }
            }
        }
Пример #2
0
        /// <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();
                }
            }
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
        /// <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();
                    }
                }
            }
        }