You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin打乱方向列表校验用户操作时循环始终进入else分支问题

问题根因

你的代码跑不通是几个低级错误叠在一起导致的:

  • 第一版代码直接对MutableList<String>类型的directions列表做when匹配,拿列表对象和字符串值"left"比类型都不匹配,永远进不了对应业务分支,只会走else。
  • 第二版用for (item in directions)遍历可变列表的同时,直接在循环里调用remove()删列表元素,会触发ConcurrentModificationException;而且for循环是一次性顺序跑完列表所有元素,不会等用户操作正确再进入下一轮,自然会直接跳完所有逻辑。
  • 你写的if(progress != 100)是单次条件判断,不是持续循环,满足条件只会执行一次代码块,不会阻塞等待进度涨到100再退出。
  • 进度值计算错误:总共4个方向,你每次操作正确加10进度,全做完才40,永远到不了100。
  • 方向检测逻辑写死:不管当前指令是什么方向,都调用checkLeftDirection()检测左滑操作,大概率匹配不上当前指令。
正确实现方案

核心逻辑不要用for循环遍历列表,改用while持续循环:只要进度没到100、方向列表不为空,就固定取列表第一个元素作为当前待校验的指令,等用户操作匹配成功后,再移除这个已完成的方向、累加进度,自动进入下一个方向的校验;操作错误就提示重试,不跳到下一个指令。

// 初始化方向列表并随机打乱
val directions = mutableListOf("left", "right", "up", "down")
directions.shuffle()
var progress = 0

// 循环直到进度满100
while (progress < 100 && directions.isNotEmpty()) {
    // 取当前需要用户完成的方向
    val currentTarget = directions.first()
    // 向用户发送方向指令
    println("请操作方向:$currentTarget")

    // 根据当前目标方向调用对应的检测方法,不要写死检测左方向
    val userAction = when(currentTarget) {
        "left" -> checkLeftDirection()
        "right" -> checkRightDirection()
        "up" -> checkUpDirection()
        "down" -> checkDownDirection()
        else -> ""
    }

    if (userAction == currentTarget) {
        // 操作匹配:移除已完成方向、累加进度
        directions.removeFirst()
        progress += 25 // 4个方向各25,刚好凑满100
        println("操作正确,当前进度:$progress%")
    } else {
        // 操作不匹配:提示重试,不进入下一个方向
        println("操作错误,请重新操作")
    }
}
println("全部指令完成,进度100%")
注意点
  • 不要在Kotlin的for循环遍历可变集合时直接增删元素,会触发迭代器的并发修改异常。
  • 需要反复等待用户输入、反复校验的逻辑用while循环实现,不要用单次if判断。
  • 进度累加值要和总任务数匹配,避免出现永远达不到终止条件的死循环。

内容的提问来源于stack exchange,提问作者EMT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:36:29