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 переменные).
Я думал о создании списка объектов, содержащих «начальное значение диапазона», «конечное значение диапазона», «соответствующее значение уровня», «значение индикатора выполнения», но я не уверен, как реализовать их в петля. Есть идеи?
В вашем заголовке написано «цикл while», в теге написано «цикл for», но я не вижу цикла в вашем вопросе. Уточните, о каком цикле идет речь? И почему вы отметили java
, когда вопрос касается котлина?
cShotCount — это целое число, которое увеличивается каждый раз, когда публикуется оценка. Хотя это не имеет значения
Вы можете создать класс данных для каждого уровня и поместить все свои уровни в список. Затем создайте функцию, которая выполняет выравнивание — вы не хотите помещать весь свой код в один цикл:
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)
поиск. Или вы можете использовать дерево, выполнять бинарный поиск и т. д.
Уровень должен быть
Object
с этими свойствами, казалось бы, намного аккуратнее.