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