コード例 #1
0
 private void HandleDefence()
 {
     if (defense)
     {
         // Go to the enemy mothership and keep trying to push.
         foreach (var pirate in game.GetMyLivingPirates())
         {
             // Get the enemy's closest capsule to the pirate.
             var closestCapsule = game.GetEnemyCapsules().OrderBy(capsule => capsule.Distance(pirate)).FirstOrDefault();
             if (closestCapsule != null)
             {
                 var closestCapsulePirate = game.GetEnemyLivingPirates().Where(enemy => enemy.HasCapsule() && enemy.Capsule.Equals(closestCapsule)).FirstOrDefault();
                 var closestMothership    = game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(pirate)).FirstOrDefault();
                 if (closestMothership != null)
                 {
                     if (closestCapsulePirate != null)
                     {
                         if (!TryPush(pirate, closestCapsulePirate))
                         {
                             pirate.Sail(closestMothership.Location.Towards(closestCapsulePirate, (int)(game.MothershipUnloadRange * 0.5)));
                         }
                     }
                     else
                     {
                         pirate.Sail(closestMothership.Location.Towards(closestCapsule, (int)(game.MothershipUnloadRange * 0.5)));
                     }
                 }
             }
         }
     }
 }
コード例 #2
0
        /// <summary> Tries to interact with a Wormhole. </summary>
        /// <returns> A tuple with a bool and the action string </returns>

        protected static Tuple <bool, string> InteractWithWormHole(Pirate pirate, Location goal)
        {
            if (!game.GetAllWormholes().Any() || !game.GetMyMotherships().Any() || !Main.mines.Any() || !game.GetEnemyMotherships().Any() || pirate.PushReloadTurns > 0)
            {
                return(new Tuple <bool, string>(false, "Did not interact with a wormhole"));
            }

            foreach (Wormhole wormhole in game.GetAllWormholes().Where(w => w.InRange(pirate, pirate.PushRange + pirate.MaxSpeed)))
            {
                if (Utils.DistanceWithWormhole(pirate.Location, goal, pirate.MaxSpeed) != pirate.Distance(goal))
                {
                    return(new Tuple <bool, string>(false, "Sailing into hole is faster"));
                }

                var cloestFriendlyMum  = game.GetMyMotherships().OrderBy(wormhole.Distance).First();
                var cloestFriendlyMine = Main.mines.OrderBy(wormhole.Distance).First();

                bool closerToMum  = wormhole.Distance(cloestFriendlyMum) < wormhole.Partner.Distance(cloestFriendlyMum);
                bool closerToMine = wormhole.Distance(cloestFriendlyMine) < wormhole.Partner.Distance(Main.mines.OrderBy(wormhole.Partner.Distance).First());

                var pushLocation = cloestFriendlyMum.Location;

                if (closerToMine)
                {
                    pushLocation = cloestFriendlyMine;
                }

                if (closerToMum || closerToMine)
                {
                    if (pirate.CanPush(wormhole))
                    {
                        pirate.Push(wormhole, pushLocation);
                        Main.wormsPushed.Add(wormhole);
                    }
                    else
                    {
                        pirate.Sail(wormhole);
                    }

                    Main.didTurn.Add(pirate.Id);
                    return(new Tuple <bool, string>(true, "Interacted with Wormhole"));
                }
            }

            return(new Tuple <bool, string>(false, "Did not interact with a wormhole"));
        }
コード例 #3
0
 private void Initialize(PirateGame game)
 {
     this.game             = game;
     this.myPirates        = game.GetMyLivingPirates().ToList();
     this.myCapsules       = game.GetMyCapsules().ToList();
     this.myMotherships    = game.GetMyMotherships().ToList();
     this.enemyMotherships = game.GetEnemyMotherships().ToList();
     this.enemyPirates     = game.GetEnemyLivingPirates().ToList();
     this.enemyCapsules    = game.GetEnemyCapsules().ToList();
 }
コード例 #4
0
ファイル: Bot5.cs プロジェクト: mahmoudkh24/Skillz
 private void Initialize(PirateGame game)
 {
     game             = game;
     myPirates        = game.GetMyLivingPirates().ToList();
     myCapsules       = game.GetMyCapsules().ToList();
     myMotherships    = game.GetMyMotherships().ToList();
     enemyMotherships = game.GetEnemyMotherships().ToList();
     enemyPirates     = game.GetEnemyLivingPirates().ToList();
     enemyCapsules    = game.GetEnemyCapsules().ToList();
     asteroids        = new Dictionary <Asteroid, bool>();
     foreach (var asteroid in game.GetLivingAsteroids())
     {
         asteroids.Add(asteroid, false);
     }
 }
