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))); } } } } } }
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 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(); }
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); } }
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))); } } } }
/// <summary> Tries to kill an enemy, alone or with other pirates </summary> /// <returns> A tuple with bool and the action string </returns> protected static Tuple <bool, string> TryKill(Pirate pirate) { foreach (Pirate enemy in game.GetEnemyLivingPirates().OrderBy(pirate.Distance).Where(e => pirate.CanPush(e))) { var killLocation = Utils.NearestKillLocation(enemy.Location); if (((double)killLocation.Item1 + enemy.MaxSpeed / 2) / pirate.PushDistance <= 1) { pirate.Push(enemy, killLocation.Item2); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(enemy); return(new Tuple <bool, string>(true, "Killed enemy")); } double killCost = killLocation.Item1 + ((double)enemy.MaxSpeed / 2); var helpers = game.GetMyLivingPirates().Where(h => h.CanPush(enemy) && h.Id != pirate.Id && !Main.didTurn.Contains(h.Id)).OrderBy(h => h.PushDistance); var killHelpers = helpers.Where(h => killCost / ((double)h.PushDistance + pirate.PushDistance) <= 1); if (killHelpers.Any()) { var partner = killHelpers.OrderByDescending(h => killCost / ((double)h.PushDistance + pirate.PushDistance) <= 1).First(); pirate.Push(enemy, killLocation.Item2); Main.didTurn.Add(pirate.Id); partner.Push(enemy, killLocation.Item2); Main.didTurn.Add(partner.Id); Main.piratesPushed.Add(enemy); return(new Tuple <bool, string>(true, "Couple killed holder")); } if (enemy.HasCapsule() && game.GetEnemyCapsules().ToList().Any() && game.GetEnemyMotherships().ToList().Any()) { var nearestCapsule = Utils.OrderByDistance(game.GetEnemyCapsules().ToList(), pirate.Location).First(); var nearestShip = Utils.OrderByDistance(game.GetEnemyMotherships().ToList(), nearestCapsule.Location).First(); // If they can make him drop his capsule but not kill him if (helpers.Count() + 1 >= enemy.NumPushesForCapsuleLoss) { var pushers = helpers.Take(enemy.NumPushesForCapsuleLoss - 1).ToList(); pushers.Add(pirate); var pushLocation = Utils.NearestKillLocation(enemy.GetLocation()).Item2; if (Utils.NearestKillLocation(enemy.GetLocation()).Item2.Distance(nearestCapsule) < nearestShip.Distance(nearestCapsule)) { pushLocation = nearestShip.GetLocation(); } pushers.ForEach(m => m.Push(enemy, pushLocation)); Main.didTurn.AddRange(from p in pushers select p.Id); Main.piratesPushed.Add(enemy); return(new Tuple <bool, string>(true, " pirates droped the enemy capsule")); } } } return(new Tuple <bool, string>(false, "Did not run")); }
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))); }
//-------------------------------------------- public void DoTurn(PirateGame game) { Main.game = game; ///* game.Debug("Kol od baleivav penimah"); game.Debug("Nefesh Yehudi homiyah,"); game.Debug("Ul(e)faatei mizrach kadimah,"); game.Debug("Ayin leTziyon tzofiyah;"); game.Debug(""); game.Debug("Od lo avdah tikvateinu,"); game.Debug("Hatikvah bat sh(e)not alpayim,"); game.Debug("Lihyot am chofshi b(e)artzeinu,"); game.Debug("Eretz-Tziyon virushalayim."); game.Debug(""); //*/ if (goStick.Any() && !game.GetMyPirateById(goStick.First().Id).IsAlive()) { goStick.Clear(); } // Clearing objects didTurn.Clear(); sailToworm.Clear(); capsulesTargetted.Clear(); asteroidsPushed.Clear(); piratesPushed.Clear(); wormsPushed.Clear(); // Gettings the mines if (game.GetMyCapsules().Any() && game.Turn == 1) { game.GetMyCapsules().Where(cap => cap.Holder == null && !mines.Contains(cap.Location)).ToList().ForEach(cap => mines.Add(cap.Location)); } if (game.GetEnemyCapsules().Any() && game.Turn == 1) { game.GetEnemyCapsules().Where(cap => cap.Holder == null && !enemyMines.Contains(cap.Location)).ToList().ForEach(cap => enemyMines.Add(cap.Location)); } unemployedPirates = game.GetMyLivingPirates().ToList(); HandTasks(); foreach (Pirate pirate in game.GetMyLivingPirates().Where(p => p.StateName != game.STATE_NAME_HEAVY).OrderByDescending(p => tasks[p.Id].Item2.HeavyWeight())) { if (tasks[pirate.Id].Item2.HeavyWeight() <= 0) { break; } var switchWith = game.GetMyLivingPirates().Where(p => p.Id != pirate.Id && tasks[p.Id].Item2.HeavyWeight() < tasks[pirate.Id].Item2.HeavyWeight() && p.StateName == game.STATE_NAME_HEAVY) .OrderBy(p => tasks[p.Id].Item2.HeavyWeight()); bool shouldNotSwitch = game.__livingAsteroids.Any(a => pirate.Distance(a) < pirate.MaxSpeed * 5) || game.GetEnemyLivingPirates().Any(e => pirate.Distance(e) < pirate.MaxSpeed * 3.5); if (shouldNotSwitch) { break; } if (switchWith.Any() && pirate.StateName != game.STATE_NAME_HEAVY) { switchWith.First().SwapStates(pirate); didTurn.Add(switchWith.First().Id); break; } } foreach (KeyValuePair <int, Tuple <TaskType, Task> > pair in tasks.OrderByDescending(pair => pair.Value.Item2.Priority())) { try { var preform = pair.Value.Item2.Preform(); if (debug) { game.Debug(preform); } } catch (System.Exception e) { game.Debug(e.Message); } } if (stopStick == true) { Main.goStick.Clear(); } }