Codingame《雷神之力》Kotlin代码循环无法终止,条件始终为真求助
《雷神之力》(Power of Thor Episode 1)代码故障修复
问题情况
游戏地图为41宽×19高,坐标左上角为原点(X=0,Y=0),右下角为(X=40,Y=18)。代码存在以下问题:
- 程序会一直运行到能量耗尽才终止,无法在Thor到达目标点后停止
- 代码中标注的两个方向条件触发后会一直为真,导致方向输出循环重复
原代码
import kotlin.random.Random fun main() { var energy = 100 val lightX = Random.nextInt(0, 40) val lightY = Random.nextInt(0, 18) val initialTx = Random.nextInt(0, 40) val initialTy = Random.nextInt(0, 18) var moveX = initialTx var moveY = initialTy println("Start: ($initialTx, $initialTy)") println("End: ($lightX, $lightY)") while (energy > 0) { // Condition always true when { lightX > initialTx && lightY == initialTy -> { println("E") moveX++ println("Continue: ($moveX, $moveY)") } lightX < initialTx && lightY == initialTy -> { println("W") moveX-- println("Continue: ($moveX, $moveY)") } lightX == initialTx && lightY > initialTy -> { println("S") moveX++ println("Continue: ($moveX, $moveY)") } lightX == initialTx && lightY < initialTy -> { println("N") moveY-- println("Continue: ($moveX, $moveY)") } lightX > initialTx && lightY > initialTy -> { println("SE") moveX++ moveY++ println("Continue: ($moveX, $moveY)") } lightX < initialTx && lightY > initialTy -> { println("SW") moveX-- moveY++ println("Continue: ($moveX, $moveY)") } lightX > initialTx && lightY < initialTy -> { // Condition always true when reached println("NE") moveX++ moveY-- println("Continue: ($moveX, $moveY)") } lightX < initialTx && lightY < initialTy -> { // Condition always true when reached println("NW") moveX-- moveY-- println("Continue: ($moveX, $moveY)") } } energy-- } }
问题根源
- 循环终止条件错误:当前循环只判断能量是否大于0,完全忽略Thor是否到达目标点。正确逻辑是当
moveX == lightX且moveY == lightY时停止循环。 - 坐标判断逻辑错误:所有
when分支的判断用了初始坐标initialTx/initialTy,而非当前位置moveX/moveY。比如初始位置在目标点东北方向,这个条件会一直成立,导致循环永远输出"NE"直到能量耗尽。 - 方向移动错误:向南(S)移动的分支里,错误执行
moveX++,但向南是Y轴增加(Y轴从左上到右下递增),应该改成moveY++。
修复后的代码
import kotlin.random.Random fun main() { var energy = 100 val lightX = Random.nextInt(0, 40) val lightY = Random.nextInt(0, 18) val initialTx = Random.nextInt(0, 40) val initialTy = Random.nextInt(0, 18) var moveX = initialTx var moveY = initialTy println("Start: ($initialTx, $initialTy)") println("End: ($lightX, $lightY)") // 循环条件改为:未到达目标点且还有能量 while ((moveX != lightX || moveY != lightY) && energy > 0) { when { // 所有判断改用当前坐标moveX/moveY lightX > moveX && lightY == moveY -> { println("E") moveX++ } lightX < moveX && lightY == moveY -> { println("W") moveX-- } lightX == moveX && lightY > moveY -> { println("S") moveY++ // 修复向南移动的坐标修改 } lightX == moveX && lightY < moveY -> { println("N") moveY-- } lightX > moveX && lightY > moveY -> { println("SE") moveX++ moveY++ } lightX < moveX && lightY > moveY -> { println("SW") moveX-- moveY++ } lightX > moveX && lightY < moveY -> { println("NE") moveX++ moveY-- } lightX < moveX && lightY < moveY -> { println("NW") moveX-- moveY-- } } println("Continue: ($moveX, $moveY)") energy-- } println("Reached target!") }
内容的提问来源于stack exchange,提问作者user18806533
相关产品推荐
相关产品推荐

