我一直在使用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代码而不是真正的算法(即,如果迷宫每次运行时重置为新的配置,它就不会起作用,就像一些等级的水平。)
答案 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()
}
}