// TODO: Take into account existing own troops // TODO: Take into account existing opponent troops // TODO: Take into account moves decided so far this turn public List <Factory2> FindTargets(Factory2 factory, State state) { return(state.Factories .Where(f => f.Owner != Owner2.Own) .Where(f => f.Production != 0) .Where(f => f.Distances.ContainsKey(factory.Id)) .OrderBy(f => f.Distances[factory.Id]) .ToList()); }
// TODO: Take into account own troops public int GetNumberOfAvailableCyborgs(Factory2 factory, State state) { var incomingEnemyTroops = state.Troops .Where(t => t.Owner == Owner2.Opponent) .Where(t => t.Destination == factory.Id) .ToList(); if (!incomingEnemyTroops.Any()) { return(factory.NumberOfCyborgs); } var currentNumberOfCyborgsInFactory = factory.NumberOfCyborgs; var minimumNumberOfCyborgsLeftInFactory = factory.NumberOfCyborgs; var turnsTillFurthestEnemyTroopArrives = incomingEnemyTroops .Max(t => t.RemainingTravelTime); for (var i = 1; i <= turnsTillFurthestEnemyTroopArrives; i++) { currentNumberOfCyborgsInFactory += factory.Production - incomingEnemyTroops .Where(t => t.RemainingTravelTime == i) .Sum(t => t.NumberOfCyborgs); if (currentNumberOfCyborgsInFactory <= 0) { return(0); } if (currentNumberOfCyborgsInFactory < minimumNumberOfCyborgsLeftInFactory) { minimumNumberOfCyborgsLeftInFactory = currentNumberOfCyborgsInFactory; } } return(minimumNumberOfCyborgsLeftInFactory); }