コード例 #5
0
ファイル: Bot4.cs プロジェクト: mahmoudkh24/Skillz
 private void Defence()
 {
     foreach (var pirate in game.GetMyLivingPirates())
     {
         // Get the closest enemy capsule.
         var closestCapsule = game.GetEnemyCapsules().OrderBy(capsule => capsule.Distance(pirate)).FirstOrDefault();
         if (closestCapsule != null)
         {
             // Get the person who holds the capsule.
             var capsuleHolder     = game.GetEnemyLivingPirates().Where(enemy => enemy.HasCapsule() && enemy.Capsule.Equals(closestCapsule)).FirstOrDefault();
             var closestMothership = game.GetEnemyMotherships().OrderBy(mothership => mothership.Distance(closestCapsule)).FirstOrDefault();
             if (capsuleHolder != null)
             {
                 // There is a capsule holder. Attempt push.
                 if (!DefensivePush(pirate, capsuleHolder))
                 {
                     // Go towards the capsule's location between the closest mothership to the capsule as well.
                     if (closestMothership != null)
                     {
                         // Go inbetween.
                         pirate.Sail(closestMothership.Location.Towards(capsuleHolder, (int)(game.MothershipUnloadRange * 0.5)));
                         Print("Pirate " + pirate.ToString() + " sails towards " + closestMothership.Location.Towards(capsuleHolder, (int)(game.MothershipUnloadRange * 0.5)));
                     }
                     else
                     {
                         // Leave the capsule holder. They dont have a mothership. Go do something else.
                     }
                 }
             }
             else
             {
                 // No capsule holder. Regardless, go between.
                 pirate.Sail(closestMothership.Location.Towards(closestCapsule, (int)(game.MothershipUnloadRange * 0.5)));
                 Print("Pirate " + pirate.ToString() + " sails towards " + closestMothership.Location.Towards(closestCapsule, (int)(game.MothershipUnloadRange * 0.5)));
             }
         }
     }
 }
