Пример #1
0
		public int DoTurn(IPirateGame game)
		{
			int movesConsumed = 0;

			var pirates = game.MyPirates().Where(pirate => pirate.Id % 2 == 0).ToArray();

			var firingPirates = new HashSet<Pirate>();
			var firedUponTargets = new HashSet<Pirate>();
			var shootingTuples =
				from pirate in pirates
				from enemy in game.EnemyPiratesWithTreasures()
				where pirate.ReloadTurns == 0
				where pirate.TurnsToSober == 0
				where enemy.TurnsToSober == 0
				where game.Distance(pirate, enemy) <= 4
				select new { Pirate = pirate, Target = enemy };
			if (shootingTuples.Any())
			{
				foreach (var shootingTuple in shootingTuples)
				{
					if (!firingPirates.Contains(shootingTuple.Pirate) && !firedUponTargets.Contains(shootingTuple.Target))
					{
						firingPirates.Add(shootingTuple.Pirate);
						firedUponTargets.Add(shootingTuple.Target);
						game.Attack(shootingTuple.Pirate, shootingTuple.Target);
						movesConsumed++;
					}
				}
			}

			var piratesAndEnemies = pirates.Except(firingPirates).Select(pirate => Tuple.Create(pirate, game.GetEnemyPirate(pirate.Id))).ToList();

			if (piratesAndEnemies.Any())
			{
				// if any pirate needs to move, move only the first pirate
				var movingTuple = piratesAndEnemies.Where(pair => game.Distance(pair.Item1, pair.Item2.InitialLocation) > 2).FirstOrDefault();

				if (movingTuple != null)
				{
					var movingPirate = movingTuple.Item1;
					var enemyHomeBase = movingTuple.Item2.InitialLocation;
					int distance = Math.Min(4, game.Distance(movingPirate, enemyHomeBase) - 2);
					var sailOptions = game.GetSailOptions(movingPirate, enemyHomeBase, distance);
					game.SetSail(movingPirate, sailOptions[random.Next(sailOptions.Count)]);
					movesConsumed += distance;
				}
			}

			return movesConsumed;
		}
Пример #2
0
        // can we move the given Pirate to the given Location according to the number of moves?
        // if so --> move it!
        private static int move(PirateContainer p, Location t, int moves, IPirateGame game, bool dontHitEnemies = false)
        {
            if (moves == 0 || !p.AVALIBLE || p.P.Location.Equals(t))
            {
                return(0);
            }

            // calculate the best route
            foreach (Location l in game.GetSailOptions(p.P, t, moves))
            {
                if (!QueuedMotion.isOccupied(l, game, dontHitEnemies) && p.move(l, game))
                {
                    return(game.Distance(p.P, l));
                }
            }

            game.Debug("Failed to find a move for " + p.P.Id + " to " + t);
            return(0);
        }
 private void TakeAction(IPirateGame game, PirateTactics tactics)
 {
     if (TryBermuda(game, tactics.Pirate) == true)
     {
         return;
     }
     if (TryDefend(game, tactics.Pirate) == true)
     {
         return;
     }
     if (TryAttack(game, tactics.Pirate) == true)
     {
         return;
     }
     if (tactics.TempDestination != null)
     {
         game.SetSail(tactics.Pirate, tactics.TempDestination);
     }
 }
Пример #4
0
        private Island GetClosestIsland(IPirateGame state, Pirate myPirate, List <Island> islands)
        {
            // Move from the island
            // Move to closest attacked island
            //
            int    closetDIstance = int.MaxValue;
            Island closestIsland  = null;

            islands.ForEach(island =>
            {
                int distnace = state.Distance(myPirate, island);
                if (distnace < closetDIstance)
                {
                    closestIsland  = island;
                    closetDIstance = distnace;
                }
            });

            return(closestIsland);
        }
