示例#1
0
        private bool IsCapsuleHolderInDanger(Pirate pirate)
        {
            int numOfNearbyEnemyPushers = game.GetEnemyLivingPirates().Where(enemy => enemy.InRange(pirate, enemy.PushRange + game.PirateMaxSpeed) && enemy.PushReloadTurns <= 2).Count();

            // Checks if the capsule holder is in danger by checking if there are enough close enemies that are in range of pushing, or close to being in range to make the capsule holder lose his capsule.
            return(pirate.HasCapsule() && numOfNearbyEnemyPushers >= game.NumPushesForCapsuleLoss && numOfNearbyEnemyPushers <= game.HeavyNumPushesForCapsuleLoss);
        }
 private void PushInTheBestWay(Pirate p1, Pirate p2)
 {
     if (p1.CanPush(p2))
     {
         if (p2.HasCapsule())
         {
             p1.Push(p2, game.GetEnemyMothership().Location.Towards(p2, game.PushRange * 2));
         }
         else
         {
             p1.Push(p2, GetOutsideBorder(p2.Location));
         }
     }
 }
示例#3
0
 private bool DefensivePush(Pirate pirate, SpaceObject obj)
 {
     // If pirate, push towards the border.
     if (obj is Pirate)
     {
         // This pirate has a capsule. Push him to the edge, all his friends are dead.
         var enemy = (Pirate)obj;
         if (pirate.CanPush(enemy))
         {
             pirate.Push(enemy, GetClosestToBorder(enemy.Location));
             Print("Pirate " + pirate.ToString() + " has pushed enemy " + enemy.ToString() + " towards " + GetClosestToBorder(enemy.Location));
             return(true);
         }
         return(false);
     }
     if (obj is Asteroid)
     {
         var asteroid = (Asteroid)obj;
         if (asteroids[asteroid])
         {
             return(true);
         }
         // This object is an asteroid. Push it to the nearest enemy.
         if (pirate.CanPush(asteroid))
         {
             var closestEnemy = enemyPirates.OrderBy(enemy => enemy.Distance(pirate)).FirstOrDefault();
             if (closestEnemy != null)
             {
                 // Push the asteroid towards it.
                 pirate.Push(asteroid, closestEnemy);
                 Print("Pirate " + pirate.ToString() + " pushes asteroid " + asteroid.ToString() + " towards " + closestEnemy.ToString());
                 return(true);
             }
         }
         else if (!pirate.HasCapsule())
         {
             // Go towards the asteroid's destination where it is in range of a push.
             var dest = asteroid.Location.Add(asteroid.Direction).Towards(pirate, game.PushRange);
             pirate.Sail(dest);
             Print("Pirate " + pirate.ToString() + " sails towards asteroid " + asteroid.ToString() + " in his direction to push.");
             return(true);
         }
     }
     return(false);
 }
        override public int Cost(Chunk chunk)
        {
            var holesInChunk = Main.game.GetAllWormholes().Any(w => chunk.Distance(w) <= w.WormholeRange && pirate.Distance(w) / pirate.MaxSpeed + 2 <= w.TurnsToReactivate);

            if (holesInChunk)
            {
                if (pirate.HasCapsule() && Utils.PiratesWithTask(TaskType.BOOSTER).Any())
                {
                    return(100000);
                }

                if (chunk.Distance(goal) == Utils.DistanceWithWormhole(chunk.GetLocation(), goal, pirate.MaxSpeed))
                {
                    return(100000);
                }
            }

            return(0);
        }
示例#5
0
 private bool TryPush(Pirate pirate, Pirate enemy)
 {
     if (pirate.CanPush(enemy))
     {
         if (enemy.HasCapsule())
         {
             // Push the capsule to the initial location
             pirate.Push(enemy, GetClosestToBorder(enemy.Location));
             Print("Pirate " + pirate + " pushes " + enemy + " (capsule holder) to " + GetClosestToBorder(enemy.Location));
         }
         else
         {
             // Push the enemy to the border
             pirate.Push(enemy, GetClosestToBorder(enemy.Location));
             Print("Pirate " + pirate + " pushes " + enemy + " towards " + GetClosestToBorder(enemy.Location));
         }
         return(true);
     }
     return(false);
 }
