
第六关 消灭程序错误练习
▲任务描述
与上一关卡一样,代码编辑区域不是空白的,然而系统提供的解决方案并不是完美的,可能存在一个或者多个问题,需要在它原有的基础上对命令进行调整。同样,调整后的命令组合,应使Byte获得1枚宝石并打开2个开关,才算完成任务。游戏第六关界面如图2.34所示。

图2.34 游戏第六关界面
小贴士
图2.34中的①区域是此关卡需要完成的任务栏,前面关卡中已经介绍过。需要强调的是,初始时已完成任务项不一定是0,如本关卡中已经有一个开关是开启状态,只需要打开剩下的一个开关并获取1枚宝石即可。
本关卡中可用的相关命令如图2.35所示。

图2.35 浮现命令栏
▲任务分析
系统给出了一种解决方案:

我们可以先来看看运行后的结果,如图2.36所示。

图2.36 系统自带解决方案的运行结果
运行后的结果让人哭笑不得,Byte既没有获取宝石也没有打开开关,并且把之前已经打开的开关还给关闭了。说明解决方案给出的命令存在很大的问题。前面介绍了单步调试的方法去排查问题,利用此方法观察Byte每一步的行走效果,查出问题所在,如图2.37所示。Byte前进到开启状态的开关处进行了左转,左转后把开关关闭。之后不再进行转向,这条道路上未设置宝石和开关,从而任务失败。

图2.37 调试中关键步骤的截图
通过对地图的观察,红宝石位于高地上,并且没有台阶直达,但是高地上有一个蓝色的传送门,寻找与其搭配的另一个传送门,我们就可以通过下面的传送门到达高地去获取宝石。所以,我们将左侧台阶上的开关打开就可以完成任务。起点前方的开关本就处于打开状态,让它保持原状态即可。

源代码运行效果
▲解决方案
通过前面的任务分析得知,Byte在出发前进一步后需要左转上台阶,那么我们将第四行的turnLeft()命令拖动到第二行,第一步修改后的命令组合解决方案如下:

关键步骤的运行效果如图2.38所示。

图2.38 关键步骤的运行效果
第一次修改后,运行结果已经接近成功,遗憾的是宝石没有收入囊中。我们观察修改后的命令发现,最后两行的顺序先是命令collectGem(),后是命令moveForward()。明显,Byte应该先前进走到宝石位置,再获取宝石,那么我们只需要调整最后两行命令的顺序即可。再次修改后的命令组合解决方案如下:

运行微视频

运行的最终效果如图2.39所示。

图2.39 完成任务图
编程思维
前面几关难度不大,也许你一眼就看出了多个问题,并可以一次性解决,但是随着编程难度的加强,养成良好的调试习惯,最好每做一项更改都运行一次你的代码,确保每一步的正确性。别担心尝试太多次,犯错实际上是学习和长久记住新知识的最好方式之一!
▲任务小结
①学会单步调试代码。
②学会更改命令顺序。
③学会发现多个Bug并逐一修复Bug的一般方法。
▲任务拓展
1.在App中完成此关卡的任务
2.习题练习
任务场景再现:

(1)如果解决方案是这样的,能完成任务吗?如果不能,该如何修改?

(2)如果解决方案是这样的,能完成任务吗?如果不能,该如何修改?

3.任务拓展
如果任务拓展场景如图2.40所示,解决方案应该是怎样的?

图2.40 任务拓展场景
你的思路: