调试脚本

对于Scratch用户来说,常见的问题是一个看似完美的脚本却无法按预期工作。这通常是用户犯的小错误,可以修复。这通常被称为“调试”,这个术语在20世纪被计算机科学家Grace Hopper流行化,她从机器中取出了一只真正的飞蛾,并说她在“调试机器”。

检查脚本

检查一个不起作用的脚本通常并不容易。找出脚本的问题是困难的,因为对作者来说它是有意义的。通常,从计算机的角度思考会突出问题。例如,要计算分数1/2+1/3+1/4+...+1/100的总和,可以使用以下脚本:

p1

这个脚本不起作用,因为在检查脚本时,“n”变量在最后一次迭代(循环/重复)时将等于0,从而导致零除错误。

其他问题可能发生在操作确实发生但用户看不到的情况下。例如,如果精灵被隐藏或具有100的幽灵效果。一个实际的例子是上面脚本的延续:

p2

有时,错误纯粹是逻辑上的,在某个时刻看起来是合理的。这些通常是最难追踪的,因为没有真正的“错误”。例如,不小心插入了错误的变量,或者改变了减法的顺序,将使脚本混乱,而不给出任何迹象。找到这些错误的最佳方法是向朋友求助。逐个检查整个程序,确保所选的朋友理解每个步骤。如果存在逻辑错误,他们可能会发现。

预防错误

  • 防止愚蠢错误的最佳方法是拥有整洁、有组织的代码。按照功能或评估顺序对脚本进行排序将有助于发现并预防错误。
  • 在花费大量时间编写脚本的地方留下注释;这样,如果再次出现故障,可以参考过去脚本工作原理的片段。有足够经验的人应该能够一眼看懂脚本。
  • 不要盲目地从其他项目中复制脚本,除非这是项目的意图。除了道德上的复制盗窃问题,很有可能脚本在程序的上下文中无法正常工作。要学习如何制作简单、集成的工具,请参阅高级克隆用法。

检查数值

如果需要了解一个值来确定脚本是否正常工作,有几种方法可以找到它。 使用“说出 ()”积木块。可以使用“说出”积木块来不断检查一个值。

p3

更新变量。也可以不断更新变量。

p4

这些方法也可以用来检查布尔值:

P5

测试代码

测试一个庞大而复杂的项目是令人生畏的,因为每一次更改都可能导致某些问题。

通常,最好的方法是反复运行项目。但是,对于大型游戏或动画来说,这样调试将非常痛苦。相反,可以引入某些测试代码,在最终发布时将其删除。例如,要测试游戏的第27关,可以添加一个脚本,在按下“空格”键时,游戏进入下一关。

为了确保代码保持功能正常,可以自动化某些测试。例如,应该返回数值答案的脚本可以根据一些内置情况进行自动化测试:

添加等待和显示变量

调试脚本的一种方法是添加等待和显示变量,以便可以逐步查看事物的变化。

P6

6(1).png

调试列表

创建一个调试列表并逐步打印可以帮助调试。没有最好的调试日志方法。例如,对于上面列出的分数相加示例:

P7

要记录变量N和Total到调试列表,可以添加“添加到列表”积木块:

P8

常见错误原因

同时运行多个脚本

同时运行多个脚本可能导致意外行为。相同的脚本可能会根据脚本的创建顺序以不同的方式运行。如果同时运行多个脚本,每个脚本都会执行一个积木块,然后是下一个积木块,按照帽子积木创建的顺序执行脚本。例如,

P9

变量的设置值将取决于帽子积木的创建顺序。无论哪个帽子积木先创建,变量都将被设置为第二个帽子积木的值。在更复杂的项目中,这些错误可能很难找到。

P10

取决于哪个绿旗先创建,它可能在1000000或1000001结束。

无效操作

通常,Scratch用户编写的程序会使用类似以下的脚本:

P11

当x = 0时,这个脚本会在无限循环块的第10次重复后引发错误,因为在Scratch 1.4中不能除以0。(数学上,除以零的结果为“未定义”或“无解”,而在编程中,它返回错误或“NaN”。)当出现这种情况时,脚本将以红色突出显示,()/()积木块将变为红色。为了解决这个错误,最好的方法是从x = 10.0001开始,而不是10。这样,x永远不会达到0,而是会达到0.0001和-0.9999。

类似的问题也会在求平方根、对数和三角函数等操作中出现:

P12

命令的顺序

Scratch用户最常见的问题是命令的顺序错误。例如,要让一个角色向另一个角色猛扑,一个Scratch用户使用以下命令:

P13

但看起来角色并没有猛扑。

解决这个问题的好方法是将命令重新排列,直到脚本正常工作为止。例如,为了让角色猛扑,Scratch用户将“point in direction 90”命令移动到“wait 0.5 secs”命令之后,从而使角色看起来像是在猛扑:

P14

时机控制

Scratch用户常见的另一个问题是命令的时机控制。这通常在涉及两个脚本相互配合但没有使用广播或变量的项目中出现,比如在示例项目“Joke”中。当时机控制不完美时,整个项目可能会出现问题。但不用担心,以下是解决这个问题的一些方法:

广播和变量

使用广播和变量可以使脚本彼此协调。广播涉及到帽子积木,所以要准备好很多脚本。使用变量可以节省脚本的数量。如果在像“Joke”这样的项目中使用变量,很可能会使用“wait until”积木。否则,可以使用“if”积木或可能使用“repeat until”积木。无论哪种方式,脚本将更加灵活。

细致的时机控制

如果出于某种原因不想使用广播或变量,可以通过使用“wait () secs”积木来调整积木之间的时间间隔。这对于像“Joke”这样的项目来说很容易,但对于复杂的游戏来说则不太容易。

重复过程

这种方法主要适用于非常复杂的游戏。为了进行准确的检测,在触发反应之前,应该重复执行几次测试。虽然这可能不太明显,但运行一个命令需要一小段时间。如果重复执行一个测试积木,它将给予检测更长的时间来改变自身。可以在这个项目中找到这种方法的示例。

定时器

积木也可以围绕着定时器进行操作。Scratch的定时器可以重置和操控,因此可以进行许多操作。有时,如果两个使用定时器的脚本中的一个或两个都有重置定时器的积木,它们可能会发生冲突。

P15

在这个例子中,第一个脚本重置定时器,并在定时器达到3时运行一些代码,因此它每3秒运行一次。第二个脚本重置定时器,并在定时器达到7时运行一些代码。然而,定时器永远不会达到7,因为它一直被第一个脚本重置,所以第二个脚本永远不会运行。我们可以通过创建自己的定时器来解决这个问题。

p16

这个例子的工作原理是将定时器开始时的天数(当定时器为0时)存储在一个变量中,比如t1start。要获取定时器的值,将当前时间减去开始时间。为了转换为秒,将天数乘以86400(一天的秒数)。通过将定时器的起始变量设置为当前的天数来重置定时器。也可以使用常规定时器来替代从2000年以来的天数。在这种情况下,乘以86400的步骤必须省略。这些定时器在没有先进行重置的情况下可能不会从0开始。请确保在项目开始时重置定时器。

不兼容

不兼容是脚本无法正常工作的第三个、也是最不常见的原因。当发生这种情况时,脚本将被标记为红色。精灵被“卡住”了。在这种情况下,除了完全重新构建脚本,采用不同的方法外,实际上没有其他办法。

P17

标签: Scratch, Scratch编程, Scratch中国, 少儿编程, Scratch社区, Scratch编程社区, Scratch编程课程, Scratch编程教程