示例#6
0
 private bool IsInEnemyRange(Location loc, Pirate myPirate)
 {
     return((!myPirate.HasCapsule()) ? false : game.GetEnemyLivingPirates().Count(enemy => enemy.InRange(loc, enemy.PushRange + enemy.MaxSpeed) &&
                                                                                  enemy.PushReloadTurns < enemy.Steps(loc)) >= myPirate.NumPushesForCapsuleLoss);
 }
示例#7
0
        public Location SmartSail(Pirate pirate, MapObject destination)
        {
            List <Location> candidates     = new List <Location>();
            var             bestOption     = pirate.GetLocation();
            const int       steps          = 50;
            Location        PirateLocation = pirate.GetLocation();

            if ((pirate.Location.Distance(destination)) - bestOption.Distance(destination) >= (pirate.MaxSpeed / 2) && pirate.HasCapsule())
            {
                var LocationOfPush = TryPushMyCapsule(pirate);
                if (PirateLocation != null)
                {
                    PirateLocation = LocationOfPush;
                }
            }
            for (int i = 0; i < steps; i++)
            {
                double   angle  = System.Math.PI * 2 * i / steps;
                double   deltaX = pirate.MaxSpeed * System.Math.Cos(angle);
                double   deltaY = pirate.MaxSpeed * System.Math.Sin(angle);
                Location option = new Location((int)(PirateLocation.Row - deltaY), (int)(PirateLocation.Col + deltaX));
                if (!IsInDanger(option, destination.GetLocation(), pirate) && option.InMap())
                {
                    candidates.Add(option);
                }
            }
            if (candidates.Any())
            {
                bestOption = candidates.OrderBy(option => option.Distance(destination)).First();
            }
            return(bestOption);
        }
