Exemple #1
0
 public void EngageBeaverAndFood(Beaver beaver, Spawner cattail, Point[] path)
 {
     Solver.MoveAlong(beaver, path);
     if (beaver.ToPoint().Equals(path.Last()))
     {
         Solver.Harvest(beaver, new[] { cattail });
     }
 }
Exemple #2
0
 public void MoveBeaverAndDrop(Beaver beaver, Tile lodge, Point[] path)
 {
     Solver.MoveAlong(beaver, path);
     if (beaver.ToPoint().Equals(path.Last()))
     {
         Solver.Drop(beaver, new[] { lodge }, "food");
     }
 }
Exemple #3
0
 public void BuildLodge(Beaver beaver)
 {
     if (beaver.CanAct() && beaver.CanBuildLodge())
     {
         Console.WriteLine("    Build Lodge: {0}, {1}+{2}/{3}", beaver.ToPoint(), beaver.Branches, beaver.Tile.Branches, this.Player.BranchesToBuildLodge);
         beaver.BuildLodge();
     }
 }
Exemple #4
0
 public void BasicEngageBeaverAndTree(Beaver beaver, Spawner tree, Point[] path)
 {
     BuildLodge(beaver);
     Solver.Harvest(beaver, new[] { tree });
     Solver.MoveAlong(beaver, path);
     if (beaver.ToPoint().Equals(path.Last()))
     {
         Solver.Drop(beaver, new[] { beaver.Tile }, "branches");
         Solver.Harvest(beaver, new[] { tree });
     }
     BuildLodge(beaver);
 }
Exemple #5
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 #6
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());
            }
        }
Exemple #7
0
        public void EngageBeaverAndTree(Beaver beaver, Spawner tree, Point[] path)
        {
            var safeDistance    = 5;
            var enemyDistance   = 100;
            var opponentBeavers = this.Player.Opponent.Beavers.Where(b => b.Health > 0);

            if (opponentBeavers.Any())
            {
                enemyDistance = opponentBeavers.Min(b => b.ToPoint().ManhattanDistance(tree.Tile.ToPoint()));
            }
            //if (tree.Tile.GetNeighbors().Where(n => ValidTreeNeighbor(n)).Count() > 1 || enemyDistance < safeDistance)
            if (enemyDistance < safeDistance)
            {
                BasicEngageBeaverAndTree(beaver, tree, path);
            }
            else
            {
                var landmark = this.Player.Beavers.MaxByValue(b => b.ToPoint().ManhattanDistance(tree.Tile.ToPoint())).Tile;
                var roadPath = new AStar <Point>(
                    new[] { path.Last() },
                    p => p.Equals(landmark.ToPoint()),
                    (p1, p2) => Solver.GetMoveCost(p1.ToTile(), p2.ToTile()),
                    p => 0,
                    p => p.ToTile().GetNeighbors().Where(n => n.Spawner == null && n.LodgeOwner == null).Select(t => t.ToPoint())
                    ).Path.ToHashSet();

                var dropOffSearch = new AStar <Point>(
                    new[] { beaver.ToPoint() },
                    p => false,
                    (p1, p2) => Solver.GetMoveCost(p1.ToTile(), p2.ToTile()),
                    p => 0,
                    p => p.ToTile().GetReachableNeighbors(AI.Builder.Moves).Select(t => t.ToPoint())
                    );

                var dropOffOrder = dropOffSearch.GScore
                                   .Where(g => !roadPath.Contains(g.Key) && g.Key.ToTile().FlowDirection == "" && !g.Key.Equals(beaver.ToPoint()) && tree.Tile.ToPoint().ManhattanDistance(g.Key) <= 3)
                                   .OrderByDescending(g => g.Key.ToTile().Branches)
                                   .ThenByDescending(g => g.Value);

                if (!dropOffOrder.Any())
                {
                    BasicEngageBeaverAndTree(beaver, tree, path);
                    return;
                }

                if (dropOffOrder.First().Value > 3)
                {
                    BasicEngageBeaverAndTree(beaver, tree, path);
                }

                var dropOff = dropOffOrder.First().Key;

                var dropOffPath = dropOffSearch.CalcPathTo(dropOff);

                if (beaver.ToPoint().Equals(dropOff))
                {
                    BuildLodge(beaver);
                }

                if (!beaver.FullLoad())
                {
                    Solver.Harvest(beaver, new[] { tree });
                    Solver.MoveAlong(beaver, path);
                    Solver.Harvest(beaver, new[] { tree });
                }
                else
                {
                    if ((beaver.Branches + dropOff.ToTile().Branches) < this.Player.BranchesToBuildLodge)
                    {
                        Solver.Drop(beaver, new[] { dropOff.ToTile() }, "branches");
                        Solver.MoveAlong(beaver, path);
                    }
                    else if (beaver.ToPoint().Equals(dropOffPath.Last()))
                    {
                        Solver.Drop(beaver, new[] { dropOff.ToTile() }, "branches");
                    }
                    else
                    {
                        Solver.MoveAlong(beaver, dropOffPath);
                        BuildLodge(beaver);
                    }
                }
            }
        }