如何创建动态的while循环?

时间:2019-05-31 02:07:45

标签: loops kotlin

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 个答案:

答案 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)查找。或者,您可以使用树,进行二进制搜索等。