AIsOfCatan.StarterAgent.PerformTurn C# (CSharp) Method

PerformTurn() public method

public PerformTurn ( IGameState state, IGameActions actions ) : void
state IGameState
actions IGameActions
return void
        public void PerformTurn(IGameState state, IGameActions actions)
        {
            if (!silent)
                Console.WriteLine(id + ": Performing main turn");

            for (bool changed = true; changed; )
            {
                changed = false;
                var resources = state.GetOwnResources();

                //Build city
                if (state.GetCitiesLeft(id) > 0 && resources.Count(r => r == Resource.Grain) >= 2 && resources.Count(r => r == Resource.Ore) >= 3)
                {
                    var pos = state.Board.GetPossibleCities(id);
                    if (pos.Length > 0)
                    {
                        changed = true;
                        state = actions.BuildCity(FindBestIntersection(pos,state.Board));
                    }
                }
                //Build settlement
                if (!changed && state.GetSettlementsLeft(id) > 0 && resources.Contains(Resource.Grain) && resources.Contains(Resource.Wool) && resources.Contains(Resource.Lumber) && resources.Contains(Resource.Brick))
                {
                    var pos = state.Board.GetPossibleSettlements(id);
                    if (pos.Length > 0)
                    {
                        changed = true;
                        state = actions.BuildSettlement(FindBestIntersection(pos,state.Board));
                    }
                }
                //Build road
                if (!changed && state.GetRoadsLeft(id) > 0 && resources.Contains(Resource.Lumber) && resources.Contains(Resource.Brick))
                {
                    var pos = state.Board.GetPossibleRoads(id);
                    if (pos.Length > 0)
                    {
                        changed = true;
                        state = actions.BuildRoad(FindBestRoad(pos, state.Board));
                    }
                }

                //Trade players
                if (!changed && Enum.GetValues(typeof(Resource)).Cast<Resource>().Any(r => resources.Count(res => res == r) > 2))
                {
                    // trade 1 of most for 1 missing
                    List<List<Resource>> give = resources.OrderByDescending(r => resources.Count(res => res == r))
                                                    .GroupBy(r => resources.Count(res => res == r)).First().Distinct()
                                                    .Select(r => { var list = new List<Resource>(); list.Add(r); return list; }).ToList();
                    List<List<Resource>> take = Enum.GetValues(typeof(Resource)).Cast<Resource>()
                                                    .OrderBy(r => resources.Count(res => res == r))
                                                    .GroupBy(r => resources.Count(res => res == r)).First()
                                                    .Select(r => { var list = new List<Resource>(); list.Add(r); return list; }).ToList();
                    if (give.Count > 0 && take.Count > 0)
                    {
                        Dictionary<int,ITrade> answers = actions.ProposeTrade(give, take);

                        if (answers.Count > 0)
                        {
                            // trade with lowest score
                            int otherPlayer = answers.OrderBy(kv => state.GetPlayerScore(kv.Key)).First().Key;
                            state = actions.Trade(otherPlayer);
                            changed = true;
                        }
                    }
                }

                //Trade bank
                foreach (Resource give in Enum.GetValues(typeof(Resource)))
                {
                    if (changed) break;
                    if (resources.Count(r => r == give) > 4)
                    {
                        foreach (Resource take in Enum.GetValues(typeof(Resource)))
                        {
                            if (changed) break;
                            if (resources.Count(r => r == take) == 0 && state.ResourceBank[(int)take] > 0)
                            {
                                state = actions.TradeBank(give, take);
                                changed = true;
                            }
                        }
                    }
                }
            }
        }