不值得在堆栈上发帖
您与错误的变量进行比较:
while (energy > 0) { // Condition always true
when {
lightX > initialTx && lightY == initialTy -> {
...
...应该是:
while (energy > 0) { // Condition always true
when {
lightX > moveX && lightY == moveY -> {
...
...所有其他情况等等。然后代码就可以正常运行了。
较短的版本(并按 x 轴分组):
var energy = 100
val lightX = kotlin.random.Random.nextInt(0, 41)
val lightY = kotlin.random.Random.nextInt(0, 19)
val initialTx = kotlin.random.Random.nextInt(0, 41)
val initialTy = kotlin.random.Random.nextInt(0, 19)
println("Start: ($initialTx, $initialTy)")
println("End: ($lightX, $lightY)")
var moveX = initialTx
var moveY = initialTy
while (0 < energy--) {
when {
lightX < moveX -> {
moveX--
when {
lightY < moveY -> moveY--.also { println("NW -> ($moveX, $moveY)") }
lightY == moveY -> println("W -> ($moveX, $moveY)")
lightY > moveY -> moveY++.also { println("SW -> ($moveX, $moveY)") }
}
}
lightX == moveX -> when {
lightY < moveY -> moveY--.also { println("S -> ($moveX, $moveY)") }
lightY == moveY -> break // We arrived
lightY > moveY -> moveY++.also { println("N -> ($moveX, $moveY)") }
}
lightX > moveX -> {
moveX++
when {
lightY < moveY -> moveY--.also { println("NE -> ($moveX, $moveY)") }
lightY == moveY -> println("E -> ($moveX, $moveY)")
lightY > moveY -> moveY++.also { println("SE -> ($moveX, $moveY)") }
}
}
}
}
由于
initialTx
和 initialTy
的值未更新,因此“NE”和“NW”情况的条件始终为真。这可能会导致无限循环。
可以更新“NE”和“NW”情况的条件,以包括对
initialTy > lightY
的检查,如下所示:
lightX > initialTx && lightY < initialTy && initialTy > lightY -> { /* Condition is always true when reached */
//...
}
lightX < initialTx && lightY < initialTy && initialTy > lightY -> { /* Condition is always true when reached */
//...
}
条件始终为真,因为
initialTy
被初始化为随机,它总是小于lightY
,这也是随机数字。
问题出在“NE”和“NW”方向的条件上。正如您所指出的,这些条件始终为真,这会导致循环永远持续下去。
你必须改变这一行:
lightX > initialTx && lightY < initialTy -> {
println("NE")
initialTx++
initialTy--
println("Continue: ($initialTx, $initialTy)")
}
lightX < initialTx && lightY < initialTy -> {
println("NW")
initialTx--
initialTy--
println("Continue: ($initialTx, $initialTy)")
}