private void locatePowerups(IPirateGame game, int ships, ref PirateContainer[] ps, ref int[] ds, ref Powerup[] pu) { for (int i = 0; i < ships; i++) { //if (game.GetMyPirate(i).HasTreasure) //break; ps[i] = new PirateContainer(game.GetMyPirate(i), (i % 2) == 1); ds[i] = int.MaxValue; foreach (Powerup p in pu) { if (p == null) { break; } //game.Debug("here is the prub: " + i + " - " + p); int d = game.Distance(ps[i].P.Location, p.Location); if (d < ds[i]) { ds[i] = d; pu[i] = p; game.Debug("Powerup found in distance " + d + " for ship " + i); } } } } // calculates the closest powerups to ps[i]
} // checks wether to activate nowhere mode private void calcBestTreasure(IPirateGame game, int ships, ref PirateContainer[] ps, ref int[] ds, ref Treasure[] ts) { for (int i = 0; i < ships; i++) { ps[i] = new PirateContainer(game.GetMyPirate(i), (i % 2) == 1); ds[i] = int.MaxValue; foreach (Treasure t in game.Treasures()) { int d = game.Distance(ps[i].P, t) / t.Value; if (powerup(ps[i].P.Location, t.Location, game) != null) { d -= 3; } if (d < ds[i]) { ds[i] = d; ts[i] = t; } } } } // calculates the closest treasure to ps[i]
public void DoTurn(IPirateGame game) { int reamaining = 6; Pirate[] ps = new Pirate[4]; for (int i = 0; i < 4; i++) { ps[i] = game.GetMyPirate(i); } List <Pirate> ltp = game.MyPiratesWithTreasures(); reamaining -= ltp.Count; foreach (Pirate p in ltp) { game.SetSail(p, game.GetSailOptions(p, p.InitialLocation, 1)[0]); } for (int i = 0; i < 4; i++) { if (!ps[i].HasTreasure) { Treasure cull = null; int minD = int.MaxValue; foreach (Treasure t in game.Treasures()) { if (game.Distance(ps[i], t) < minD) { minD = game.Distance(ps[i], t); cull = t; } } game.SetSail(ps[i], game.GetSailOptions(ps[i], cull, reamaining)[0]); reamaining = 0; break; } } }
public void DoTurn(IPirateGame game) { int remaining = 6; Pirate[] ps = new Pirate[4]; Location[] l = new Location[4]; int[] ds = new int[4]; List <int> dss = new List <int>(); // should always be size 4 for (int i = 0; i < 4; i++) { ps[i] = game.GetMyPirate(i); ds[i] = int.MaxValue; foreach (Treasure t in game.Treasures()) { if (game.Distance(ps[i], t) < ds[i]) { ds[i] = game.Distance(ps[i], t); l[i] = t.Location; } } } // sort the ds into the dss { bool add; do { add = false; int min = -1; for (int i = 0; i < ds.Length; i++) { if (!dss.Contains(i)) { if (min == -1 || ds[i] <= ds[min]) { min = i; add = true; } } } if (add) { dss.Add(min); } } while (add); } List <Pirate> ltp = game.MyPiratesWithTreasures(); remaining -= ltp.Count; foreach (Pirate p in ltp) { game.SetSail(p, game.GetSailOptions(p, p.InitialLocation, 1)[0]); } if (game.Treasures().Count == 0) { return; } for (int j = 0; j < 4; j++) { int i = dss[j]; if (!ps[i].HasTreasure) { bool attacked = false; if (ps[i].ReloadTurns == 0) { foreach (Pirate e in game.EnemySoberPirates()) { if (game.InRange(ps[i], e)) { game.Attack(ps[i], e); attacked = true; break; } } } if (!attacked && ps[i].TurnsToSober == 0 && ps[i].TurnsToRevive == 0) { game.SetSail(ps[i], game.GetSailOptions(ps[i], /*cull*/ l[i], remaining)[0]); remaining = 0; } } } }
// this is the actual turn public void DoTurn(IPirateGame game) { if (game.GetTurn() == 1) { rand = new Random(42934837); //,,79409223 if (game.AllEnemyPirates().Count > game.AllMyPirates().Count) { rand = new Random(31400000); } Location l = new Location(1, 1); if (game.Treasures().Count == 1 && game.AllMyPirates().Count == game.AllEnemyPirates().Count) { deadMap = true; } game.Debug((deadMap ? "DEADMAP!!!" : "NIE!")); if (deadMap) { return; // this stops some fighting over treasures } } nowhere = (game.GetEnemyScore() == game.GetMyScore() && game.GetTurn() == (game.GetMaxTurns() / 3)); if (nowhere) { game.Debug("ACTIVATING NOWHERE MODE!!!"); } panic = (((game.Treasures().Count == 0 || game.GetEnemyScore() >= (game.GetMaxPoints() - 2))) && game.EnemyPiratesWithTreasures().Count > 0); if (panic) { game.Debug("ACTIVATING PANIC MODE!!!"); } PirateContainer.init(game); QueuedAttack.init(); QueuedMotion.init(); int remaining = game.GetActionsPerTurn(); int ships = game.AllMyPirates().Count; try { // calculate the closest treasure to ps[i] PirateContainer[] ps = new PirateContainer[ships]; int[] ds = new int[ships]; Treasure[] ts = new Treasure[ships]; for (int i = 0; i < ships; i++) { ps[i] = new PirateContainer(game.GetMyPirate(i), (i % 2) == 1); ds[i] = int.MaxValue; foreach (Treasure t in game.Treasures()) { if (game.Distance(ps[i].P, t) < ds[i]) { ds[i] = game.Distance(ps[i].P, t); ts[i] = t; } } } // control the kamikazes calcKamikazes(ps, ref ts, ref ds, game); // move Pirates that have treasures towards the base { List <PirateContainer> ltp = PirateContainer.withTreasure; foreach (PirateContainer p in ltp) { List <Pirate> es = findEnemiesFor(p.P, game); if (es.Count > 0 && p.P.ReloadTurns == 0) { p.defend(game); } else { remaining -= move(p, p.P.InitialLocation, 1, game, true); } } } // search and destroy, TODO: prioritise this!!! Pirate k = null, tar = null; if (panic) { int mx = (game.GetRows() + game.GetCols() - game.GetAttackRadius()) / game.GetActionsPerTurn(); // turns it takes to get from a corner to its opposing corner int d = int.MaxValue; tar = game.EnemyPiratesWithTreasures()[0]; // TODO: focus on closest to enemy base // find closest Pirate foreach (PirateContainer p in PirateContainer.free) // notice all pirates with Treasure already moved, see: ltp { game.Debug("panic->k testing for " + p.P.Id + " | " + d); game.Debug(p.AVALIBLE + " && " + (p.P.ReloadTurns < mx) + " && " + (d > game.Distance(p.P, tar))); if (p.AVALIBLE && p.P.ReloadTurns < mx && d > game.Distance(p.P, tar)) { d = game.Distance(p.P, tar); k = p.P; game.Debug("panic->k = " + p.P.Id + " | " + d); } } if (k == null) // no Pirate with ammo, so choose the closest to the InitialLocation then move to there { foreach (PirateContainer p in PirateContainer.free) // notice all pirates with Treasure already moved, see: ltp { if (p.AVALIBLE && d > game.Distance(p.P, tar.InitialLocation)) // TODO: make the "6" generic to board size { d = game.Distance(p.P, tar.InitialLocation); k = p.P; } } } } List <int> dss = sortInto(ds); // sort the ds into the dss // AAAAATTTTTTTTTTTTAAAAAAAAAAACCCCCCCCKKKKKKKKKKKKKKK!!!!!!!!!!!!!!!! (or defend...) for (int i = PirateContainer.free.Count; i > 0;) { PirateContainer p = PirateContainer.free[--i]; if (p.P.ReloadTurns == 0 && !p.P.HasTreasure && p.AVALIBLE) { List <Pirate> es = findTargetsFor(p.P, game); if (es.Count > 0) { new QueuedAttack(p, es); } } } QueuedAttack.doAttacks(game, deadMap); // move for (int j = 0; j < ships; j++) { int i = dss[j]; if (ps[i].S == PirateContainer.State.none && ps[i].AVALIBLE && !ps[i].P.HasTreasure) { if (game.Treasures().Count > 0) // use typical motion { int mv = move(ps[i], ts[i].Location, remaining, game); if (mv > 0) { remaining -= mv; continue; } } if (game.EnemyPiratesWithTreasures().Count > 0 && ps[i].P == k) // activate search and destroy { remaining -= move(ps[i], tar.Location, remaining, game); } } } } catch (Exception e) { game.Debug("Crashed!"); game.Debug(e.Message); game.Debug(e.StackTrace); } game.Debug("turn " + game.GetTurn() + ": ran " + (game.GetActionsPerTurn() - remaining) + " motions"); }
public void DoTurn(IPirateGame game) { try { int remaining = 6; Pirate[] ps = new Pirate[4]; int[] ds = new int[4]; List <int> dss = new List <int>();// should always be size 4 for (int i = 0; i < 4; i++) { ps[i] = game.GetMyPirate(i); ds[i] = int.MaxValue; if (game.Treasures().Contains(ts[i])) { continue; } foreach (Treasure t in game.Treasures()) { if (game.Distance(ps[i], t) < ds[i]) { ds[i] = game.Distance(ps[i], t); //ts[i] = t; } } } // sort the ds into the dss { bool add; do { add = false; int min = -1; for (int i = 0; i < ds.Length; i++) { if (!dss.Contains(i)) { if (min == -1 || ds[i] <= ds[min]) { min = i; add = true; } } } if (add) { dss.Add(min); } } while (add); } if (kamikaze) { if (ps[0].InitialLocation.Equals(new Location(23, 1))) { ts[3] = new Treasure(19, new Location(17, 19)); ts[1] = new Treasure(20, new Location(24, 30)); ts[2] = new Treasure(20, new Location(25, 29)); ts[0] = new Treasure(20, new Location(26, 28)); } else { ts[3] = new Treasure(19, new Location(17, 13)); ts[1] = new Treasure(20, new Location(24, 2)); ts[2] = new Treasure(20, new Location(25, 3)); ts[0] = new Treasure(20, new Location(26, 4)); } ds[0] = 0; ds[1] = 0; ds[2] = 0; ds[3] = 0; } List <Pirate> ltp = game.MyPiratesWithTreasures(); remaining -= ltp.Count; foreach (Pirate p in ltp) { move(p, p.InitialLocation, 1, game); } Pirate k = null, tar = null; if (game.Treasures().Count == 0 && game.EnemyPiratesWithTreasures().Count > 0) { int d = int.MaxValue; tar = game.EnemyPiratesWithTreasures()[0]; foreach (Pirate p in game.MyPiratesWithoutTreasures()) { if (p.TurnsToSober == 0 && p.ReloadTurns < 6 && d > game.Distance(p, tar)) { d = game.Distance(p, tar); k = p; } } } for (int j = 0; j < 4; j++) { int i = dss[j]; if (!ps[i].HasTreasure) { bool attacked = false; if (ps[i].ReloadTurns == 0) { Pirate t = null; foreach (Pirate e in game.EnemySoberPirates()) { if (game.InRange(ps[i], e)) { if (e.ReloadTurns == 0) { t = e; break; } else if (e.HasTreasure) { if (t == null || t.HasTreasure || t.ReloadTurns > 0) { t = e; } } else if (e.ReloadTurns > 0 && !e.HasTreasure) { continue; } } } if (t != null) { game.Attack(ps[i], t); attacked = true; } } if (!attacked && ps[i].TurnsToSober == 0 && ps[i].TurnsToRevive == 0) { if ((game.Treasures().Count > 0 && move(ps[i], ts[i].Location, remaining, game) || (game.EnemyPiratesWithTreasures().Count > 0 && ps[i] == k && move(ps[i], tar.Location, remaining, game)))) { remaining = 0; } } } } } catch (Exception e) { game.Debug("Crashed!"); game.Debug(e.Message); game.Debug(e.StackTrace); } }