青少年编程Playgrounds之十二--逻辑运算

tech2022-09-08  114

青少年编程Playgrounds之十二–逻辑运算

第一关 使用“非”运算符

Byte总共需要直行四次,搜集四颗宝石,但是到底是哪一颗宝石在道路左边台阶下,这是随机的。所以需要一直判断当前所处位置是否有宝石,如果没有,则需要往左边完成宝石搜集动作。 当前任务的代码区,并不支持自定义函数,所以只能将所有内容写进主程序的for循环中。 原主程序内容

for i in 1 ... 4 { moveForward() }

修改后的程序内容

for i in 1 ... 4{ moveForward() //没有宝石则表示左边有台阶,需要搜集台阶下的宝石 if !isOnGem{ //完成左边宝石的搜集并回到原位置 turnLeft() for i in 0..<4{ if !isBlocked{ moveForward() if isOnGem{ collectGem() turnLeft() turnLeft() } } } turnLeft() //有宝石则搜集 }else{ collectGem() } }

运行程序后,如图

第二关 非之螺旋

分析一下地图,Byte同学需要走13步才能走到开关处,然后切换开关。 过关思路为:循环13次,每次循环判定前方是否有路可走,有的话直走,没有的话,左转再直走,知道踩到开关,点亮开关。 地图很简单,直接上代码

for i in 1 ... 13 { //前方没有阻碍,则前进否则左转后前进 if !isBlocked{ moveForward() }else{ turnLeft() moveForward() } //每次移动都检查 if isOnClosedSwitch{ toggleSwitch() } }

或者不使用 非 ,直接使用isBlocked

for i in 1 ... 13 { if isBlocked{ turnLeft() } moveForward() //每次移动都检查 if isOnClosedSwitch{ toggleSwitch() } }

第三关 检查这个与那个

初始主程序代码

for i in 1 ... 7 { moveForward() }

根据地图分析,所有需要右转的地方,都满足两个条件,有宝石,Byte左边没有通路,所以,判断条件可以为

//需要右转条件 if isBlockedLeft && isOnGem{ }

接下来解决开关点亮任务

切换右边开关总共需要走4步,所以,循环四次

if isBlockedLeft && isOnGem{ //先右转 turnRight() for i in 0..<4{} }

在循环中,如果前方有通路,则前进,如果遇到未点亮开关则点亮,并且转身。

if isBlockedLeft && isOnGem{ //先右转 turnRight() for i in 0..<4{ if !isBlocked{ moveForward() } if isOnClosedSwitch{ toggleSwitch() turnLeft() turnLeft() } } }

转身后继续前进,当遇到阻碍且有宝石时,说明回到了原位,搜集宝石,再右转,准备下一次大循环。

if isBlocked && isOnGem{ collectGem() turnRight() }

再添加采集不需要右转时的宝石的条件,此时主程序代码

for i in 1 ... 7 { moveForward() //右转完成台阶上开关切换 if isBlockedLeft && isOnGem{ turnRight() for i in 0..<4{ if !isBlocked{ moveForward() } if isBlocked && isOnGem{ collectGem() turnRight() } if isOnClosedSwitch{ toggleSwitch() turnLeft() turnLeft() } } } //不需要右转的情况下,有宝石搜集宝石 else if isOnGem{ collectGem() } }

运行代码,任务结束。 循环有点多,判断条件也有些多,所以可以通过 单步调试我的代码 来运行程序,查看每一步的走法。 当然,本关限定条件很少,所以解决方法有很多,以上只是抛砖引玉。 主程序尽可能多用已经学习的内容,如条件,循环,逻辑等。

最新回复(0)