Пример #1
0
        /// <summary>
        /// Create GameData of next day.
        /// </summary>
        /// <returns></returns>
        public GameData NextDay()
        {
            GameData gameData = new GameData(gameSetting);

            gameData.Day = this.Day + 1;
            gameData.agentStatusMap = new Dictionary<Agent, Status>(agentStatusMap);
            if (Executed != null)
            {
                gameData.agentStatusMap[Executed] = Status.DEAD;
            }
            if (Attacked != null)
            {
                gameData.agentStatusMap[Attacked] = Status.DEAD;
            }
            gameData.agentRoleMap = new Dictionary<Agent, Role>((Dictionary<Agent, Role>)agentRoleMap);

            gameData.DayBefore = this;

            return gameData;
        }
Пример #2
0
        public void Night()
        {
            foreach (Agent agent in gameData.AgentList)
            {
                gameServer.DayFinish(agent);
            }

            //Vote
            List <Vote> voteList = gameData.VoteList;
            Agent       executed = GetVotedAgent(voteList);

            if (executed != null)
            {
                if (gameData.GetStatus(executed) == Status.ALIVE && gameData.Day != 0)
                {
                    gameData.Executed = executed;
                    if (GameLogger != null)
                    {
                        GameLogger.Log(string.Format("{0},execute,{1},{2}", gameData.Day, executed.AgentIdx, gameData.GetRole(executed)));
                    }
                }

                //Attack
                if (!(AliveWolfList.Count == 1 && gameData.GetRole(gameData.Executed) == Role.WEREWOLF) && gameData.Day != 0)
                {
                    List <Vote> attackCandidateList = gameData.AttackVoteList;
                    attackCandidateList.RemoveAll(v => v.Agent == executed);

                    Agent attacked = GetAttackVotedAgent(attackCandidateList);
                    if (attacked == executed)
                    {
                        attacked = null;
                    }

                    bool isGuarded = false;
                    if (gameData.Guard != null)
                    {
                        if (gameData.Guard.Target.Equals(attacked) && attacked != null)
                        {
                            if (gameData.Executed == null || !gameData.Executed.Equals(gameData.Guard.Agent))
                            {
                                isGuarded = true;
                            }
                        }
                    }
                    if (!isGuarded && attacked != null)
                    {
                        gameData.Attacked = attacked;
                        if (GameLogger != null)
                        {
                            GameLogger.Log(string.Format("{0},attack,{1},true", gameData.Day, attacked.AgentIdx));
                        }
                    }
                    else if (attacked != null)
                    {
                        if (GameLogger != null)
                        {
                            GameLogger.Log(string.Format("{0},attack,{1},false", gameData.Day, attacked.AgentIdx));
                        }
                    }
                    else
                    {
                        if (GameLogger != null)
                        {
                            GameLogger.Log(string.Format("{0},attack,-1,false", gameData.Day));
                        }
                    }
                }
            }
            gameData = gameData.NextDay();
            gameDataMap[gameData.Day] = gameData;
            gameServer.SetGameData(gameData);
        }
