青少年编程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()地图 如果单纯完成本关完全没有难度,关键是怎么找到最优的方式解决本关问题。依然抛砖引玉中…
首先根据主程序给定循环,那么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() } }