예제 #1
0
 private void Initialize(PirateGame pirateGame)
 {
     game         = pirateGame;
     FinishedTurn = new Dictionary <Pirate, bool>();
     myPirates    = game.GetMyLivingPirates().ToList();
     scale        = (((double)(game.Cols.Power(2) + game.Rows.Power(2))).Sqrt());
     NumOfAssignedPiratesToWormhole = new Dictionary <Wormhole, int>();
     NewWormholeLocation            = new Dictionary <Wormhole, Location>();
     foreach (Wormhole wormhole in game.GetAllWormholes())
     {
         NewWormholeLocation.Add(wormhole, wormhole.Location);
         NumOfAssignedPiratesToWormhole.Add(wormhole, 0);
     }
     enemyCapsulesPushes = game.GetEnemyCapsules().ToDictionary(key => key, value => 0);
     pirateDestinations  = new Dictionary <Pirate, Location>();
     //bunkeringPirates = new List<Pirate>();
     asteroids = new Dictionary <Asteroid, bool>();
     foreach (Pirate pirate in myPirates)
     {
         FinishedTurn.Add(pirate, false);
     }
     foreach (var asteroid in game.GetLivingAsteroids())
     {
         asteroids.Add(asteroid, false);
     }
     defense     = game.GetMyMotherships().Count() == 0 || game.GetMyCapsules().Count() == 0;
     piratePairs = new Dictionary <Pirate, Pirate>();
 }
예제 #2
0
 private void Initialize(PirateGame pirateGame)
 {
     game = pirateGame;
     availableAsteroids = game.GetLivingAsteroids().ToList();
     availablePirates   = pirateGame.GetMyLivingPirates().ToList();
     pirateDestinations = new Dictionary <Pirate, Location>();
     enemyCapsulePushes = new Dictionary <Capsule, int>();
     foreach (var capsule in game.GetEnemyCapsules())
     {
         enemyCapsulePushes[capsule] = 0;
     }
     bunkeringPirates           = new List <Pirate>();
     myPiratesWithCapsulePushes = game.GetMyLivingPirates().Where(p => p.HasCapsule()).ToDictionary(pirate => pirate, pirate => 0);
 }
예제 #3
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);
     }
 }
예제 #4
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())));
        }
예제 #5
0
 public static List <Asteroid> AsteroidsByDistance(Location l) => game.GetLivingAsteroids().OrderBy(asteroid => asteroid.Distance(l)).ToList();
