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
相关产品推荐
相关产品推荐