示例#8
0
        override public string Preform()
        {
            if (Main.didTurn.Contains(pirate.Id) || !game.GetMyMotherships().Any())
            {
                return(Utils.GetPirateStatus(pirate, "Already did turn"));
            }

            if (!pirate.HasCapsule())
            {
                turnCounter = 0;

                if (Main.capsulesTargetted.ContainsKey(pirate))
                {
                    var sailLocation = Main.capsulesTargetted[pirate].Location;
                    return(Utils.GetPirateStatus(pirate, "Sailing to capsule " + Sailing.SafeSail(pirate, sailLocation)));
                }

                return(Utils.GetPirateStatus(pirate, "Is idle... "));
            }

            var nearestShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), pirate.Location).First();
            var threats     = game.GetEnemyLivingPirates().ToList().Where(e => e.PushReloadTurns < 3 && e.Distance(nearestShip) < pirate.Distance(nearestShip)).OrderBy(nearestShip.Distance).ToList();

            if (Utils.HasEnemyBomb(pirate))
            {
                var  suicideObj  = Utils.NearestKillLocation(pirate.GetLocation()).Item2;
                var  bomb        = game.__stickyBombs.OrderBy(pirate.Distance).First();
                bool canReachMum = pirate.Distance(nearestShip) / pirate.MaxSpeed + pirate.MaxSpeed < bomb.Countdown;

                if (!canReachMum)
                {
                    return(Utils.GetPirateStatus(pirate, Sailing.SafeSail(pirate, new Location(0, 0))));
                }
            }

            turnCounter++;

            if (turnCounter == 0)
            {
                maxTurnsToArrive = ((double)pirate.Distance(nearestShip) / pirate.MaxSpeed) * 2.5;
            }

            if (Utils.GetMyHolders().Count() > 1)
            {
                var secondHolder = Utils.GetMyHolders().Where(h => h.Id != pirate.Id).First();
                var nearestShipToSecondHolder = Utils.OrderByDistance(game.GetMyMotherships().ToList(), secondHolder.Location).First();

                var secondThreats = game.GetEnemyLivingPirates().ToList().Where(e => e.CanPush(secondHolder) && e.Distance(nearestShip) < secondHolder.Distance(nearestShip));
                secondThreats = secondThreats.OrderBy(treath => treath.Distance(secondHolder)).ToList();

                bool caseVI  = secondHolder.Distance(nearestShip) < pirate.Distance(nearestShip);
                bool caseVII = secondHolder.Distance(nearestShip) < pirate.PushDistance + secondHolder.MaxSpeed + game.MothershipUnloadRange;

                if (pirate.CanPush(secondHolder) && caseVI && caseVII && !Main.piratesPushed.Contains(secondHolder))
                {
                    pirate.Push(secondHolder, nearestShipToSecondHolder);
                    Main.didTurn.Add(pirate.Id);
                    Main.piratesPushed.Add(secondHolder);
                    return(Utils.GetPirateStatus(pirate, "Boosted second holder"));
                }
            }

            var traits = new List <Trait>()
            {
                new TraitRateByLazyAsteroid(game.PushDistance + game.AsteroidSize),
                new TraitRateByMovingAsteroid(game.HeavyPushDistance / 2 + game.PirateMaxSpeed * 3),
                new TraitRateByEdges(750, 4),
                new TraitRateByStickyBomb(),
                new TraitRateByEnemy(150, 3, -1),
                new TraitAttractedToGoal(500, nearestShip.Location),
                new TraitWormhole(nearestShip.Location, pirate)
            };


            if (threats.Any() && maxTurnsToArrive < turnCounter && Utils.GetNumOfEnemyPiratesOnPoint(threats.First().Location) >= 4)
            {
                pirate.Sail(nearestShip);
                Main.didTurn.Add(pirate.Id);
                return(Utils.GetPirateStatus(pirate, "Kamikazad on ship"));
            }

            int abstainRadius = 8 * pirate.MaxSpeed;

            if (Utils.GetMyHolders().Count() > 1)
            {
                var secondHolder = Utils.GetMyHolders().First(h => h.Id != pirate.Id);
                abstainRadius = 3 * (pirate.MaxSpeed + secondHolder.MaxSpeed);

                if (abstainRadius / 2 < pirate.Distance(nearestShip))
                {
                    traits.Add(new TraitRateByEnemy(abstainRadius, 100, secondHolder.UniqueId));
                }
            }

            var path = new Path(pirate.GetLocation(), nearestShip.Location, traits);

            bool nearWormHole = game.__wormholes.Any() && game.__wormholes.Any(w => w.TurnsToReactivate <= 2 && pirate.Distance(w) < w.WormholeRange + pirate.MaxSpeed);
            bool safe         = (threats.Any() && game.PushDistance + game.AsteroidSize <= threats.OrderBy(pirate.Distance).First().Distance(pirate)) && !game.GetLivingAsteroids().Any(a => a.Distance(pirate) <= a.Size + pirate.MaxSpeed * 2);

            if (!nearWormHole && safe && (!threats.Any() && pirate.Distance(nearestShip) < abstainRadius || pirate.Distance(nearestShip) <= Chunk.size || path.GetSailLocations().Count <= 1))
            {
                pirate.Sail(nearestShip);
                Main.didTurn.Add(pirate.Id);
                return(Utils.GetPirateStatus(pirate, "Sailing directly to ship"));
            }

            Location pathPopLocation  = path.Pop();
            Location nextSailLocation = pathPopLocation;

            if (Utils.GetMyHolders().Count() > 1 && safe && threats.Count() >= pirate.NumPushesForCapsuleLoss)
            {
                var otherMiner = Utils.GetMyHolders().First(h => h.Id != pirate.Id);

                bool sameTargetShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), otherMiner.Location).First() == nearestShip;
                bool checkI         = pirate.Distance(nearestShip) < otherMiner.Distance(nearestShip);
                bool checkII        = Chunk.size * 4 < otherMiner.Distance(nearestShip) - pirate.Distance(nearestShip);

                if (sameTargetShip && checkI && checkII)
                {
                    nextSailLocation = pirate.Location.Towards(pathPopLocation, pirate.MaxSpeed / 2);
                }
            }

            if (Utils.PiratesWithTask(TaskType.BOOSTER).Any() && safe)
            {
                var  closestBooster  = Utils.OrderByDistance(Utils.PiratesWithTask(TaskType.BOOSTER), pirate.Location).First();
                bool cloestToBooster = Utils.OrderByDistance(Utils.GetMyHolders(), closestBooster.Location).First().Id == pirate.Id;
                bool checkI          = threats.Any() && threats.First().MaxSpeed * 2 <= threats.First().Distance(pirate);

                if (cloestToBooster && game.PushRange < pirate.Distance(closestBooster) && checkI)
                {
                    nextSailLocation = pirate.Location.Towards(pathPopLocation, closestBooster.MaxSpeed / 2);
                }
            }

            return(Utils.GetPirateStatus(pirate, "Sailing to goal, " + Sailing.SafeSail(pirate, nextSailLocation.GetLocation())));
        }
        override public double GetWeight()
        {
            var number       = 0;
            var numofholders = Utils.EnemyHoldersByDistance(pirate.GetLocation()).Count();

            if (numofholders == 1)
            {
                number = 3;
            }
            else
            {
                number = 2 * numofholders;
            }

            if (game.GetEnemyMotherships().Count() == 0 || Utils.PiratesWithTask(TaskType.MOLE).Count() >= number)
            {
                return(0);
            }

            var nearestCapsule = Utils.OrderByDistance(game.GetEnemyMotherships().ToList(), pirate.Location).First().Location;
            var nearestShip    = Utils.OrderByDistance(game.GetEnemyMotherships().ToList(), nearestCapsule).First();

            if (Utils.EnemyHoldersByDistance(pirate.Location).Any())
            {
                if (Utils.EnemyHoldersByDistance(pirate.Location).First().Distance(pirate) <= pirate.MaxSpeed * 4 && !pirate.HasCapsule())
                {
                    return(1000000);
                }

                nearestCapsule = Utils.EnemyHoldersByDistance(pirate.Location).First().Location;
            }

            double maxDis = Main.unemployedPirates.Max(pirate => pirate.Distance(nearestShip));
            double weight = ((double)(maxDis - pirate.Distance(nearestShip)) / maxDis) * 100;

            if (double.IsNaN(weight))
            {
                return(0);
            }

            return(weight);
        }