コード例 #6
0
        override public string Preform()
        {
            if (game.GetEnemyCapsules().Count() == 0 || game.GetEnemyMotherships().Count() == 0)
            {
                return(Utils.GetPirateStatus(pirate, "No enemy capsules or ships"));
            }

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

            if (Main.didTurn.Contains(pirate.Id))
            {
                return(Utils.GetPirateStatus(pirate, "Already did turn"));
            }

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

            var sortedEnemyHolders = Utils.EnemyHoldersByDistance(pirate.GetLocation()).Where(enemy => !Main.piratesPushed.Contains(enemy) && pirate.CanPush(enemy));

            bool shouldGo = !sortedEnemyHolders.Any() || pirate.MaxSpeed * 4 + pirate.Distance(nearestShip) < sortedEnemyHolders.First().Distance(nearestShip);

            if (shouldGo)
            {
                foreach (Wormhole hole in game.GetAllWormholes().Where(h => h.Distance(nearestShip) < pirate.MaxSpeed * 10 && !Main.wormsPushed.Contains(h)))
                {
                    var  molesByDistance    = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(hole.Distance);
                    bool closest            = molesByDistance.First().Id == pirate.Id || (molesByDistance.Count() > 1 && molesByDistance.Take(2).Contains(pirate));
                    var  eholdersbydistance = Utils.EnemyHoldersByDistance(nearestShip.GetLocation());

                    if (!pirate.CanPush(hole) && pirate.PushRange < pirate.Distance(hole) && closest)
                    {
                        var wormLoc    = pirate.Location.Towards(hole, pirate.Distance(hole) - hole.WormholeRange);
                        var assDanger  = game.__livingAsteroids.Any(a => a.Location.Add(a.Direction).Distance(pirate) <= a.Size + pirate.MaxSpeed * 2);
                        var bombDanger = game.__stickyBombs.Any(b => b.Distance(pirate) < b.ExplosionRange + pirate.MaxSpeed * 2);

                        var wormPushLocation = pirate.Location.Towards(hole, pirate.Distance(hole) - pirate.PushRange);
                        var caseI            = pirate.Distance(wormPushLocation) / pirate.MaxSpeed >= pirate.PushReloadTurns;
                        var caseII           = true;

                        if (eholdersbydistance.Any())
                        {
                            caseII = hole.Distance(nearestShip) + pirate.MaxSpeed * 4 < eholdersbydistance.First().Distance(nearestShip);
                        }

                        if (!assDanger && !bombDanger && caseI && caseII)
                        {
                            pirate.Sail(wormLoc);
                            Main.didTurn.Add(pirate.Id);
                            return(Utils.GetPirateStatus(pirate, "Sailing out to worm hole "));
                        }

                        if (caseI && caseII)
                        {
                            return(Utils.GetPirateStatus(pirate, "Safely sailing out to worm hole " + Sailing.SafeSail(pirate, wormLoc)));
                        }
                    }

                    var enemyHolders = Utils.EnemyHoldersByDistance(pirate.GetLocation()).SkipWhile(Main.piratesPushed.Contains).OrderBy(hole.Distance);

                    if (pirate.CanPush(hole) && hole.IsActive && enemyHolders.Any() && hole.Distance(nearestShip) < hole.Partner.Distance(nearestShip))
                    {
                        foreach (Pirate enemyHolder in enemyHolders)
                        {
                            int cost = enemyHolder.Distance(hole) + enemyHolder.MaxSpeed / 2;

                            if (cost < pirate.PushDistance)
                            {
                                pirate.Push(hole, pirate.Location.Towards(enemyHolder.Location, cost));
                                Main.didTurn.Add(pirate.Id);
                                Main.piratesPushed.Add(enemyHolder);
                                Main.wormsPushed.Add(hole);
                                return(Utils.GetPirateStatus(pirate, "Pushed hole on enemy"));
                            }
                        }
                    }

                    if (pirate.CanPush(hole) && Main.mines.Any())
                    {
                        pirate.Push(hole, Main.mines.OrderBy(nearestShip.Distance).First());
                        Main.didTurn.Add(pirate.Id);
                        Main.wormsPushed.Add(hole);
                        return(Utils.GetPirateStatus(pirate, "Pushed hole away"));
                    }
                }
            }

            foreach (Pirate enemyHolder in sortedEnemyHolders)
            {
                game.Debug("pirate can push holder:  " + pirate.CanPush(enemyHolder));
                var    killLocation = Utils.NearestKillLocation(enemyHolder.Location);
                double maxDistance  = ((double)killLocation.Item1 + enemyHolder.MaxSpeed / 2);
                var    canKillAlone = maxDistance / pirate.PushDistance <= 1;

                if (canKillAlone)
                {
                    pirate.Push(enemyHolder, killLocation.Item2);
                    Main.didTurn.Add(pirate.Id);
                    Main.piratesPushed.Add(enemyHolder);
                    return(Utils.GetPirateStatus(pirate, "Killed enemy holder"));
                }

                // Initialize variables
                var pushHelpers = game.GetMyLivingPirates().Where(h => h.CanPush(enemyHolder) && !Main.didTurn.Contains(h.Id)).OrderBy(h => h.PushDistance);
                var killHelpers = pushHelpers.Where(h => h.Id != pirate.Id && ((double)killLocation.Item1 + enemyHolder.MaxSpeed / 2) / ((double)h.PushDistance + pirate.PushDistance) <= 1);

                // If they can kill him
                if (killHelpers.Any())
                {
                    var partner = killHelpers.OrderByDescending(h => maxDistance / ((double)h.PushDistance + pirate.PushDistance) <= 1).First();
                    pirate.Push(enemyHolder, killLocation.Item2);
                    partner.Push(enemyHolder, killLocation.Item2);
                    Main.didTurn.AddRange(new List <int> {
                        pirate.Id, partner.Id
                    });
                    Main.piratesPushed.Add(enemyHolder);
                    return(Utils.GetPirateStatus(pirate, "Couple killed enemy holder"));
                }

                // If they can make him drop his capsule but not kill him
                if (pushHelpers.Count() >= enemyHolder.NumPushesForCapsuleLoss)
                {
                    var pushers = pushHelpers.Take(enemyHolder.NumPushesForCapsuleLoss).ToList();

                    var pushLocation = Utils.NearestKillLocation(enemyHolder.GetLocation()).Item2;

                    if (Utils.NearestKillLocation(enemyHolder.GetLocation()).Item2.Distance(nearestCapsule) < nearestShip.Distance(nearestCapsule))
                    {
                        pushLocation = nearestShip.GetLocation();
                    }

                    pushers.ForEach(m => m.Push(enemyHolder, pushLocation));
                    Main.didTurn.AddRange(from p in pushers select p.Id);

                    Main.piratesPushed.Add(enemyHolder);
                    return(Utils.GetPirateStatus(pirate, enemyHolder.NumPushesForCapsuleLoss + " pirates droped the enemy capsule"));
                }

                // Boost enemy to closest dropers couple
                var  myMoles             = Utils.PiratesWithTask(TaskType.MOLE).ToList().Where(p => p.Id != pirate.Id && p.PushReloadTurns <= 1).OrderBy(p => p.Distance(nearestShip)).ToList();
                var  regularEnemyPirates = game.GetEnemyLivingPirates().Where(prt => !prt.HasCapsule()).ToList();
                bool shouldUseBuddies    = myMoles.Any() && pirate.PushRange + pirate.MaxSpeed / 2 < myMoles.OrderBy(pirate.Distance).First().Distance(pirate);
                bool enemyIsTerr         = Utils.HasMyBomb(enemyHolder);

                if (regularEnemyPirates.Any() && myMoles.Count() >= 2 && shouldUseBuddies && !enemyIsTerr)
                {
                    foreach (Pirate A in myMoles)
                    {
                        foreach (Pirate B in myMoles.Where(m => m.Id != A.Id))
                        {
                            if (A.Distance(pirate) < A.PushRange * 1.5)
                            {
                                continue;
                            }

                            var centerLoc    = Utils.Center(A.Location, B.Location);
                            var pushLocation = pirate.GetLocation().Towards(centerLoc, pirate.PushDistance - enemyHolder.MaxSpeed / 2);

                            bool checkI  = pushLocation.Distance(A) <= A.PushRange && pushLocation.Distance(B) <= B.PushRange;
                            bool checkII = enemyHolder.StateName == "normal";

                            // TODO add check if there is a booster close to the enemy pirate
                            if (checkI && checkII)
                            {
                                pirate.Push(enemyHolder, centerLoc);
                                Main.didTurn.Add(pirate.Id);
                                Main.piratesPushed.Add(enemyHolder);
                                return(Utils.GetPirateStatus(pirate, "Pushed pirates towards buddies!"));
                            }
                        }
                    }
                }
            }

            int radius      = (game.PushRange + game.HeavyPushDistance) / 3;
            int coupleIndex = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(nearestShip.Distance).ToList().IndexOf(pirate) / 2;

            if (coupleIndex > 0)
            {
                radius += game.HeavyPushDistance;
            }

            var loc = nearestShip.GetLocation().Towards(nearestCapsule, radius);


            foreach (Pirate enemyHolder in sortedEnemyHolders)
            {
                var CheckI   = enemyHolder.Distance(nearestShip) < 2 * pirate.PushRange + pirate.Distance(nearestShip);
                var CheckII  = pirate.PushReloadTurns <= (enemyHolder.Distance(nearestShip) - pirate.Distance(nearestShip)) / (2 * enemyHolder.MaxSpeed);
                var CheckIII = pirate.Distance(loc) < 2 * pirate.MaxSpeed;
                var CheckIV  = game.GetMyLivingPirates().Count(p => p.Id != pirate.Id && p.GetLocation().Col == pirate.Location.Col && p.GetLocation().Row == pirate.Location.Row) >= 1;
                //var CheckV = Utils.PiratesWithTask(TaskType.MOLE).OrderBy(enemyHolder.Distance).First().Id == pirate.Id;

                //game.Debug(CheckI + "   ||  " + CheckII + "   ||  " + CheckIII + "   ||  " + CheckIV + "   ||  "/*+ CheckV + "   ||  "*/);
                if (CheckI && CheckII && CheckIII && CheckIV /* && CheckV*/)
                {
                    return(Utils.GetPirateStatus(pirate, "Sailing out to enemy holder " + Sailing.SafeSail(pirate, enemyHolder.GetLocation())));
                }
            }

            return(Utils.GetPirateStatus(pirate, "Is sailing to position, " + Sailing.SafeSail(pirate, loc)));
        }