Как создать динамический цикл while?

when(cShotCount) {
  in 0..4 -> { // If the total shot count is between 0 and 4
   levelTextView ? .text = "Level: " + 0 // Display level
   editor2?.putInt("levelCount", 0) // Set level
   editor2?.apply()
   mChart.setProgress(((cShotCount?.toFloat()!! - 0) / 5) * 100, true) // Display progress
   mChart.progressColor(Color.BLUE) // Set progress bar color
  }

Моя проблема следующая:

В моей "игре" 50 уровней. Каждый уровень представляет собой диапазон, т. е. 0..4, 5..18, 19..41 и т. д. Очевидно, я не хочу копировать/вставлять приведенный выше код 50 раз, а затем вручную изменять отображение уровня, уровень счетчик, индикатор прогресса и цвет индикатора прогресса (4 переменные).

Я думал о создании списка объектов, содержащих «начальное значение диапазона», «конечное значение диапазона», «соответствующее значение уровня», «значение индикатора выполнения», но я не уверен, как реализовать их в петля. Есть идеи?

Уровень должен быть Object с этими свойствами, казалось бы, намного аккуратнее.

Paul Lemarchand 31.05.2019 04:41

В вашем заголовке написано «цикл while», в теге написано «цикл for», но я не вижу цикла в вашем вопросе. Уточните, о каком цикле идет речь? И почему вы отметили java, когда вопрос касается котлина?

Erwin Bolwidt 31.05.2019 04:49

cShotCount — это целое число, которое увеличивается каждый раз, когда публикуется оценка. Хотя это не имеет значения

Martin Erlic 31.05.2019 04:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать класс данных для каждого уровня и поместить все свои уровни в список. Затем создайте функцию, которая выполняет выравнивание — вы не хотите помещать весь свой код в один цикл:

data class Level(
    val shotRange: IntRange,
    val level: Int,
    val color: Color
)

val levels = listOf(
    Level(0..4, 0, Color.BLUE)
    // Add all levels
)

fun setLevel(cShotCount: Int) {
    val level = levels.find { cShotCount in it.shotRange }
        ?: throw IllegalArgumentException("Shot count out of level range")
    levelTextView.text = "Level: ${level.level}" // Display level
    editor2.putInt("levelCount", 0) // Set level
    editor2.apply()
    mChart.setProgress(cShotCount.toFloat() / (level.shotRange.endInclusive + 1) * 100, true) // Display progress
    mChart.progressColor(level.color) // Set progress bar color
}

Затем в вашем цикле вы можете вызвать функцию setLevel, чтобы установить уровень:

var cShotCount = 0
while (true) {
    // Do stuff
    setLevel(cShotCount)
}

Вы можете оптимизировать поиск уровней, поместив уровни в лучшую структуру данных, чтобы оптимизировать поиск уровня. Если у вас есть предсказуемое количество выстрелов, вы можете сделать индекс Array<Level> по количеству выстрелов, чтобы получить быстрый O(1) поиск. Или вы можете использовать дерево, выполнять бинарный поиск и т. д.

Другие вопросы по теме