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>(); }
public void Initialize(PirateGame game) { this.game = game; this.myPirates = game.GetMyLivingPirates().ToList(); // This gets overridden in MovePirates(). this.myCapsules = game.GetMyCapsules().ToList(); this.myMotherships = game.GetMyMotherships().ToList(); }
// ------------------------------------------ // Pirate functions // ------------------------------------------ private void MovePirates() { // Check if there is no mothership / capsule of ours to start playing defensive if (game.GetMyMotherships().Count() == 0 || game.GetMyCapsules().Count() == 0) { defense = true; HandleDefence(); } else { // This function will move our pirates. // The closest pirate to the capsule will go towards it. The second pirate will cover the spawn, the rest will attack the enemy pirates. // Addition 1: A number of pirates (NumPushesForCapsuleLoss) will camp the enemy mothership inbetween the capsule and the mothership myPirates = myPirates.OrderBy(pirate => pirate.Distance(myCapsules.OrderBy(capsule => capsule.Distance(pirate)).FirstOrDefault())).ToList(); // if(myPirates.Any(pirate => pirate.HasCapsule())) // { // // There is a pirate with a capsule. Make him go to the mothership // var capsuleHolder = myPirates.First(pirate => pirate.HasCapsule()); // capsuleHolder.Sail(game.GetMyMothership()); // Print("Pirate "+ capsuleHolder + " sails to "+ game.GetMyMothership()); // myPirates.Remove(capsuleHolder); // } myPirates = ManageCapsulePirates(); if (myPirates.Any()) { var currentPirate = myPirates.First(); currentPirate.Sail(GetCapsulePickupLocation()); Print("Pirate " + currentPirate + " sails to capsule at " + GetCapsulePickupLocation()); myPirates.Remove(currentPirate); } myPirates = InterceptCapsule(); // Pirates will remain unused below, only if there are no enemies. So you can simplify things a bit: if (game.GetEnemyLivingPirates().Any()) { foreach (var pirate in myPirates) { // Sort the enemies per their distance then their capsule possession. var enemies = game.GetEnemyLivingPirates() .OrderBy(enemy => enemy.Distance(pirate)) .OrderByDescending(enemy => enemy.HasCapsule()); if (!TryPush(pirate, enemies.First())) { // Sail to the pirate pirate.Sail(enemies.First()); Print("Pirate " + pirate + " sails to " + enemies.First()); } } } else { foreach (var left in myPirates) { Print("All enemy pirates are dead. Unused pirate: " + left); } } } }
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 MovePirates() { if (!game.GetMyMotherships().Any() || !game.GetMyCapsules().Any()) { // Handle game defensively. Defence(); } else { CaptureGameplay(); } }
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 double GetWeight() { if (pirate.HasCapsule()) { return(10000); } if (game.GetMyCapsules().Count() == 0 || Utils.FreeCapsulesByDistance(pirate.Location).Count() == 0 || Utils.PiratesWithTask(TaskType.MINER).Count >= game.GetMyCapsules().Count() || Utils.FreeCapsulesByDistance(pirate.Location).Count() == 0) { return(-Bias() - 50); } var cloestCapsule = Utils.FreeCapsulesByDistance(pirate.Location).First(); double maxDis = Main.unemployedPirates.Max(unemployed => unemployed.Distance(Utils.FreeCapsulesByDistance(unemployed.GetLocation()).Last())); double weight = ((double)(maxDis - pirate.Distance(cloestCapsule) / maxDis)) * 100; if (pirate.PushReloadTurns > 2) { weight += 20; } return(weight); }
override public int Bias() { var bonus = 0; if (Utils.EnemyHoldersByDistance(pirate.GetLocation()).Any() && Utils.EnemyHoldersByDistance(pirate.GetLocation()).First().InRange(pirate, pirate.PushRange)) { bonus = 30; } if (Utils.PiratesWithTask(TaskType.MOLE).Count >= 2 * game.GetMyCapsules().Count() - Utils.FreeCapsulesByDistance(pirate.Location).Count()) { return(1); } return(70 + bonus); }
public void DoTurn(PirateGame game) { Initialize(game); PushAsteroids(); PlantBombs(); HandleBombCarriers(); PushEnemyCapsulesAggressively(); if (!game.GetMyMotherships().Any() || !game.GetMyCapsules().Any()) { PerformDefensiveBunker(); HandleSwitchPirateStates(); } else { PerformAggressiveBunker(); HandleSwitchPirateStates(); DeliverCapsules(); CaptureCapsules(); } HandlePriorities(); PrintTargetLocations(GetAllTargetLocations()); MovePirates(); }
public static List <Capsule> FreeCapsulesByDistance(Location l) => game.GetMyCapsules().ToList().Where(cap => cap.Holder == null && !Main.capsulesTargetted.Values.Contains(cap)).OrderBy(cap => DistanceWithWormhole(cap.GetLocation(), l, 0)).ToList();
//-------------------------------------------- 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(); } }
override public string Preform() { if (!Utils.GetMyHolders().Any() || !game.GetMyCapsules().Any() || !game.GetAllMotherships().Any()) { if (Main.mines.Count > 0 && game.GetMyMotherships().Any()) { var sailLocation = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)).First().Location; return(Utils.GetPirateStatus(pirate, "Sailing to rendezvous point, " + Sailing.SafeSail(pirate, sailLocation))); } return(Utils.GetPirateStatus(pirate, "Is idle.")); } var holders = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)); var cloestHolder = holders.First(); foreach (Pirate holder in Utils.GetMyHolders().OrderBy(h => h.Distance(pirate))) { var nearestShip = Utils.OrderByDistance(game.GetMyMotherships().ToList(), holder.Location).First(); if (!pirate.CanPush(holder)) { var sailLocation = Utils.GetMyHolders().OrderBy(h => h.Distance(pirate)).First().Location; return(Utils.GetPirateStatus(pirate, "Sailing towards holder, " + Sailing.SafeSail(pirate, sailLocation))); } var threats = game.GetEnemyLivingPirates().Where(t => t.PushReloadTurns > 2 && t.Distance(nearestShip) < pirate.Distance(nearestShip) * 1.5).OrderBy(nearestShip.Distance); // Checks if the holder can be pushed directly onto the ship bool caseI = holder.Distance(nearestShip) - game.MothershipUnloadRange <= pirate.PushDistance + holder.MaxSpeed; bool caseII = false; if (threats.Any() && threats.First().Distance(nearestShip) > holder.Distance(nearestShip)) { caseII = holder.Distance(nearestShip) - threats.First().Distance(nearestShip) < pirate.PushRange; } var holderLocAfterPush = holder.GetLocation().Towards(nearestShip, pirate.PushDistance + holder.MaxSpeed / 2); bool caseIII_PI = threats.Any() && threats.First().Distance(nearestShip) < holder.Distance(nearestShip); bool caseIII_PII = threats.Any() && threats.First().PushRange < holderLocAfterPush.Distance(threats.First()); bool ImminentDeath = game.GetEnemyLivingPirates().Count(t => holder.InRange(t, holder.MaxSpeed + t.PushRange) && t.PushReloadTurns <= 1) >= holder.NumPushesForCapsuleLoss; if (ImminentDeath && !caseI && holder.MaxSpeed * 10 < holder.Distance(nearestShip)) { var safest = Sailing.SafestCloestLocation(holder.Location, nearestShip.Location, 2, true, pirate); pirate.Push(holder, safest); Main.piratesPushed.Add(holder); Main.didTurn.Add(pirate.Id); if (!Main.didTurn.Contains(holder.Id)) { holder.Push(pirate, safest); Main.piratesPushed.Add(pirate); Main.didTurn.Add(holder.Id); } return(Utils.GetPirateStatus(pirate, "Moved away from danger zone")); } bool caseIII = threats.Any() && caseIII_PI && caseIII_PII && ImminentDeath; game.Debug(caseI + " || " + caseII + " || " + caseIII + " +| IMD: " + ImminentDeath); if (caseI || caseIII) { if (Utils.GetMyHolders().Count() > 1) { var secondHolder = Utils.GetMyHolders().First(h => h.Id != holder.Id); if (!Main.didTurn.Contains(holder.Id) && holder.CanPush(secondHolder) && !Main.piratesPushed.Contains(secondHolder) && secondHolder.Distance(nearestShip) - nearestShip.UnloadRange < pirate.PushDistance + secondHolder.MaxSpeed) { holder.Push(secondHolder, nearestShip); Main.piratesPushed.Add(secondHolder); pirate.Push(holder, nearestShip); Main.piratesPushed.Add(holder); if (!Main.didTurn.Contains(secondHolder.Id) && holder.NumPushesForCapsuleLoss > 2 && secondHolder.CanPush(holder)) { secondHolder.Push(holder, nearestShip); Main.piratesPushed.Add(holder); } Main.didTurn.Add(holder.Id); Main.didTurn.Add(pirate.Id); return(Utils.GetPirateStatus(pirate, "Pushed holder to the motherShip while the holder boosted another holder")); } } if (!Main.didTurn.Contains(holder.Id)) { holder.Sail(nearestShip); Main.didTurn.Add(holder.Id); } pirate.Push(holder, nearestShip); Main.didTurn.Add(pirate.Id); Main.piratesPushed.Add(holder); return(Utils.GetPirateStatus(pirate, "Pushed holder directly to ship")); } Main.holdersPaired.Add(holder); return(Utils.GetPirateStatus(pirate, "Sailing towards paired holder, " + Sailing.SafeSail(pirate, holder.Location))); } return("Did nothing"); }