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

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--
    }
}

问题根源

  1. 循环终止条件错误:当前循环只判断能量是否大于0,完全忽略Thor是否到达目标点。正确逻辑是当moveX == lightX且moveY == lightY时停止循环。
  2. 坐标判断逻辑错误:所有when分支的判断用了初始坐标initialTx/initialTy,而非当前位置moveX/moveY。比如初始位置在目标点东北方向,这个条件会一直成立,导致循环永远输出"NE"直到能量耗尽。
  3. 方向移动错误:向南(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:15:18