Пример #1
0
        public Movement GetPartialMovementToClosestEnemy(int turns)
        {
            if (_moveType == MoveType.PartialMovementToClosestEnemy && _movementRoad?.Count > 0 &&
                _movementTarget != null)
            {
                var movement = _movementRoad.First();
                _movementRoad.RemoveAt(0);
                return(movement);
            }

            var player  = _client.GetPlayerTank();
            var enemies = new List <Point>();

            enemies.AddRange(_client.GetBotsTanks());
            enemies.AddRange(_client.GetOtherPlayersTanks());

            var closestEnemy = enemies.OrderBy(x => x.GetDistance(player)).First();
            var deltaX       = player.X - closestEnemy.X;
            var deltaY       = player.Y - closestEnemy.Y;
            var turnsToEnemy = deltaX + deltaY;
            var speedX       = (float)deltaX / turnsToEnemy;
            var speedY       = (float)deltaY / turnsToEnemy;
            var targetX      = (int)(speedX * turns);
            var targetY      = (int)(speedY * turns);
            var target       = new Point(targetX, targetY);

            var horisontalCorrectionIteration = MapUtility.IterationMap[target.GetHorisontalDirectionTo(player).ToDirection(_client)];
            var verticalCorrectionIteration   = MapUtility.IterationMap[target.GetVerticalDirectionTo(player).ToDirection(_client)];

            var horisontalCorrectedPoint = target;
            var verticalCorrectedPoint   = target;

            while (_client.IsObstacleAt(horisontalCorrectedPoint) && _client.IsObstacleAt(verticalCorrectedPoint))
            {
                horisontalCorrectedPoint = horisontalCorrectionIteration(horisontalCorrectedPoint);
                verticalCorrectedPoint   = verticalCorrectionIteration(verticalCorrectedPoint);
            }

            target = _client.IsObstacleAt(horisontalCorrectedPoint) ? verticalCorrectedPoint : horisontalCorrectedPoint;
            var road = PlayerUtility.GetRoad(_client, target);

            _moveType       = MoveType.PartialMovementToClosestEnemy;
            _movementRoad   = road;
            _movementTarget = target;

            {
                var movement = _movementRoad.First();
                _movementRoad.RemoveAt(0);
                return(movement);
            }
        }