Пример #5
0
        // can we move the given Pirate to the given Location according to the number of moves?
        // if so --> move it!
        private static int move(PirateContainer p, Location t, int moves, IPirateGame game, bool dontHitEnemies = false)
        {
            if (moves == 0 || !p.AVALIBLE || p.P.Location.Equals(t))
            {
                return(0);
            }

            // calculate the best route

            /*foreach (Location l in game.GetSailOptions(p.P, t, moves))
             * {
             *      if (!QueuedMotion.isOccupied(l, game, dontHitEnemies) && p.move(l, game))
             *              return game.Distance(p.P, l);
             * }*/
            var X = from l in game.GetSailOptions(p.P, t, moves)
                    where (!QueuedMotion.isOccupied(l, game, dontHitEnemies) && p.move1(l, game))
                    select l;

            if (X.Count() > 0)
            {
                PirateContainer.free.Remove(p);

                Location loc = X.ElementAt(rand.Next(X.Count()));

                game.SetSail(p.P, loc);
                new QueuedMotion(p.P, loc);
                return(game.Distance(p.P, loc));
            }

            else if (X.Count() == 0)
            {
                if (PirateContainer.GetRemainingMoves() > 2)
                {
                    Location loc = p.P.Location;
                    p.move(loc, game);
                }
            }

            game.Debug("Failed to find a move for " + p.P.Id + " to " + t);
            return(0);
        }
Пример #6
0
 public void DoTurn(IPirateGame game)
 {
     if (game.GetTurn() == 1)
     {
         int s = 891;                //DateTime.Now.Millisecond;
         rand = new Random(s);
         game.Debug("seed: " + s);
     }
     try
     {
         this.game = game;
         turns     = game.GetActionsPerTurn();
         CheckBase();
         StopEnemies();
         ManagePlayZero();
     }
     catch (Exception e)
     {
         game.Debug(e.ToString());
     }
 }
Пример #7
0
        // returns a prioritised queue of targets for the given Pirate
        private List <Pirate> findTargetsFor(Pirate p, IPirateGame game)
        {
            // TODO: if kamikaze and in enemy InitialLocation, don't shoot the Pirate with the id for the location
            List <Pirate> res = new List <Pirate>();

            foreach (Pirate e in game.EnemySoberPirates())
            {
                if (game.InRange(p, e) && e.DefenseExpirationTurns == 0)
                {
                    if (!panic && e.ReloadTurns == 0)                    // if we aren't in panic, and we have no target, shoot the one that has ammo; TODO: alter ReloadTurns value
                    {
                        res.Add(e);
                    }
                    else if (e.HasTreasure)                    // always prioritise Pirates with Treasures
                    {
                        res.Insert(0, e);
                    }
                }
            }
            return(res);
        }
Пример #8
0
        private void DotCollectTurn(IPirateGame game)
        {
            var firstPirate = game.MyPirates().First(p => p.Id == 1);
            var secondPirate = game.MyPirates().First(p => p.Id == 3);
            var firstCandidate = GetCandidate(game, firstPirate);
            var secondCadidate = GetCandidate(game, secondPirate);

            game.Debug("First {0} Second {1}", firstPirate.HasTreasure, secondPirate.HasTreasure);
            if (!firstPirate.HasTreasure && !secondPirate.HasTreasure)
            {
                game.Debug("Move Fast");
                var candiate = firstCandidate.Distance <= secondCadidate.Distance ? firstCandidate : secondCadidate;
                MoveToTreasure(game, candiate, 2);
            }
            else
            {
                game.Debug("Move Slow");
                MovePirateSlow(game, firstCandidate);
                MovePirateSlow(game, secondCadidate);
            }
        }
Пример #9
0
        public bool move(Location l, IPirateGame game)
        {
            if (s != State.none && s != State.treasure)
            {
                game.Debug("State on Pirate " + P.Id + " cannot shift from " + s.ToString() + " to moved!");
                return(false);
            }
            int d = game.Distance(P, l);

            if (d > remainingMoves || (P.HasTreasure && d > 1))
            {
                game.Debug("Pirate " + P.Id + " cannot move, not enough moves!");
                return(false);
            }

            free.Remove(this);
            s = State.moved;
            game.SetSail(P, l);
            new QueuedMotion(P, l);
            return(true);
        }
Пример #10
0
        }         // 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]
Пример #11
0
        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;
                }
            }
        }