예제 #6
0
파일: Bot4.cs 프로젝트: mahmoudkh24/Skillz
        private void CaptureGameplay()
        {
            // This gameplay means the bot will play as normal, go grab the capsule and kill the enemy's capsule holder.
            var usedPirates = new List <Pirate>();

            foreach (var pirate in myPirates)
            {
                // Get the asteroids that are near our pirates.
                var asteroidsOrdered = game.GetLivingAsteroids().Where(asteroid => asteroid.Location.Add(asteroid.Direction).InRange(pirate, pirate.PushRange * 2));//change game to pirate if they delete the game.pushRange in the future we are ready(Mahmoud)
                if (asteroidsOrdered.Any())
                {
                    // There is an asteroid near us. Push it.
                    if (DefensivePush(pirate, asteroidsOrdered.FirstOrDefault()))
                    {
                        usedPirates.Add(pirate);
                    }
                }
                else if (game.GetLivingAsteroids().Where(asteroid => asteroid.InRange(pirate, game.PushRange)).Any())
                {
                    asteroidsOrdered = game.GetLivingAsteroids().Where(asteroid => asteroid.InRange(pirate, game.PushRange));
                    if (DefensivePush(pirate, asteroidsOrdered.First()))
                    {
                        usedPirates.Add(pirate);
                    }
                }
            }
            myPirates = myPirates.Except(usedPirates).ToList();

            // Grab our capsules.
            foreach (var capsule in myCapsules)
            {
                if (capsule.Holder == null)
                {
                    // Order my pirates according to the distance and go towards the capsule.
                    var closestPirate = myPirates.OrderBy(pirate => pirate.Distance(capsule)).Where(pirate => !pirate.HasCapsule()).FirstOrDefault();
                    if (closestPirate != null)
                    {
                        // Send that pirate towards the capsule.
                        closestPirate.Sail(capsule);
                        myPirates = myPirates.Where(pirate => !pirate.Equals(closestPirate)).ToList();
                    }
                }
                if (capsule.Holder != null)
                {
                    // Send the capsule holder towards the closest mothership.
                    var holder            = capsule.Holder;
                    var closestMothership = myMotherships.OrderBy(mothership => holder.Distance(mothership)).FirstOrDefault();
                    if (closestMothership != null && myPirates.Contains(holder))
                    {
                        // Sail towards the mothership.
                        SmartSailing(holder, closestMothership);
                        Print("Capsule holder " + holder.ToString() + " sails towards mothership " + closestMothership.ToString());
                        myPirates = myPirates.Where(pirate => !pirate.Equals(holder)).ToList();
                    }
                    if (myPirates.Count() > myCapsules.Count())
                    {
                        var closestPirateToSpawn = myPirates.OrderBy(pirate => pirate.Distance(capsule.InitialLocation)).Where(pirate => !pirate.HasCapsule()).FirstOrDefault();
                        if (closestPirateToSpawn != null)
                        {
                            // Send the pirate to the spawn to wait for the capsule
                            closestPirateToSpawn.Sail(capsule.InitialLocation);
                            Print("Pirate " + closestPirateToSpawn.ToString() + " sails towards capsule spawn at " + capsule.InitialLocation);
                            myPirates = myPirates.Where(pirate => !pirate.Equals(closestPirateToSpawn)).ToList();
                        }
                    }
                }
            }

            // We start by intercepting enemy capsules.
            foreach (var mothership in enemyMotherships)
            {
                // Sort the capsules per their distance to this mothership
                var closestEnemyCapsules = enemyCapsules.OrderBy(cap => cap.Distance(mothership)).FirstOrDefault();
                if (closestEnemyCapsules != null && enemyPirates.Any(enemy => enemy.HasCapsule() && enemy.Capsule.Equals(closestEnemyCapsules)))
                {
                    var capsuleHolder = enemyPirates.First(enemy => enemy.HasCapsule() && enemy.Capsule.Equals(closestEnemyCapsules));
                    // Interecept that capsule.
                    var orderedPirates = myPirates.OrderBy(pirate => pirate.Distance(closestEnemyCapsules))
                                         .Where(pirate => pirate.Distance(mothership) < closestEnemyCapsules.Distance(mothership));
                    if (orderedPirates.Count() >= game.NumPushesForCapsuleLoss)
                    {
                        // Take the first pirates and send them to the interception.
                        var dest = mothership.Location.Towards(closestEnemyCapsules, (int)(game.MothershipUnloadRange * 0.5));
                        // Send the pirates.
                        usedPirates = new List <Pirate>();
                        foreach (var pirate in orderedPirates.Take(game.NumPushesForCapsuleLoss))
                        {
                            if (pirate.Location.Equals(dest))
                            {
                                // Keep trying to push
                                DefensivePush(pirate, capsuleHolder);
                            }
                            else
                            {
                                pirate.Sail(dest);
                                Print("Pirate " + pirate.ToString() + " sails towards interception " + dest);
                            }
                            usedPirates.Add(pirate);
                        }
                        myPirates = myPirates.Except(usedPirates).ToList();
                    }
                }
            }

            // Make the rest of the pirates attack their closest enemy that they can attack.
            foreach (var pirate in myPirates)
            {
                var orderedEnemies = enemyPirates.OrderBy(enemy => enemy.Distance(pirate)).OrderBy(enemy => enemy.HasCapsule());
                if (orderedEnemies.Any(enemy => enemy.Distance(pirate) / enemy.MaxSpeed > pirate.PushReloadTurns))
                {
                    var toAttack = orderedEnemies.Where(enemy => enemy.Distance(pirate) / enemy.MaxSpeed > pirate.PushReloadTurns).First();
                    if (!DefensivePush(pirate, toAttack))
                    {
                        // Sail towards that pirate.
                        pirate.Sail(toAttack);
                        Print("Pirate " + pirate.ToString() + " sails towards " + toAttack.ToString());
                    }
                }
                else if (orderedEnemies.Any())
                {
                    // Attack first pirate.
                    if (!DefensivePush(pirate, orderedEnemies.First()))
                    {
                        // Sail towards that pirate.
                        pirate.Sail(orderedEnemies.First());
                        Print("Pirate " + pirate.ToString() + " sails towards " + orderedEnemies.First().ToString());
                    }
                }
            }
        }