Как я могу создать динамический цикл while? - PullRequest
0 голосов
/ 31 мая 2019
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 переменных).

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

1 Ответ

1 голос
/ 31 мая 2019

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

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, чтобы установитьlevel:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...