
第五关 发现并修复程序错误
▲任务描述
进入到第五关,我们发现,编辑代码区域并不是空白的,而是已经有了多行命令。这道关卡并不需要你从零开始添加命令,而是在它原有的基础上对命令进行调整。同样,调整后的命令组合,要能够获得1枚宝石并打开开关,才算完成任务。游戏第五关界面如图2.26所示。

图2.26 游戏第五关界面
小贴士
图2.26中的①区域是系统给出的一种解决方案,可能存在一个或者多个程序错误。若要通关,可以对已有命令进行修改。
②是一个按钮,点击后会弹出选择运行速度和调试模式的菜单。
本关卡中可用的相关命令如图2.27所示。

图2.27 浮现命令栏
▲任务分析
根据任务状态栏可知,本关卡与前几关卡需要完成的任务相似,即获取1枚宝石并打开1个开关。系统给出了一种解决方案:

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

图2.28 系统自带解决方案的运行结果
运行后的结果令人失望,Byte既没有获取宝石也没有打开开关,说明解决方案给出的命令存在问题,具体是哪个部分出现问题呢?如何去定位问题呢?
在Swift Playgrounds中进行命令调试非常方便,点击“”,会弹出如图2.29所示的菜单。调试有两种方法,效果相似,仅调试速度不同。
① “单步调试我的代码”——此模式下,可以指定每一条命令,观察命令效果。
当前运行的命令通过“”表示。
②“以较慢速度单步调试”——同样是一个命令一个命令依次运行,只是运行的速度比“单步调试我的代码”模式下的速度要慢,能更好地观察到命令执行的效果。已经运行过的命令用“”表示。除了前面的两种调试方式,Swift Playgrounds还提供了3种不同速度的运行方式:以最快速度运行,以更快速度运行,运行我的代码。Byte其实是一个挺悠哉的少年,走路总是晃晃悠悠,蹦蹦跳跳。对于急性子的你来说,是不是特别“揪心”。那么,在你对自己代码有信心的情况下,你可以调整速度运行,加快闯关效率。

调试介绍

图2.29 调试菜单栏
编程思维
编写代码免不了会存在问题,问题在程序中的术语称为“Bug”(来自有道词典:bug n.故障,臭虫)。不要担心,有Bug,那我们就消除它们。在程序中,这一过程被称为“Debug”,即调试程序、消除故障的意思。
程序员除了会编程,还需要具备较强的调试能力,因为再老练的程序员也不可能不出错。调试需要你具备较强的逻辑思维能力,更重要的是有耐心,能够逐一排查问题,精准定位问题,快速解决问题。
利用“以较慢速度单步调试”的方法,观察Byte每步的行走效果,查出问题所在,如图2.30所示。通过调试的方法,我们发现,Byte提前左转了,应该从起点出发,前进2步然后左转,左转后再前进1步,收集到宝石,接着前进1步打开开关。我们只需要调整左转和前进的顺序即可完成任务。

图2.30 调试中关键步骤的截图
▲解决方案
只需要调整解决方案中第2行turnLeft()和第3行moveForward()的顺序就能修复程序错误。调整顺序的操作很简单,只需要按住其中一个想要调整的命令,如turnLeft(),按住不放,拖至正确位置松开即可。操作如图2.31所示,修改后的命令组合解决方案如下:


图2.31 调整命令顺序
关键步骤运行的效果如图2.32所示。

图2.32 关键步骤的运行效果
▲任务小结
①学会单步调试代码。
②学会更改命令顺序。
③学会发现Bug、修复Bug的一般方法。
▲任务拓展
1.在App中完成此关卡的任务
2.习题练习
任务场景再现:

运行微视频

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

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

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

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