首页 > 解决方案 > 如何创建动态 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 个变量)。

我想创建一个包含“范围起始值”、“范围结束值”、“相应级别值”、“进度条值”的对象列表,但我不确定如何将它们实现到环形。有任何想法吗?

标签: loopskotlin

解决方案


您可以为每个级别创建一个数据类,并将所有级别放在一个列表中。然后创建一个执行调平功能的函数 - 您不想将所有代码放在一个循环中:

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)查找。或者你可以使用一棵树,进行二分搜索等。


推荐阅读