コード例 #1
0
ファイル: ShottingBruteforce.cs プロジェクト: znsoft/AiCup
 int getInitialActionPoints(Trooper tr)
 {
     var points = tr.InitialActionPoints;
     if (CommanderId != -1 && tr.GetDistanceTo(state.Position[CommanderId].X, state.Position[CommanderId].Y) <= game.CommanderAuraRange)
         points += game.CommanderAuraBonusActionPoints;
     return points;
 }
コード例 #2
0
ファイル: MyStrategy.cs プロジェクト: Evander83/AICup-2013
        // Основной метод
        public void Move(Trooper self, World world, Game game, Move move)
        {
            if (self.ActionPoints == 0) return;
            cnt_invoke = 0;

            m_self = self;
            m_game = game;
            m_world = world;
            m_cells = world.Cells;

            // Определение игрока-цели
            Player nearToCentr = null;
            foreach (Player p in world.Players)
                if (p.Id != self.PlayerId &&
                    p.ApproximateX >= 0 &&
                    p.ApproximateY >= 0)
                    if (nearToCentr == null ||
                        FindNextStep(self.X, self.Y, nearToCentr.ApproximateX, nearToCentr.ApproximateY, 3).dist >
                        FindNextStep(self.X, self.Y, p.ApproximateX, p.ApproximateY, 3).dist
                    ) nearToCentr = p;
            if (nearToCentr != null)
            {
                targetX = nearToCentr.ApproximateX;
                targetY = nearToCentr.ApproximateY;
            }

            if (m_cellDangerous == null) CellDangerous();
            if (targetX == -1 && targetY == -1)
            {
                targetX = self.X;
                targetY = self.Y;
            }

            // Запрос цели
            const double stageDist = 2.5;
            if (self.GetDistanceTo(targetX, targetY) <= stageDist ||
                world.MoveIndex - moveWithoutEnemy >= 4)
            {
                bool CommanderAlive = false;
                foreach (Trooper tr in world.Troopers)
                    if (tr.IsTeammate && tr.Type == TrooperType.Commander)
                        CommanderAlive = true;
                if (!CommanderAlive)
                {
                    targetX = random.Next(world.Width);
                    targetY = random.Next(world.Height);
                    moveWithoutEnemy = world.MoveIndex;
                }
                else
                    if (self.Type == TrooperType.Commander &&
                        self.ActionPoints >= game.CommanderRequestEnemyDispositionCost)
                    {
                        move.Action = ActionType.RequestEnemyDisposition;
                        moveWithoutEnemy = world.MoveIndex;
                        return;
                    }
            }

            // Заполнение списка солдат, определение отсутствия врагов
            if (self.ActionPoints >= self.InitialActionPoints)
                m_troopers = new ArrayList();
            foreach (Trooper trooper in m_world.Troopers)
            {
                if (trooper.IsTeammate == false)
                    moveWithoutEnemy = m_world.MoveIndex;

                bool isExist = false;
                for (int i = 0; i < m_troopers.Count; i++)
                {
                    MyTrooper mt = (MyTrooper)m_troopers[i];
                    if (mt.Id == trooper.Id && mt.PlayerId == trooper.PlayerId)
                    {
                        isExist = true;
                        m_troopers[i] = new MyTrooper(trooper);
                        break;
                    }
                }
                if (!isExist) m_troopers.Add(new MyTrooper(trooper));
            }

            // Выбор оптимального действия
            Move m = FindNextMove(new MyTrooper(self), new ArrayList(m_world.Players), m_troopers, new ArrayList(m_world.Bonuses)).move;

            move.Action = m.Action;
            move.Direction = m.Direction;
            move.X = m.X;
            move.Y = m.Y;

            return;
        }