在程序开发过程中,出现程序错误 (BUG) 是不可避免的。这时候就需要对程序进行调试,通过调试,发现程序错误,从而着手修复BUG。
本文将介绍一些在Scratch中调试程序的实用方法。
01
概述
编写一段程序或许不难,难的是程序出现错误后,调试、排查、修复的过程。与编写程序相比,程序调试对于开发人员的水平要求更高。从教学的角度来看,学生的程序调试排错能力是一种层次较高的能力。学生跟着老师学习了一百个案例,每行代码都烂熟于心,但是当真正自己开始编写项目时,出现BUG却手足无措。这时掌握程序排错方法显得格外重要,好的调试策略是设计程序时的一件法宝。程序调试亦是学习编程对思维方式锻炼的体现。
至于程序出现错误的原因,除了那些所有编程语言共通的原因,还有一些“Scratch 特色”的原因。是由于 Scratch 本身机制问题导致程序执行结果与预期目标不符合。一些经典的、由于 Scratch 本身机制问题导致的BUG与解决方案在本公众号的其他文章中都有提到,如
02
调试方法
1、气泡输出法
利用【说()】或【思考()】积木的对话气泡,返回对象的某个参数,或是报告某个条件是否成立。
利用【说()】积木使克隆体报告其ID
克隆体的局部属性的获取是比较麻烦的,用【说()】积木可以较为方便地查看某一个克隆体的某个局部属性。
利用【说()】积木查看角色碰撞情况
可以十分灵敏地显示老鼠是否碰到猫头鹰。
优势:
使用起来十分方便、灵活。在程序运行过程中想要测试某个角色在某个节点的参数,只需把【说()】积木放置在对应的脚本中,结果一目了然。
通用性强,支持多种数据类型的输出,无论是数字类型、字符类型还是布尔类型,都可以输出。
且呈现方式直观,多个角色的局部属性通过这种方法可以同时在舞台上被观察到,而不必切换角色
劣势
【说()】积木会说谎,这类在舞台中输出内容的积木,在输出时都会对数据进行一定的处理,无法获取最真实或者说最接近真实的数据。
【说()】积木将原始数据的小数保留至百分位
气泡输出法会对数据进行了一定的处理,这的确是一种优化处理,但是在某些情况下,这种优化反而会掩盖事实的真相,而不利于我们修复BUG,唯物辩证法如是说。
【说()】积木忽略忽略浮点运算的精度丢失问题
由此引发的程序错误自然无从下手。
关于浮点运算的精度丢失问题,可以参照
《每个Scratcher都应该知道的浮点运算》。
2、积木点击法
顾名思义就是直接点击功能积木(圆角矩形和六边形),查看其返回值。
在积木区中直接点击功能积木
官方指定调试方法,纯粹为了调试而生的功能
优势:
方便,直接点击就能看到返回值,不需要配合其他积木使用。
数据原始,通过这种方法能拿到最一手的、未经过任何加工处理、零添加的数据。
劣势:
灵活性较差,具有滞后性。无法实时返回数据,只能返回点击积木瞬间的值,如上文中猫头鹰和老鼠的案例,老鼠碰到猫头鹰,短短一瞬间后就离开,除非手速够快,否则是难以用这种方法捕捉到这个瞬间的返回值的。
通用性较差,一些特殊的积木,如【碰到(鼠标指针)?】
通过积木点击法获取的这个积木的返回值,一定是false。点击积木的瞬间,鼠标一定是在积木上,而不可能同时出现在角色上。
凡事无绝对……
3、显示器输出法
有的圆角矩形积木是自带显示器的,可以勾选积木前的单选框,直接从舞台中的显示器观察到其数值。
至于没有显示器的积木,可以通过变量来赋予它显示器。
将返回值赋值给变量
同理,当有多组数据时,还可以通过列表显示器来呈现。
转载需注明作者和出处
显示器输出法类似于文字输出法,都是将返回值直接输出到舞台中,可以直接进行观测。
优势:
与文字输出法相比,界面更整洁清爽
可以保留作用域:全局变量/局部变量
同文字输出法
劣势
需要新建变量/列表,使用起来略显繁琐。
数据同样会经过处理,无法获取最真实或者说最接近真实的数据。
4、计数法
借助变量统计一段脚本的执行次数,最经典的做法非克隆体上限测试莫属。
用计数法统计克隆体上限
变量 cloneCount 数值达到300不再增长(采用4倍速剪辑)
突发奇想:
我将其命名为递归克隆
执行效果请自行脑补……
在一些复杂的程序中,循环到底执行了多少次、消息发送了几次,又接收了几次、多少克隆体执行了相应的脚本,都是难以直接观察出来的,这时候用计数法来进行测试,结果就一目了然了,一旦计数结果与预期不符合,那就能进一步锁定BUG所在位置。
优势:
直观,可以直观地反映某些不直观的脚本的执行次数,如克隆、消息。
准确性强,除非积木放错测试节点。
灵活性强,“哪里不会点哪里”,需要测试哪段脚本的执行次数,把【将变量增加(1)】往相应的位置一放就可以了。
具有一定的通用性。
作者:小阿斌
【Scratch 格物堂】投稿
领取专属 10元无门槛券
私享最新 技术干货