Пример #12
0
        //////////Methods//////////

        /// <summary>
        /// The method that the engine calls whenever our turn arrives
        /// </summary>
        public void DoTurn(IPirateGame game)
        {
            game.Debug("start turn at {0}", game.TimeRemaining());
            // if this is the first turn
            if (game.GetTurn() == 1)
            {
                // create a new game enviroment
                this.game = new Game(game);

                // initialize the event list, and fill it up!
                this.events = new List <Event>();
                this.AddEvents();

                // initialize the states manager, and fill it up!
                this.statesManager = new StatesManager();
                this.AddStates();

                // initialize the actions chooser
                this.actionsChooser = new ActionsChooser(this.game);
            }
            // if this is NOT the first turn
            else
            {
                // update the game enviroment
                this.game.Update(game);

                // update the states manager
                this.statesManager.Update(this.game);
            }

            this.game.Log(LogType.Timing, LogImportance.Important, "finish update at {0}", this.game.GetTimeRemaining());

            // run the best events for us
            this.UpdateChooser();
            this.game.Execute(this.actionsChooser);

            this.game.Log(LogType.Timing, LogImportance.ExtremelyImportant, "finish turn at {0}", this.game.GetTimeRemaining());
            game.Debug("real finish at {0}", game.TimeRemaining());
        }
Пример #13
0
        private PirateTactics AssignTargets(IPirateGame game, BoardStatus status)
        {
            PirateTactics tactics = new PirateTactics()
            {
                Pirate = status.Pirate
            };

            if (!tactics.Pirate.HasTreasure)
            {
                tactics.Moves            = game.GetActionsPerTurn();
                tactics.FinalDestination = status.Treasure.Location;
            }
            else
            {
                tactics.Moves            = 1;
                tactics.FinalDestination = status.Pirate.InitialLocation;
            }
            List <Location> possibleLocations = game.GetSailOptions(tactics.Pirate, tactics.FinalDestination, tactics.Moves);

            tactics.TempDestination = possibleLocations[0];
            return(tactics);
        }
Пример #14
0
        private void chooseMap(IPirateGame game)
        {
            string ts = "";

            foreach (Treasure t in game.Treasures())
            {
                ts += t.ToString();
            }
            int map = string.Format("{0}{1}{2}{3}", new object[] { game.Treasures().Count, ts, game.GetRows(), game.GetCols() }).GetHashCode();

            game.Debug("Map: " + map);


            Location l = new Location(1, 1);

            deadMap = (game.Treasures().Count == 1 && game.AllMyPirates().Count == game.AllEnemyPirates().Count);

            if (map == -918018829 || game.Treasures().Count < 2)
            {
                deadMap = true;
            }

            if (!deadMap)
            {
                rand = new Random(101010);                //79409223);//12486534
            }
            else
            {
                rand = new Random(12486534);
            }

            game.Debug((deadMap ? "Loaded deadmap config" : "Not the deadmap"));

            if (map == 1512814401 || deadMap)
            {
                throw new Exception("First turn skipped");
            }
        }         //chooses map
Пример #15
0
        private Pirate GetClosestPirate(IPirateGame state, Island island, List <Pirate> pirates)
        {
            // Move from the island
            // Move to closest attacked island
            //
            int    closetDIstance = int.MaxValue;
            Pirate closestPirate  = null;

            pirates.ForEach(pirate =>
            {
                if (!pirate.IsLost)
                {
                    int distnace = state.Distance(pirate, island);
                    if (distnace < closetDIstance)
                    {
                        closestPirate  = pirate;
                        closetDIstance = distnace;
                    }
                }
            });

            return(closestPirate);
        }
Пример #16
0
 private void MoveToBase(IPirateGame game, Pirate pirate)
 {
     game.Debug("Move pirate {0} home", pirate.Id);
     List<Location> possibleLocations = game.GetSailOptions(pirate, pirate.InitialLocation, 1);
     game.SetSail(pirate, possibleLocations[0]);
 }
Пример #17
0
        private void MoveToTreasure(IPirateGame game, PirateAndCandidate candiadte, int moves)
        {
            if (candiadte.Treasure == null)
            {
                return;
            }

            List<Location> possibleLocations = game.GetSailOptions(candiadte.Pirate, candiadte.Treasure.Location, moves);
            game.Debug("Move pirate {0} to treasure {1} with {2}", candiadte.Pirate.Id, candiadte.Treasure.Id, moves);
            game.SetSail(candiadte.Pirate, possibleLocations[0]);
        }
Пример #18
0
 private void MovePirateSlow(IPirateGame game, PirateAndCandidate candiadte)
 {
     if (candiadte.Pirate.HasTreasure)
     {
         MoveToBase(game, candiadte.Pirate);
     }
     else
     {
         MoveToTreasure(game, candiadte, 1);
     }
 }
