Example #1
0
        public int RunGame()
        {
            CreateBaseStacks();
            foreach (KeyValuePair<IAI, Player> kvp in players)
                kvp.Value.Deal();

            while (!GameIsOver())
            {
                foreach (KeyValuePair<IAI, Player> kvp in players)
                {
                    Turn turn = new Turn(this, kvp.Value);

                    turn.ActionPhase();
                    kvp.Key.ActionPhase(this, turn, kvp.Value);

                    turn.BuyPhase();
                    kvp.Key.BuyPhase(this, turn, kvp.Value);

                    kvp.Value.DoCleanup();

                    if (GameIsOver())
                        break;
                }
            }

            int[] vps = new int[players.Count];
            int maxvp = 0;
            for (int i = 0; i < players.Count; i++)
            {
                vps[i] = players[i].Value.CountVictoryPoints();
                maxvp = Math.Max(vps[i], maxvp);
            }

            int pc = 0;
            int winnerIdx = 0;
            for (int i = 0; i < players.Count; i++)
            {
                if (vps[i] == maxvp)
                {
                    ++pc;
                    winnerIdx = i;
                }
            }

            if (pc == 1)
            {
                // outright winner based upon victory points
                return winnerIdx;
            }

            int minturns = int.MaxValue;
            for (int i = 0; i < players.Count; i++)
                minturns = Math.Min(players[i].Value.Turns, minturns);
            pc = 0;
            winnerIdx = 0;
            for (int i = 0; i < players.Count; i++)
            {
                if (players[i].Value.Turns == minturns && vps[i] == maxvp)
                {
                    ++pc;
                    winnerIdx = i;
                }
            }
            if (pc == 1)
            {
                // outright winner based upon tied vp & fewest turns
                return winnerIdx;
            }

            // tied game
            return -1;
        }