Ejemplo n.º 1
0
        public void CreateTurnPredictionsForPlanet(Planet planet)
        {
            int planetID = planet.PlanetID;

            GrowthRate = planet.GrowthRate;
            ResetStats();
            PlanetTurn lastCalculatedTurn = this[0];

            lastCalculatedTurn.SetValues(planet.Owner, planet.NumShips);
            planet.LastAttackTurn = lastCalculatedTurn;

            PlanetTurn currentCalculatingTurn = lastCalculatedTurn.Next;

            planet.MaxDesertersAllowed          = planet.NumShips;
            planet.ShipsRequiredToSurviveAttack = planet.NumShips;
            planet.DoesNotChangeOwner           = true;

            int currentTurn = 1;

            if (planetID == 15)
            {
            }
            if (planet.Armada.Count > 0)
            {
                planet.IdleForThisNumberOfTurns = 0;
                foreach (var turn in planet.FleetArrivalByTurnsRemaining)
                {
                    do
                    {
                        lastCalculatedTurn     = currentCalculatingTurn;
                        currentCalculatingTurn = GrowTurn(GrowthRate, currentCalculatingTurn);
                    } while (currentTurn++ < turn.Key);

                    LastAttackTurn = lastCalculatedTurn;
                    bool survived = Universe.FightBattleAndOwnerSurvived(lastCalculatedTurn, turn);
                    if (lastCalculatedTurn.IsMine)
                    {
                        planet.MaxDesertersAllowed = Math.Min(planet.MaxDesertersAllowed, lastCalculatedTurn.NumShips);
                    }
                    if (!survived)
                    {
                        planet.DoesNotChangeOwner = false;
                    }
                }
            }

            while (currentCalculatingTurn != null)
            {
                lastCalculatedTurn     = currentCalculatingTurn;
                currentCalculatingTurn = GrowTurn(GrowthRate, currentCalculatingTurn);
            }
            planet.WinningArmadaIsMine = lastCalculatedTurn.Owner == 1;

            //int lastTurn = planet.FleetArrivalByTurnsRemaining.Last().Key;
            //lastAttackTurn = this[lastTurn];
            //for (int turnNumber = 1; turnNumber <= lastTurn; turnNumber++)
            //{
            //    lastCalculatedTurn = this[turnNumber];
            //    calc.Grow();
            //    lastCalculatedTurn.SetValues(calc.Owner, calc.NumShips);

            //    if (Universe.FightBattle(calc, turnNumber))
            //    {
            //        lastCalculatedTurn.SetValues(calc.Owner, calc.NumShips);
            //        planet.LastAttackTurn = lastCalculatedTurn;
            //        if (calc.IsMine)
            //        {
            //            planet.MaxDesertersAllowed = Math.Min(planet.MaxDesertersAllowed, calc.NumShips);
            //        }
            //        if (calc.IsEnemy)
            //        {
            //            planet.ShipsRequiredToSurviveAttack = Math.Max(planet.MaxDesertersAllowed, calc.NumShips + 1);
            //        }
            //        if (calc.IsNeutral)
            //        {
            //            planet.ShipsRequiredToSurviveAttack = Math.Min(planet.ShipsRequiredToSurviveAttack, calc.NumShips + 1);
            //        }
            //    }
            //    else
            //    {
            //        lastCalculatedTurn.SetValues(calc.Owner, calc.NumShips);
            //    }

            //    if (!calc.DoesNotChangeOwner)
            //    {
            //        planet.DoesNotChangeOwner = false;
            //    }
            //}
        }
        public List <AttackPlan> BuildActionPlan(Universe uni)
        {
            currentUniverse = uni;
            StartOfTurn();
            DefendOnwedPlanets();
            DefendNeutralPlanets(MaxTurnLookaheadForNeutralDefense);
            ProcessAttackQueue();
            List <AttackPlan> battleplan = new List <AttackPlan>();

            foreach (Planet onwedPlanet in currentUniverse.Me.Planets.Where(OwnedPlanetCanSendAttackForce))
            {
                if (SourcePlanetSelected(onwedPlanet))
                {
                    var planetTravelMap = onwedPlanet.Routes;
                    if (PlanetRouteSelected(onwedPlanet, planetTravelMap))
                    {
                        bool       continueRoute = true;
                        AttackPlan attack        = new AttackPlan();
                        foreach (Route route in SortRoutesForBattlePlanCreation(planetTravelMap))
                        {
                            Planet hostile = route.Destination;
                            if (!hostile.IsMine)
                            {
                                attack.Target   = hostile;
                                attack.Enabled  = false;
                                attack.Strategy = GetType().Name;
                                attack.Reason   = "CreateAttackPlanForOwnedPlanet";
                                CreateAttackPlanForOwnedPlanet(attack, route, planetTravelMap, ref continueRoute);

                                if (attack.Enabled)
                                {
                                    if (onwedPlanet.IdleForThisNumberOfTurns >= 15)
                                    {
                                        attack.Sweetness += onwedPlanet.IdleForThisNumberOfTurns;
                                    }
                                    battleplan.Add(attack);
                                    attack = new AttackPlan();
                                }
                            }
                            if (!continueRoute)
                            {
                                break;
                            }
                        }
                    }
                    PlanetRouteDeSelected(onwedPlanet, planetTravelMap);
                }
            }
            if (!TakeGamble_DoNotCountOutgoingShipsForOneTurn)
            {
                //attack planets for all fleets in transit
                foreach (Planet planet in uni.All.Planets)
                {
                    if (!(planet.IsLost || planet.Armada.Count == 0))
                    {
                        foreach (Fleet attackforce in planet.Armada)
                        {
                            if (attackforce.IsMine)
                            {
                                planet.RemoveShips(attackforce.NumShips);
                            }
                        }
                    }
                }
            }
            TakeGamble_DoNotCountOutgoingShipsForOneTurn = false;
            return(battleplan);
        }
        public void DoTurn(Universe uni)
        {
            currentUniverse = uni;
            ProcessAttackQueue();
            bool attackMade     = false;
            int  sumAttackForce = 0;


            Dictionary <Planet, PlanetTurn> possibleTargets = new Dictionary <Planet, PlanetTurn>();

            foreach (var planet in CanUseInAtttack())
            {
                sumAttackForce += planet.AttackForce;
                possibleTargets.Clear();
                PlanetTurn attackTurn = planet.TurnPrediction[0];
                //find planets that can be attacked with this planets force.
                foreach (var route in planet.Routes
                         .Where(target => IsNotEventuallyMine(target.Destination) &&
                                target.Destination.GrowthRate > 0))
                {
                    PlanetTurn state = route.Destination.TurnPrediction[route.DistanceInTurns + 1];
                    if (state.Owner != 1 && state.NumShips < planet.AttackForce)
                    {
                        possibleTargets.Add(route.Destination, state);
                    }
                }
                // from the list find the planets from which I have most to gain or which are nearest.

                if (Universe.TurnCount < 3)
                {
                    foreach (var item in possibleTargets.OrderBy(
                                 target => - target.Key.GrowthRate)
                             .ThenBy(target => target.Value.NumShips))
                    {
                        if (planet.IsNeutral)
                        {
                            if (planet.AttackForce > item.Value.NumShips)
                            {
                                AttackPlan plan = new AttackPlan();
                                plan.Enabled = true;
                                plan.AddParticipant(planet, attackTurn, item.Value);
                                plan.Target = item.Key;
                                attackMade  = true;
                                ExecutePlans(plan);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in possibleTargets.OrderBy(
                                 target => - ((target.Key.IsNeutral ? 2 : 0) + target.Key.GrowthRate) / currentUniverse.Me.ShipOnPlanetFocus.Delta(target.Key)))
                    {
                        if (planet.AttackForce > item.Value.NumShips)
                        {
                            AttackPlan plan = new AttackPlan();
                            plan.Enabled = true;
                            plan.AddParticipant(planet, attackTurn, item.Value);
                            plan.Target = item.Key;
                            attackMade  = true;
                            ExecutePlans(plan);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            var centerPlanet = currentUniverse.Me.Planets
                               .OrderBy(item => Universe.Center.Delta(item)
                                        + currentUniverse.Enemy.ShipOnPlanetFocus.Delta(item)).FirstOrDefault();

            if (centerPlanet != null)
            {
                int supportCount = 0;
                foreach (var planet in CanUseInAtttack())
                {
                    if (centerPlanet != planet)
                    {
                        supportCount++;
                        currentUniverse.MakeMove(planet, centerPlanet, Math.Min(planet.AttackForce, 2));
                    }
                }
            }


            if (!attackMade)
            {
                int targetOwnerId = 0;
                if (!currentUniverse.IsDominating)
                {
                    if (rnd.NextDouble() > currentUniverse.Neutral.Planets.Count / (currentUniverse.Enemy.Planets.Count + 0.1))
                    {
                        targetOwnerId = 2;
                    }
                }
                else
                {
                    targetOwnerId = 2;
                }
                var target = currentUniverse.Planets.Values
                             .Where(planet => planet.LastAttackTurn.NumShips < sumAttackForce - planet.GrowthRate * 2 &&
                                    IsNotEventuallyMine(planet) &&
                                    planet.GrowthRate > 1 &&
                                    planet.Owner == targetOwnerId
                                    )
                             .OrderBy(planet => - ((planet.GrowthRate + Math.Sqrt(planet.NumShips)) / 3) * 3)
                             .ThenBy(planet => currentUniverse.Me.ShipOnPlanetFocus.Delta(planet))
                             .FirstOrDefault();

                if (target != null)
                {
                    AttackPlan plan = new AttackPlan();
                    plan.Enabled = true;
                    plan.Target  = target;
                    foreach (var planet in CanUseInAtttack())
                    {
                        plan.AddParticipant(planet, planet.TurnPrediction[0], target.TurnPrediction[0]);
                    }
                    attackMade = true;
                    ExecutePlans(plan);
                }
            }



            if (!attackMade && sumAttackForce > 100)
            {
                AttackPlan plan = new AttackPlan();
                plan.Enabled        = true;
                plan.DominationMove = true;
                plan.Target         = centerPlanet;
                foreach (var planet in CanUseInAtttack().Where(item => item != centerPlanet))
                {
                    plan.AddParticipant(planet, planet.TurnPrediction[0], centerPlanet.TurnPrediction[0]);
                }
                attackMade = true;
                ExecutePlans(plan);
            }
        }
 private bool SortAndMakeMoves(Universe uni, List <AttackPlan> sweetnesses)
 {
     return(MakeSweetestMoves(uni, sweetnesses.OrderBy(item => - item.Sweetness)));
 }
        public void DoTurn(Universe uni)
        {
            currentUniverse = uni;
            ProcessAttackQueue();
            bool attackMade     = false;
            int  sumAttackForce = 0;


            List <AttackPlan> possibleTargets = new List <AttackPlan>();

            foreach (var planet in CanUseInAtttack())
            {
                sumAttackForce += planet.AttackForce;
                //possibleTargets.Clear();
                PlanetTurn attackTurn = planet.TurnPrediction[0];


                PlanetTurn highestStateTakeOver = new PlanetTurn(0);
                //find planets that can be attacked with this planets force, from which I have most to gain
                foreach (var route in planet.Routes
                         .Where(target => IsNotEventuallyMine(target.Destination) &&
                                target.Destination.GrowthRate > 0))
                {
                    PlanetTurn stateTakeOver    = null;
                    PlanetTurn destinationState = route.DestinationStateOnArrival;
                    PlanetTurn startAttackOnRun = attackTurn;
                    if (!destinationState.IsMine)
                    {
                        AttackPlan plan = new AttackPlan();

                        if (planet.AttackForce > destinationState.NumShips)
                        {
                            stateTakeOver = route.Destination.CalcMaxGainUsingThisManyShips(planet, route.DistanceInTurns, destinationState.NumShips + 5);
                            plan.Enabled  = true;
                        }
                        else
                        {
                            do
                            {
                                destinationState = destinationState.Next;
                                startAttackOnRun = startAttackOnRun.Next;
                            } while (destinationState != null &&
                                     startAttackOnRun.NumShips < destinationState.NumShips);
                            plan.Enabled = destinationState != null && startAttackOnRun != null;
                            if (plan.Enabled)
                            {
                                stateTakeOver = route.Destination.CalcMaxGainUsingThisManyShips(planet, destinationState.TurnsFromNow, startAttackOnRun.NumShips);
                            }
                        }

                        if (plan.Enabled)
                        {
                            plan.AddParticipant(planet, startAttackOnRun, destinationState);
                            plan.Target    = route.Destination;
                            plan.Enabled   = true;
                            plan.Sweetness = stateTakeOver.NumShips;
                            possibleTargets.Add(plan);
                            highestStateTakeOver = stateTakeOver;
                        }
                    }
                    //PlanetTurn fullAttackState = planet.TurnPrediction.CalcMaxGainUsingThisManyShips(destinationState, planet.AttackForce, TurnPrediction);
                    //planet.TurnPrediction.FindCheapestTakeOverPoint(destinationState.TurnsFromNow, TurnPrediction);
                }
            }
            foreach (AttackPlan plan in possibleTargets.OrderBy(item => - item.Sweetness).Take(10))
            {
                ExecutePlans(plan);
            }
            var centerPlanet = currentUniverse.Me.Planets
                               .OrderBy(item => Universe.Center.Delta(item)).FirstOrDefault();

            if (centerPlanet != null)
            {
                int supportCount = 0;
                foreach (var planet in CanUseInAtttack())
                {
                    if (centerPlanet != planet)
                    {
                        supportCount++;
                        currentUniverse.MakeMove(planet, centerPlanet, Math.Min(planet.AttackForce, 2));
                    }
                }
            }


            //if (!attackMade)
            //{
            //    int targetOwnerId = 0;
            //    if (!currentUniverse.IsDominating)
            //    {
            //        if (rnd.NextDouble() > currentUniverse.Neutral.Planets.Count / (currentUniverse.Enemy.Planets.Count + 0.1))
            //        {
            //            targetOwnerId = 2;
            //        }
            //    }
            //    else
            //    {
            //        targetOwnerId = 2;
            //    }
            //    var target = currentUniverse.Planets.Values
            //           .Where(planet => planet.LastAttackTurn.NumShips < sumAttackForce - planet.GrowthRate * 2
            //                            && IsNotEventuallyMine(planet)
            //                            && planet.GrowthRate > 1
            //                            && planet.Owner == targetOwnerId
            //                            )
            //        .OrderBy(planet => -((planet.GrowthRate + Math.Sqrt(planet.NumShips)) / 3) * 3)
            //        .ThenBy(planet => currentUniverse.Me.ShipOnPlanetFocus.Delta(planet))
            //        .FirstOrDefault();

            //    if (target != null)
            //    {
            //        AttackPlan plan = new AttackPlan();
            //        plan.Enabled = true;
            //        plan.Target = target;
            //        foreach (var planet in CanUseInAtttack())
            //        {
            //            plan.AddParticipant(planet, planet.TurnPrediction[0], target.TurnPrediction[0]);
            //        }
            //        attackMade = true;
            //        ExecutePlans(plan);
            //    }
            //}



            //if (!attackMade && sumAttackForce > 100)
            //{

            //    AttackPlan plan = new AttackPlan();
            //    plan.Enabled = true;
            //    plan.DominationMove = true;
            //    plan.Target = centerPlanet;
            //    foreach (var planet in CanUseInAtttack().Where(item => item != centerPlanet))
            //    {
            //        plan.AddParticipant(planet, planet.TurnPrediction[0], centerPlanet.TurnPrediction[0]);
            //    }
            //    attackMade = true;
            //    ExecutePlans(plan);
            //}
        }