Ejemplo n.º 1
0
        }         // calculates the closest powerups to ps[i]

        // 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.S != PirateContainer.State.moved) || p.P.Location.Equals(t))
            {
                return(0);
            }

            var X = from l in game.GetSailOptions(p.P, t, moves)
                    where (!QueuedMotion.isOccupied(l, game, dontHitEnemies) && p.move1(l, game, moves))
                    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));
            }

            game.Debug("Failed to find a move for " + p.P.Id + " to " + t);
            return(0);
        }
Ejemplo n.º 2
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);
            }
        }