loops - 如何创建动态 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 个变量)。
我想创建一个包含“范围起始值”、“范围结束值”、“相应级别值”、“进度条值”的对象列表,但我不确定如何将它们实现到环形。有任何想法吗?
解决方案
您可以为每个级别创建一个数据类,并将所有级别放在一个列表中。然后创建一个执行调平功能的函数 - 您不想将所有代码放在一个循环中:
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)
查找。或者你可以使用一棵树,进行二分搜索等。
推荐阅读
- android - ndk-build, C:\User\MyUser 未被识别为内部或外部命令
- django - django-allauth 自定义注册表单在添加新用户时在管理页面中引发错误。'CustomUserForm' 对象没有属性 'instance'
- windows - GLM50C ragnefinder (Bluetooth smart 4) 无法与 Windows 连接
- javascript - TypeError:无法读取未定义 Angular 的属性“提交”
- docker - 尝试简化 GitHub 工作流程(Docker 镜像构建)
- c# - Azure 广告重定向 Uri 获取 http 而不是 https
- swift - Swift Combine 转换一组发布者
- c# - 将 LINQ 选择转换为可理解的 for 循环
- flutter - 选择项目并在 listView 颤动中返回它们
- mysql - 防止sql查询再次浏览表