public Turn Iteration(LevelView level, IMessageReporter messageReporter, out bool isAttack) { isAttack = false; var monsterMap = new EnemyMap(level, 1); var trapMap = new TrapMap(level); var travelMap = Map.Sum(trapMap, WallMap); var pathMap = Map.Sum(monsterMap, travelMap); List <Location> path = null; if (level.Player.Health < 50 && level.HealthPacks.Any()) { path = pathMap.FindPath(level.Player.Location, level.HealthPacks.OrderBy(h => h.Location.Distance(level.Player.Location)).First().Location); messageReporter.ReportMessage("Healing"); } else if (level.Monsters.Any(m => m.Location.IsInRange(level.Player.Location, 1))) { messageReporter.ReportMessage("Attack"); isAttack = false; return(Turn.Attack(level.Monsters.First(m => m.Location.IsInRange(level.Player.Location, 1)).Location - level.Player.Location)); } else if (level.Monsters.Any()) { int i = 0; path = travelMap.FindPath(level.Player.Location, level .Monsters.OrderBy(h => h.Location.Distance(level.Player.Location)).First().Location); if (i > 10) { return(Turn.None); } messageReporter.ReportMessage("Far attack"); } else if (level.Player.Health < 100 && level.HealthPacks.Any()) { messageReporter.ReportMessage("100 Healing"); path = pathMap.FindPath(level.Player.Location, level.HealthPacks.OrderBy(h => h.Location.Distance(level.Player.Location)).First().Location); } else if (Math.Max(BestItem(level).AttackBonus, BestItem(level).DefenceBonus) > Math.Max(level.Player.TotalAttack - level.Player.Attack, level.Player.TotalDefence - level.Player.Defence)) { path = pathMap.FindPath(level.Player.Location, BestItem(level).Location); } else { messageReporter.ReportMessage("Leave"); var leaveMap = Map.Sum(travelMap, new BadObjectMap(level, (view, location) => level.Items.Any(i => i.Location.Equals(location)), view => level.Items.Select(i => i.Location), 1)); path = leaveMap.FindPath(level.Player.Location, Exit); } if (path != null) { return(Turn.Step(path[1] - path[0])); } return(Turn.None); }
public Turn MakeTurn(LevelView levelView, IMessageReporter messageReporter) { if (Ai == null || !levelView.Field.GetCellsOfType(CellType.Exit).First().Equals(Ai.Exit) || MonsterCount < levelView.Monsters.Count()) { LevelIndex++; if (IsLastLevel(levelView)) { Ai = new ArenaDestroyerAi(levelView); } else if (AiFactories.ContainsKey(LevelIndex)) { Ai = AiFactories[LevelIndex].CreateBot(levelView, LevelIndex); } else { Ai = AiFactories[AiFactories.Keys.OrderBy(k => Math.Abs(k - LevelIndex)).First()].CreateBot(levelView, LevelIndex); } history = new Queue <Location>(historySize); } MonsterCount = levelView.Monsters.Count(); var isAttack = false; var action = Ai.Iteration(levelView, messageReporter, out isAttack); if (!isAttack) { history.Enqueue(levelView.Player.Location); if (history.Count > historySize) { history.Dequeue(); if (new HashSet <Location>(history).Count < (historySize * Ai.CriticalPercentageInactivity / 100)) { messageReporter.ReportMessage("T"); history.Clear(); if (levelView.Monsters.Any(m => m.Location.IsInRange(levelView.Player.Location, 1))) { messageReporter.ReportMessage("A"); return(Turn.Attack(levelView.Monsters.First(m => m.Location.IsInRange(levelView.Player.Location, 1)).Location - levelView.Player.Location)); } var solve = Ai.HandleCycle(levelView); if (solve != null) { return(solve); } return(Turn.Step((StepDirection) new Random().Next(0, 4))); } } } return(action); }
public Turn MakeTurn(LevelView levelView, IMessageReporter messageReporter) { messageReporter.ReportMessage("Hey ho! I'm still breathing"); return(Turn.Step((StepDirection)levelView.Random.Next(4))); }
public Turn GoToExit() { messageReporter.ReportMessage("-----GoToExit-----"); // "Анализ" ситуации. Для каждого из основных действий, кроме хила Turn turn = CheckEquipAndExp(); if (turn != Turn.None) { return(turn); } turn = SearchMonstersAround(); if (turn != Turn.None) { return(turn); } if (GetClosestFruit(levelView.HealthPacks).HasValue) { SlaveObjectives.Push(objectives[(int)SlaveActions.GoHealYourself]); return(SlaveObjectives.Peek()()); } return(CreateMap(levelView.Field.GetCellsOfType(CellType.Exit).Single(), false)); }
public Turn MakeTurn(LevelView levelView, IMessageReporter messageReporter) { messageReporter.ReportMessage("Hey ho! I'm still breathing"); if (levelView.Random.NextDouble() < 0.1) { return(Turn.None); } var nearbyMonster = levelView.Monsters.FirstOrDefault(m => IsInAttackRange(levelView.Player.Location, m.Location)); if (nearbyMonster.HasValue) { return(Turn.Attack(nearbyMonster.Location - levelView.Player.Location)); } return(Turn.Step((StepDirection)levelView.Random.Next(4))); }