示例#1
0
        public string Move(Manager manager, Pac pac)
        {
            ArtificialIntelligenceResult result = this.AI.Run(manager, pac);

            if (result.HasPosition)
            {
                if (pac.AIPositions.Count > 0)
                {
                    pac.AIPositions.Last().Visited = true;
                }
                pac.AIPositions.Add(new UnderVisiting()
                {
                    Position = manager.Map[result.Position]
                });
                Moves = result.ToMove(manager, pac);
            }
            if (result.HasPower)
            {
                return(result.Power);
            }
            else
            {
                return(Moves.Next());
            }
        }
示例#2
0
        public override ArtificialIntelligenceResult Run(Manager manager, Pac pac)
        {
            foreach (Pac enemy in manager.EnemyPacs)
            {
                if (enemy.Position.TaxicabDistance(pac.Position, manager.Map) <= 2)
                {
                    if (pac.AbilityCooldown == 0)
                    {
                        //insert the possibility to hunt the pac
                        switch (pac.Type)
                        {
                        case PacType.Paper:
                            return(new ArtificialIntelligenceResult(enemy.Position, $"SWITCH {pac.Id} ROCK"));

                        case PacType.Rock:
                            return(new ArtificialIntelligenceResult(enemy.Position, $"SWITCH {pac.Id} SCISSORS"));

                        case PacType.Scissor:
                            return(new ArtificialIntelligenceResult(enemy.Position, $"SWITCH {pac.Id} PAPER"));
                        }
                    }
                    else
                    {
                        //todo: runaway if i changed my type in last ten turns
                    }
                }
            }
            return(this.InvokeNext(manager, pac));
        }
        public void SetPac(int id, bool isMine, int x, int y, string type, int speedTurnsLeft, int abilityCooldown)
        {
            Set(isMine ? this.Pacs : this.EnemyPacs);
            void Set(List <Pac> pacs)
            {
                if (!pacs.Any(x => x.Id == id))
                {
                    pacs.Add(new Pac(id));
                }
                Pac pac = pacs.FirstOrDefault(x => x.Id == id);

                pac.IsMine           = isMine;
                pac.Type             = GetType(type);
                pac.SpeedTurnsLeft   = speedTurnsLeft;
                pac.AbilityCooldown  = abilityCooldown;
                pac.PreviousPosition = pac.Position;
                pac.Position         = new Position(x, y);
                if (!pac.PreviousPosition.Equals(Position.Default))
                {
                    this.Map.Eat(pac.PreviousPosition);
                }
                if (isMine)
                {
                    this.Map.Current(pac.Position, isMine);
                }
            }
示例#4
0
 public Move(Position position, Map map, Pac pac)
 {
     this.Id           = pac.Id;
     this.Path         = new PathFinder().FindPath(map, pac.Position, position).Path;
     this.CurrentIndex = this.Path.Count - 2;
     this.Set(map);
 }
示例#5
0
 public override ArtificialIntelligenceResult Run(Manager manager, Pac pac)
 {
     if (pac.PreviousPosition.Equals(Position.Default))
     {
         return(new ArtificialIntelligenceResult(this.GetDensity(manager.Map, pac.Id).OrderByDescending(x => x.MapType).ThenByDescending(x => Math.Abs(pac.Position.X - x.Position.X) + Math.Abs(pac.Position.Y - x.Position.Y)).First().Position));
     }
     return(this.InvokeNext(manager, pac));
 }
示例#6
0
 public override ArtificialIntelligenceResult Run(Manager manager, Pac pac)
 {
     if (manager.Pacs.Where(x => x != pac).Any(x => x.Position.TaxicabDistance(pac.Position, manager.Map) <= 2) && !pac.AreVisitingSuperPellet())
     {
         var eatable = manager.Map.GetEatable().ToList();
         return(new ArtificialIntelligenceResult(eatable[new Random().Next(eatable.Count)].Position));
     }
     return(this.InvokeNext(manager, pac));
 }
示例#7
0
        public override ArtificialIntelligenceResult Run(Manager manager, Pac pac)
        {
            var eatable = manager.Map.GetEatable().Where(x => x.MapType > MapType.Pellet && !x.IsOnPath).OrderBy(x => x.Position.TaxicabDistance(pac.Position, manager.Map)).FirstOrDefault();

            if (eatable != null && !pac.AreVisitingSuperPellet())
            {
                return(new ArtificialIntelligenceResult(eatable.Position));
            }
            return(this.InvokeNext(manager, pac));
        }
 public override ArtificialIntelligenceResult Run(Manager manager, Pac pac)
 {
     if (pac.Engine.Moves != null)
     {
         //check current is the pac position or the last is ate
         if (pac.Engine.Moves.HasNext() || manager.Map.IsAte(pac.Engine.Moves.Last))
         {
             var t = manager.Map.GetClosedWay().Where(x => x.MapType >= MapType.Pellet).OrderBy(x => x.Position.TaxicabDistance(pac.Position, manager.Map)).ToList();
             return(new ArtificialIntelligenceResult(t.FirstOrDefault().Position));
         }
     }
     return(this.InvokeNext(manager, pac));
 }
 public abstract ArtificialIntelligenceResult Run(Manager manager, Pac pac);
 public Move ToMove(Manager manager, Pac pac)
 => new Move(this.Position, manager.Map, pac);
 private protected ArtificialIntelligenceResult InvokeNext(Manager manager, Pac pac)
 => Next?.Run(manager, pac) ?? ArtificialIntelligenceResult.Empty;