青少年编程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()
}
}