使用&&&&或||组合条件语句

时间:2018-06-15 00:46:15

标签: swift logical-operators

我一直在使用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没有被阻挡或没有被阻挡或没有被阻挡,所以解决这个难题。"

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

但如果我使用

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

...... Byte在开始时根本没动 - 表面上是因为他在左边被阻挡了。

这里有一个视频,有人在解决这个难题,但是使用了更多的hacky代码而不是真正的算法(即,如果迷宫每次运行时重置为新的配置,它就不会起作用,就像一些等级的水平。)

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

2 个答案:

答案 0 :(得分:2)

该行:

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

应该被理解为:

  

如果任何一个值为false,继续前进。在一切都成真之前不要停止

使用De Morgan's laws的魔力,可以写成:

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

可以理解为:

  

继续前进直至一切正常

这些都是相同的条件,但一个比另一个更清楚。所以你原来的代码可以工作,但不太明显。

您的错误代码为:

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

表示:

  

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

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

答案 1 :(得分:0)

学习代码的用法非常有趣 (唯一让我遗憾的是,当您找到您可以看到提示代码的方式时,至少可以找到一个比较解决方案的方法很酷)

这就是我最后一个难题的解决方法

func gemPtrn() {
collectGem()
turnRight()
moveForward()
collectGem()
moveForward()
}
func switchPtrn() {
toggleSwitch()
turnLeft()
moveForward()
toggleSwitch()
moveForward()
}


while !isOnGem && !isOnOpenSwitch {
moveForward()

if isBlocked && isOnGem {
    gemPtrn()

} else if isBlocked && isBlockedRight {
    turnLeft()
    moveForward()
}

if isOnClosedSwitch {
    switchPtrn()
}

if isBlocked && isBlockedLeft {
    turnRight()
}


}