首页 > 解决方案 > 使用 && 或 || 转义 while 循环 组合条件语句

问题描述

我一直在使用 Swift Playgrounds 应用程序开始学习如何编程,所以不用说我是初学者(对我来说放轻松!)。

我正处于学习编码 1 的最后阶段 - 向右滚动,向左滚动。我在网上找到的解决方案都不像我的,但我的工作。

我感到困惑的是它为什么起作用 - 特别是它如何逃脱 while 循环。

我找到的解决方案:

func navigateWall() {
    if isBlockedLeft && !isBlocked {
        moveForward()
    } else if isBlockedLeft && isBlocked {
        turnRight()
    } else if isBlockedRight && !isBlocked {
        moveForward()
    } else if isBlocked {
        turnLeft()
    }
}

while !isBlocked || !isBlockedLeft || !isBlockedRight {
    navigateWall()
    if isOnClosedSwitch {
        toggleSwitch()
    } else if isOnGem {
        collectGem()
    }
}

让我困惑的部分是逃避while循环。我在底部的内容似乎在伪代码中读作“当字节没有向前阻塞或没有向左阻塞或没有向右阻塞时,解决这个难题。”

但我真正想说的是,当 Byte 走到迷宫的尽头,他被挡在右边 AND (&&) 左边 AND (&&) 前面时,然后停下来。

但是如果我使用

while !isBlocked && !isBlockedLeft && !isBlockedRight {

...字节一开始根本不动——表面上是因为他被挡在了左边。

这是一个解决难题的视频,但使用更多hacky代码而不是真正的算法(即,如果迷宫在每次运行时都重置为新配置,它将无法工作,就像某些级别所做的那样)。

https://www.youtube.com/watch?v=8xpEaCVSaTg

标签: swiftlogical-operators

解决方案


该行:

while !isBlocked || !isBlockedLeft || !isBlockedRight {

应该读作:

如果任一值为假,请继续。不要停止,直到一切都是真的

使用德摩根定律的魔力,可以写成:

while !(isBlocked && isBlockedLeft && isBlockedRight) {

可以读作:

继续前进,直到一切都是真的

这些都是相同的条件,但一个比另一个更清楚。因此,您的原始代码有效,但不太明显。

您不正确的代码:

while !isBlocked && !isBlockedLeft && !isBlockedRight {

方法:

只要没有被阻止,就继续前进。

当然,这意味着一旦其中一个变为真,条件就等于真。不是你想要的。


推荐阅读