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()); } }
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); } }
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); }
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)); }
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)); }
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;