Exemple #1
0
        public static bool MoveOff(Beaver beaver)
        {
            if (!beaver.CanMove())
            {
                return(false);
            }

            var target = beaver.Tile.GetNeighbors().FirstOrDefault(n => n.IsPathable() && beaver.Moves >= GetMoveCost(beaver.Tile, n));

            return(target != null && beaver.Move(target));
        }
Exemple #2
0
        public static void MoveAndAttack(Beaver attacker, IEnumerable <Beaver> targets)
        {
            if (attacker.CanMove())
            {
                var targetPoints = targets
                                   .Where(t => t.Health > 0)
                                   .SelectMany(t => t.Tile.GetNeighbors().Select(n => n.ToPoint()));

                Move(attacker, targetPoints);
            }

            Attack(attacker, targets);
        }
Exemple #3
0
        public static void MoveAndDrop(Beaver dropper, IEnumerable <Tile> targets, string resource)
        {
            if (!dropper.CanAct() || dropper.GetCount(resource) == 0)
            {
                return;
            }

            if (dropper.CanMove())
            {
                var movePoints = targets.Concat(targets.SelectMany(t => t.GetNeighbors()))
                                 .Select(n => n.ToPoint());
                Move(dropper, movePoints);
            }

            Drop(dropper, targets, resource);
        }
Exemple #4
0
        public static void Move(Beaver mover, IEnumerable <Point> targets)
        {
            var targetPoints = targets.ToHashSet <Point>();

            if (mover.CanMove())
            {
                var search = new AStar <Point>(
                    new[] { mover.ToPoint() },
                    p => targetPoints.Contains(p),
                    (p1, p2) => GetMoveCost(p1.ToTile(), p2.ToTile()),
                    p => 0,
                    p => p.ToTile().GetReachableNeighbors(mover.Job.Moves).Select(t => t.ToPoint())
                    );

                MoveAlong(mover, search.Path);
            }
        }
Exemple #5
0
        public static void MoveAndHarvest(Beaver harvester, IEnumerable <Spawner> spawners)
        {
            if (harvester.OpenCarryCapacity() == 0)
            {
                return;
            }

            if (harvester.CanMove())
            {
                var movePoints = spawners
                                 .SelectMany(s => s.Tile.GetNeighbors().Select(n => n.ToPoint()));

                Move(harvester, movePoints);
            }

            Harvest(harvester, spawners);
        }
Exemple #6
0
        public static void MoveAndPickup(Beaver picker, IEnumerable <Tile> targets, string resource)
        {
            if (!picker.CanAct() || picker.OpenCarryCapacity() == 0)
            {
                return;
            }

            var targetPoints = targets.Where(t => t.GetCount(resource) > 0);

            if (picker.CanMove())
            {
                var movePoints = targetPoints.Concat(targetPoints.SelectMany(t => t.GetNeighbors()))
                                 .Select(n => n.ToPoint());
                Move(picker, movePoints);
            }

            Pickup(picker, targets, resource);
        }
Exemple #7
0
        public static void MoveAlong(Beaver beaver, IEnumerable <Point> steps, bool dontStopInDanger = false)
        {
            if (!steps.Any())
            {
                return;
            }

            IEnumerable <Point> dontStops = new Point[0];

            if (dontStopInDanger)
            {
                var fears = AI._Player.Opponent.Beavers
                            .Where(b => b.CanBeAttacked())
                            .Where(b => b.Job == AI.Basic || b.Job == AI.Fighter || b.Job == AI.Bulky || b.Job == AI.HotLady)
                            .Where(b => !b.Tile.GetNeighbors().Any(n => n.Beaver != null && n.Beaver.Owner == AI._Player));
                if (fears.Any())
                {
                    dontStops = AI._Game.Tiles.Where(t => fears.Select(b => b.ToPoint().ManhattanDistance(t.ToPoint())).Min() == 2)
                                .ToPoints()
                                .ToHashSet();
                }
            }

            AI.GoalLocations[beaver.Id] = steps.Last();
            if (!beaver.CanMove())
            {
                return;
            }

            var queue = steps.SkipWhile(p => p.Equals(beaver.ToPoint())).ToQueue();

            while (queue.Count > 0 && queue.Peek().ToTile().IsPathable() && GetMoveCost(beaver.Tile, queue.Peek().ToTile()) <= beaver.Moves && !dontStops.Contains(queue.Peek()))
            {
                beaver.Move(queue.Dequeue().ToTile());
            }
        }