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个变量)。
我曾考虑过创建一个对象列表,其中包含“范围的起始值”,“范围的终止值”,“相应的级别值”,“进度条的值”,但是我不确定如何实现他们进入循环。有什么想法吗?
答案 0 :(得分: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)
查找。或者,您可以使用树,进行二进制搜索等。