青少年编程Playgrounds之十八--算法

青少年编程Playgrounds之十八–算法

第一关 右手定则
在这里插入图片描述
在这里插入图片描述

先看地图,多次 运行我的代码 后,能发现,地图上的障碍物(Block)是随机变化的,那么肯定不能编写固定的代码。而本关的提示里已经非常详细的使用伪代码完成了算法编写。只要稍微修改一下真正的代码,使其和伪代码一致即可。
首先分析一下导航部分的代码,也就是Byte寻找路径的方式,即本关标题所说的右手法则。就是说只要右手边没有阻拦,那么就右转,如果有阻拦,则直行。
由于本关地图的特殊性,这样就可以了,但是实际情况会复杂一下,后面的关卡会遇到。

导航部分程序已经自动完成,我们只需要完成while循环部分即可。

根据伪代码,循环中需判断是否有宝石,如果有,则搜集宝石,然后转向。
那么很简单可写出

while !isOnGem {
    navigateAroundWall()
    //有宝石吗?
    if isOnGem{
        //搜集宝石
        collectGem()
        //转向
        //左转右转随意,反正转两次。就出现一次,所以不单独写转向函数了
        turnLeft()
        turnLeft()
    }
}

运行程序,一看,一个算法完成了。就是这么任性。
如果你像我一样蜜汁自信,请最高速运行。
然后…在这里插入图片描述

Byte数次想不开想要飞翔…
千万不要太自信。
如果看不出失败的原因的话,单步运行一下就会发现,我们的退出条件有问题。我们设定的是当没有站在有宝石的方块上时,一直循环,而导航函数设定的是右转不行则直行,而完全没有考虑前方没有路的情况。所以导致现在Byte只能跳崖。
话说,条件是程序自己给的,所以我都没仔细看,所以完美入坑了,以后这样的坑还不少,得当心。其实只要根据伪代码修改退出条件即可,即 未站在未打开之开关上(我的描述相当言简意赅)。
代码

while !isOnClosedSwitch {
    navigateAroundWall()
    //有宝石吗?
    if isOnGem{
        //搜集宝石
        collectGem()
        //转向
        //左转右转随意,反正转两次。就出现一次,所以不单独写转向函数了
        turnLeft()
        turnLeft()
    }
}
toggleSwitch()

勇敢的 最快速运行

在这里插入图片描述

导航算法先不动,本关地图没有修改的必要,改了也没啥帮助。
下一关▶️

第二关 调整算法

在这里插入图片描述

在这里插入图片描述

当看到题目给出的while循环代码的时候,我简直怀疑这个软件直接提取了我上一关的代码,别的不说,帅气转身方向惊人一致。😄

上一关已经说到了,导航算法有问题,那么就来解决一下问题。分析给出的情况示例,即当
右方受阻时
如果前方也受阻
则应该左转–前进
如果前方不受阻
则前进
我们需要修改的就是if isBlockedRight内的内容即可

func navigateAroundWall() {
    if isBlockedRight {
        if isBlocked{
            turnLeft()
        }else {
            moveForward()
        }
        
    }  else {
        turnRight()
        moveForward()
    }
}

直接运行程序
在这里插入图片描述

过关…了吗?
虽然程序判定过关了,其实如果多运行几次,仔细分析一下,会发现,有时候搜集到宝石,Byte会有很奇怪的动作。它会先转身,然后右转,那是因为在while循环里,我们为Byte编写了搜集到宝石即转身的指令,但是针对本关地图,这样的操作是不必要的,因为我们已经修改了导航算法,而且,每次搜集到宝石就转身也与地图某些情况不符合。所以,果断放弃

while !isOnClosedSwitch {
    navigateAroundWall()
    if isOnGem {
        collectGem()
        //不需要再手动转身了
        //turnLeft()
        //turnLeft()
    }
}
toggleSwitch()

多运行几次代码看看

虽然路线依旧神秘,但是已经没有鬼畜动作了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值