Пример #19
0
        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;
                    }
                }
            }
        }
Пример #20
0
 public static bool IsTurnMultipleOf100(IPirateGame game)
 {
     return game.GetTurn() % 100 == 0;
 }
Пример #21
0
 private PirateAndCandidate GetCandidate(IPirateGame game, Pirate pirate)
 {
     var treasures = game.Treasures();
     var selectedTreasure = treasures.OrderBy(t => game.Distance(pirate, t)).FirstOrDefault();
     return new PirateAndCandidate
     {
         Pirate = pirate,
         Treasure = selectedTreasure,
         Distance = game.Distance(pirate, selectedTreasure)
     };
 }
Пример #22
0
        // calculations
        private void calcKamikazes(PirateContainer[] ps, ref Treasure[] ts, ref int[] ds, IPirateGame game)
        {
            // find the enemies pirate the closest to their base
            List <Pirate> es = new List <Pirate>();

            int[] eds = new int[game.EnemyPiratesWithTreasures().Count];
            foreach (Pirate e in game.EnemyPiratesWithTreasures())
            {
                eds[es.Count] = game.Distance(e, e.InitialLocation);
                es.Add(e);
            }
            List <int> edss = sortInto(eds);

            // map the kamikazes to the ps[]
            List <PirateContainer> unusedKamikazes     = new List <PirateContainer>(PirateContainer.kamikazes);
            List <int>             kamikazeDefinitions = new List <int>();

            for (int i = unusedKamikazes.Count; i > 0;)
            {
                if (unusedKamikazes[--i].P.HasTreasure)
                {
                    unusedKamikazes.RemoveAt(i);                    // if a kamikaze has treasure, deactivate it
                }
                else
                {
                    for (int j = 0; j < ps.Length; j++)
                    {
                        if (unusedKamikazes[i].Equals(ps[j]))
                        {
                            kamikazeDefinitions.Add(j);
                            break;
                        }
                    }
                }
            }

            for (int i = 0; i < es.Count && unusedKamikazes.Count > 0; i++)
            {
                // find closest kamikaze to the closest enemy to its initial position
                List <int> kds = new List <int>();
                foreach (PirateContainer p in unusedKamikazes)
                {
                    kds.Add(game.Distance(p.P, es[edss[i]]));
                }

                int min = -1;
                for (int j = 0; j < kds.Count; j++)
                {
                    if (min == -1 || kds[j] <= kds[min])
                    {
                        min = j;
                    }
                }

                // set the target
                int index = kamikazeDefinitions[min];
                ts[index] = new Treasure(100 + i, es[i].InitialLocation, 0);
                ds[index] = (int)Math.Ceiling(game.Distance(unusedKamikazes[min].P, es[i].InitialLocation) / 2f);
                if (ds[index] == 0)
                {
                    ds[index] = int.MaxValue;                    // speed up some things if the Pirate shouldn't move
                }
                unusedKamikazes.RemoveAt(min);
                kamikazeDefinitions.RemoveAt(min);
            }
        }
Пример #23
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");
        }
Пример #24
0
        public static List <PirateContainer> withTreasure; // list of all Pirates that have Treasure

        public static void init(IPirateGame game)
        {
            free         = new List <PirateContainer>();
            kamikazes    = new List <PirateContainer>();
            withTreasure = new List <PirateContainer>();
        }
Пример #25
0
 public void DoTurn(IPirateGame game)
 {
 }
Пример #26
0
        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);
            }
        }
Пример #27
0
 public void DoTurn(IPirateGame game)
 {
 }
Пример #28
0
        }         // checks wether to activate panic mode

        private bool inNowhereMode(IPirateGame game)
        {
            return(game.GetEnemyScore() == game.GetMyScore() && game.GetTurn() == (game.GetMaxTurns() / 3));
        }         // checks wether to activate nowhere mode
Пример #29
0
 public void DoTurn(IPirateGame game)
 {
     DotCollectTurn(game);
     yitzhakBot.DoTurn(game);
 }
Пример #30
0
 public void DoTurn(IPirateGame game)
 {
     if (MyBotUtils.IsTurnMultipleOf100(game)) {
         game.Debug("Turn number divides in 100.");
     }
 }
Пример #31
0
        public void DoTurn(IPirateGame game)
        {
            var myPirates = game.MyPirates();


        }
Пример #32
0
 public void DoTurn(IPirateGame game)
 {
     // Fill your code here
 }