Пример #3
0
        /// <summary>
        /// Initialize Game
        /// </summary>
        public void Init()
        {
            gameDataMap  = new Dictionary <int, GameData>();
            gameData     = new GameData(gameSetting);
            agentNameMap = new Dictionary <Agent, string>();
            gameServer.SetGameData(gameData);

            List <Agent> agentList = gameServer.ConnectedAgentList;

            if (agentList.Count != gameSetting.PlayerNum)
            {
                throw new IllegalPlayerNumException("Player num is " + gameSetting.PlayerNum + " but connected agent is " + agentList.Count);
            }

            agentList = agentList.Shuffle().ToList();

            Dictionary <Role, List <Agent> > requestRoleMap = new Dictionary <Role, List <Agent> >();

            foreach (Role role in Enum.GetValues(typeof(Role)))
            {
                requestRoleMap[role] = new List <Agent>();
            }
            List <Agent> noRequestAgentList = new List <Agent>();

            foreach (Agent agent in agentList)
            {
                Role?requestedRole = gameServer.RequestRequestRole(agent);
                if (requestedRole != null)
                {
                    if (requestRoleMap[(Role)requestedRole].Count < gameSetting.RoleNumMap[(Role)requestedRole])
                    {
                        requestRoleMap[(Role)requestedRole].Add(agent);
                    }
                    else
                    {
                        noRequestAgentList.Add(agent);
                    }
                }
                else
                {
                    noRequestAgentList.Add(agent);
                    //Console.WriteLine(agent + " request no role");
                }
            }

            foreach (Role role in Enum.GetValues(typeof(Role)))
            {
                List <Agent> requestedAgentList = requestRoleMap[role];
                for (int i = 0; i < gameSetting.RoleNumMap[role]; i++)
                {
                    if (requestedAgentList.Count == 0)
                    {
                        gameData.AddAgent(noRequestAgentList[0], Status.ALIVE, role);
                        noRequestAgentList.RemoveAt(0);
                    }
                    else
                    {
                        gameData.AddAgent(requestedAgentList[0], Status.ALIVE, role);
                        requestedAgentList.RemoveAt(0);
                    }
                }
            }

            gameDataMap[gameData.Day] = gameData;

            gameServer.SetGameData(gameData);
            gameServer.SetGameSetting(gameSetting);
            foreach (Agent agent in agentList)
            {
                gameServer.Init(agent);
                agentNameMap[agent] = gameServer.RequestName(agent);
            }
        }
Пример #4
0
        private void Log()
        {
            if (!IsShowConsoleLog)
            {
                return;
            }

            GameData yesterday = gameData.DayBefore;

            Console.WriteLine("=============================================");
            if (yesterday != null)
            {
                Console.WriteLine("Day {0:00}", yesterday.Day);
                Console.WriteLine("========talk========");
                foreach (Talk talk in yesterday.TalkList)
                {
                    Console.WriteLine(talk);
                }
                Console.WriteLine("========Whisper========");
                foreach (Talk whisper in yesterday.WhisperList)
                {
                    Console.WriteLine(whisper);
                }

                Console.WriteLine("========Actions========");
                foreach (Vote vote in yesterday.VoteList)
                {
                    Console.WriteLine("Vote:{0}->{1}", vote.Agent, vote.Target);
                }

                //			Console.WriteLine("Attack Vote Result");
                foreach (Vote vote in yesterday.AttackVoteList)
                {
                    Console.WriteLine("AttackVote:{0}->{1}", vote.Agent, vote.Target);
                }

                Judge divine = yesterday.Divine;
                Console.WriteLine("{0} executed", yesterday.Executed);
                if (divine != null)
                {
                    Console.WriteLine("{0} divine {1}. Result is {2}", divine.Agent, divine.Target, divine.Result);
                }
                Guard guard = yesterday.Guard;
                if (guard != null)
                {
                    Console.WriteLine("{0} guarded", guard);
                }
                Agent attacked = yesterday.Attacked;
                if (attacked != null)
                {
                    Console.WriteLine("{0} attacked", attacked);
                }
            }
            Console.WriteLine("======");
            List <Agent> agentList = gameData.AgentList;

            agentList.Sort();
            foreach (Agent agent in agentList)
            {
                Console.Write("{0}\t{1}\t{2}\t{3}", agent, agentNameMap[agent], gameData.GetStatus(agent), gameData.GetRole(agent));
                if (yesterday != null)
                {
                    if (yesterday.Executed == agent)
                    {
                        Console.Write("\texecuted");
                    }
                    if (yesterday.Attacked == agent)
                    {
                        Console.Write("\tattacked");
                    }
                    Judge divine = yesterday.Divine;
                    if (divine != null && divine.Target == agent)
                    {
                        Console.Write("\tdivined");
                    }
                    Guard guard = yesterday.Guard;
                    if (guard != null && guard.Target == agent)
                    {
                        Console.Write("\tguarded");
                    }
                }
                Console.WriteLine();
            }
            Console.WriteLine("Human:{0}\nWerewolf:{1}\n", AliveHumanList.Count, AliveWolfList.Count);

            Console.WriteLine("=============================================");
        }