示例#10
0
        public void MakePair(Pirate first, Pirate second, Location destination)
        {
            if (second == null)
            {
                AssignDestination(first, SmartSail(first, destination));
                return;
            }
            // if (!second.IsSameState(first))
            // {
            //     ("Reached2").Print();
            //     MakeSpecialPair(first, second, destination);
            //     return;
            // }
            var intersections = new List <Location>();

            intersections.Add(Interception(first.Location, destination, second.Location));
            intersections.Add(Interception(second.Location, destination, first.Location));
            var speeds       = new List <int>();
            var slowestSpeed = Min(first.MaxSpeed, second.MaxSpeed);
            // intersections.Add(MidPoint(first, second));
            var bestIntersection = intersections.Where(location => location != null).OrderBy(location => location.Distance(destination))
                                   .Where(location => IsOnTheWay(first.Location, destination, location, 1) &&
                                          IsOnTheWay(second.Location, destination, location, 1))
                                   .FirstOrDefault();
            Location finalDest = null;

            if (first.Location.Equals(second.Location))
            {
                finalDest = destination;
            }
            else
            {
                finalDest = bestIntersection;
            }
            if (finalDest == null)
            {
                intersections.RemoveAt(0);
                intersections.RemoveAt(0);
                intersections.Add(first.Location);
                intersections.Add(second.Location);
                finalDest = intersections.OrderBy(location => location.Distance(destination)).FirstOrDefault();
                {
                }
            }
            if (first.HasCapsule())
            {
                AssignDestination(first, SmartSail(first, finalDest));
            }
            else
            {
                AssignDestination(first, first.Location.Towards(finalDest, slowestSpeed));
            }
            if (second.HasCapsule())
            {
                AssignDestination(second, SmartSail(second, finalDest));
            }
            else
            {
                AssignDestination(second, second.Location.Towards(finalDest, slowestSpeed));
            }
        }