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>(); }
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); }
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); } }
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()))); }
public static List <Asteroid> AsteroidsByDistance(Location l) => game.GetLivingAsteroids().OrderBy(asteroid => asteroid.Distance(l)).ToList();
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()); } } } }