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

tech2022-10-02  101

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

第四关 检查这个或那个

与第三关一字之差 地图 本关练习使用逻辑 或

分析一下循环

for i in 1 ... 12 { }

也就是说,Byte需要走12步,则完成本关。当前方或者左边没有障碍这两个条件都不满足时,前进。而任一条件满足时,则先右转,然后前进一步。

for i in 1 ... 12 { if isBlocked || isBlockedLeft{ turnRight() } moveForward() }

再加上宝石检查功能,即可

for i in 1 ... 12 { if isBlocked || isBlockedLeft{ turnRight() } moveForward() if isOnGem{ collectGem() } }

该检查功能,可以针对宝石出现在路径中的任一位置,如果仅是针对本关地图,可以直接放在循环外,一句两句代码的差异,相较于以我代码水平编写的冗余代码,这都不是事儿。 放在循坏外代码如下:

for i in 1 ... 12 { if isBlocked || isBlockedLeft{ turnRight() } moveForward() } collectGem()

逻辑运算Boss战 逻辑迷宫

地图 如果单纯完成本关完全没有难度,关键是怎么找到最优的方式解决本关问题。依然抛砖引玉中…

首先根据主程序给定循环,那么Byte需要在8步内解决问题。地图中有三种情况 未点亮开关–直接点亮,然后左转 宝石–搜集 宝石+未点亮开关–右边通路中有宝石需要搜集

三种情况是互斥的,所以可以使用条件if else if

先完成两个简单的条件代码

if isOnClosedSwitch{ turnLeft() toggleSwitch() } if isOnGem{ collectGem() }

代码编写界面添加的函数没法调用,所以所有东西直接扔到主程序中了。

然后关键点,解决同时出现宝石和开关时情况,首先,当Byte走到此处时,需要右转,然后4步回到原位。

if isOnGem && isOnClosedSwitch{ turnRight() for i in 0..<4{ if isBlocked{ turnLeft() turnLeft() } moveForward() if isOnGem{ collectGem() } } turnRight() }

先右转,然后循环走四步,每次检查是否有宝石,循环结束后,回到原来位置,右转,面对下一步。 将所有主路的开关和宝石处理留给主程序 所以主程序变为

for i in 1 ... 8 { moveForward() //处理右边支路宝石 if isOnGem && isOnClosedSwitch{ turnRight() for i in 0..<4{ if isBlocked{ turnLeft() turnLeft() } moveForward() if isOnGem{ collectGem() } } turnRight() } //当仅遇到未切换(点亮)开关时转向 else if isOnClosedSwitch{ turnLeft() } //遇到宝石,搜集 if isOnGem{ collectGem() } // 遇到未点亮开关,点亮 if isOnClosedSwitch{ toggleSwitch() } }

最新回复(0)