コード例 #1
0
ファイル: FastKillAi.cs プロジェクト: anaym/kontur.shpora
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: PlayerBot.cs プロジェクト: Sequenta/SpurRoguelike
        public Turn MakeTurn(LevelView levelView, IMessageReporter messageReporter)
        {
            messageReporter.ReportMessage("Hey ho! I'm still breathing");



            return(Turn.Step((StepDirection)levelView.Random.Next(4)));
        }
コード例 #4
0
ファイル: Slave.cs プロジェクト: KpyTuBepTu/SpurRoguelike
        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));
        }
コード例 #5
0
        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)));
        }