青少年编程Playgrounds之十九–算法
第三关 征服迷宫
有了上一关的基础,本关就很简单了,首先,导航算法移过来
func navigateAroundWall() {
if isBlockedRight {
if isBlocked{
turnLeft()
}else {
moveForward()
}
} else {
turnRight()
moveForward()
}
}
现在脑海里过一遍,看看这个算法能否满足本关需求。
答案是----------------我算不过来
然后循环出场,找到循环条件,放眼整个地图,就只有宝石最耀眼,那么就是它了。!isOnGem
嗯,没了
while !isOnGem {
navigateAroundWall()
}
collectGem()
运行程序
虽然走了点弯路,但还是完成了任务。
那么有人说了(其实没人说,貌似也没人在看),如果不走弯路怎么搞?
嗯,广度或者深度算法可以实现,只是这个需要用到变量,数组等等东西,那是 学习编程2 里会学到的东西,到时候再来吧。
第四关 左转还是右转
先在脑海中走一遍Byte过关路线,发现,嗯,咳咳,可能可以完全使用之前的导航算法,所以毫不犹豫移动代码到本关
func navigateAroundWall() {
if isBlockedRight{
if isBlocked{
turnLeft()
}else {
moveForward()
}
}else{
turnRight()
moveForward()
}
}
然后循环条件,也和上一关一样,我的天,
继续只做搬运工
while !isOnGem {
navigateAroundWall()
}
collectGem()
然后发现不对,本关地图多了开关,这也难不倒我们
while !isOnGem {
navigateAroundWall()
if isOnClosedSwitch{
toggleSwitch()
}
}
collectGem()
运行…
虽然过关了,不过由截图可知,走了一些弯路。
为啥呢,因为本关并不是如之前两关一样是测试右手法则,而是想我们每次遇到开关时判断方向。所以如果不用导航算法,怎么操作呢?
首先,找到开关的特点,每次遇到开关必定需要转向,往哪个方向转呢?
其实仔细分析,很快发现,每当前方受阻时,必左转,否则右转,所以,写一个转向函数
func whichDirctionToTurn(){
if !isBlocked{
turnRight()
}else{
turnLeft()
}
}
然后循环
while !isOnGem {
moveForward()
if isOnClosedSwitch{
toggleSwitch()
//搜集到宝石后,判断旋转方向
whichDirctionToTurn()
}
}
collectGem()
已经不需要导航函数了
快速运行
妈妈再也不用担心Byte乱跑了