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; }