Пример #33
0
        // this is the actual turn
        public void DoTurn(IPirateGame game)
        {
            int remaining = game.GetActionsPerTurn();

            if (game.GetTurn() == 1)
            {
                game.Debug("moves per turn: " + remaining);
            }

            try
            {
                #region init
                if (game.GetTurn() == 1)
                {
                    chooseMap(game);
                }
                nowhere = inNowhereMode(game);
                if (nowhere)
                {
                    game.Debug("ACTIVATING NOWHERE MODE");
                }
                panic = inPanicMode(game);
                if (panic)
                {
                    game.Debug("ACTIVATING PANIC MODE");
                }

                PirateContainer.init(game);
                QueuedAttack.init();
                QueuedMotion.init();
                int ships            = game.AllMyPirates().Count;
                PirateContainer[] ps = new PirateContainer[ships];
                int[]             ds = new int[ships];
                Treasure[]        ts = new Treasure[ships];
                #endregion

                calcBestTreasure(game, ships, ref ps, ref ds, ref ts);  // calculate the closest treasure to ps[i]
                BringBackTreasure(game, ref remaining);                 // move Pirates that have treasures towards the base
                calcKamikazes(ps, ref ts, ref ds, game);                // control the kamikazes

                //BringBackTreasure(game, ref remaining); // move Pirates that have treasures towards the base
                //Powerup pt = new SpeedPowerup(-1, new Location(0, 0), 0, 0, 0);

                #region power up calculations
                Powerup[] pu = (from l in game.Powerups()
                                where l.Type == "Speed"
                                select l).ToArray();

                if (pu.Count() > 0)
                {
                    Powerup[] puu = new Powerup[ships];
                    for (int i = pu.Count() - 1; i >= 0; i--)
                    {
                        puu[i] = pu[i];
                    }
                    game.Debug("A speed powerup was found");
                    int[] dis = new int[ships];



                    locatePowerups(game, ships, ref ps, ref dis, ref puu);

                    int chosen = -1;
                    for (int i = 0, min = int.MaxValue; i < ships; ++i)
                    {
                        if (dis[i] < min && ps[i].AVALIBLE && dis[i] != 0)                        //&& !ps[i].P.HasTreasure
                        {
                            min    = dis[i];
                            chosen = i;
                        }
                    }
                    game.Debug("Moving pirate " + chosen + " towards powerup");

                    if (chosen != -1)
                    {
                        game.Debug("Distance of chosen powerup - " + dis[chosen]);
                        if (puu[chosen] == null)
                        {
                            game.Debug("we found the problem");
                        }

                        remaining -= move(ps[chosen], puu[chosen].Location, remaining, game);
                    }
                }
                #endregion

                #region panic mode
                Pirate k = null, tar = null;
                if (panic)
                {
                    search_n_destroy(game, ref tar, ref k);                     // search and destroy, TODO: prioritise this!!!
                }
                #endregion

                List <int> dss = sortInto(ds);               // sort the ds into the dss


                attack(game);
                QueuedAttack.doAttacks(game, deadMap);

                #region move
                // 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
                        {
                            Location l = powerup(ps[i].P.Location, ts[i].Location, game);
                            int      mv;
                            if (l != null)
                            {
                                mv = move(ps[i], l, remaining, game);
                            }
                            else
                            {
                                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);
                        }
                    }
                }
                #endregion
            }
            catch (Exception e)
            {
                game.Debug("Crashed!");
                game.Debug(e.Message);
                game.Debug(e.StackTrace);
            }
            finally
            {
                WastedTurnsCounter += remaining;

                game.Debug("________");
                game.Debug("turn " + game.GetTurn() + " - moves summary");
                game.Debug("turns used: " + (game.GetActionsPerTurn() - remaining));
                game.Debug("turns wasted: " + remaining);
                game.Debug("________");
                game.Debug("game summary");
                game.Debug("turns used: " + (game.GetTurn() * game.GetActionsPerTurn() - WastedTurnsCounter) + "/" + (game.GetTurn() * game.GetActionsPerTurn()) + ", " + Math.Round((100 - (float)WastedTurnsCounter * 100 / (float)(game.GetTurn() * game.GetActionsPerTurn())), 2) + "% efficiency");
                game.Debug("turns wasted: " + WastedTurnsCounter);
            }
        }