2.7 实现多次测试
Ch2-2 反应测试升级版
下面,我们要对这个游戏进行改进。
在改进一个已有的作品时,为了不破坏已有的作品,需要把原来的作品另存为一个新的文件,在这个新的文件上进行改进。
NOTICE注意:如何另存成新文件
在本地版中,你如果想把当前文件另存为一个新的文件,仍然单击下图中的“保存到电脑”菜单项,之后填入一个新的文件名就可以了。
如果是在线编辑器,你需要先修改文件名,就是在下图步骤1的红框里填入新的文件名,然后再单击步骤2菜单项“立即保存”。
广播消息
首先,我们要解决它只能测试一次的问题。
我们想多次测试怎么办?先规划一下改进的思路:每次测试结束之后,用户需要单击一下测试按钮,发送一个消息让程序重新做好测试准备,就可以无限次测试了。
在“事件”指令类别里,有三个和消息有关的指令,如下图所示。
我们要在一次测试结束后广播一个“取得结果”的消息,在按下“测试”按钮之后发送一个“准备测试”的消息。
要创建一个新消息,你需要按下上图第2个指令块中的下三角箭头,弹出下图的界面。
单击新消息,弹出下图所示界面,在新消息名称对话框里填入“取得结果”,按“确定”按钮后就生成了广播消息的语句。同样,广播“准备测试”的指令也这样生成。
按钮角色代码
我们添加一个下图所示的角色,把角色的名称改为“测试按钮”,在绘图区域里为按钮添上文字“测试”。
它的代码很简单,只要单击后就会发送消息。
心形角色代码
心形角色代码
如图所示,心形角色的代码块分成了3部分,我们分别展开解释。
心形角色代码段1:设置初始环境
这部分代码如下图所示,它们只负责初始的准备:设置心形为紫色,把反应时间设置为0。注意,从第3个语句可以知道,我们又创建了一个新的变量“时间列表”,它还是个列表型的变量,我们准备用它存储一系列测试的时间结果。
创建列表变量的步骤和创建普通变量的步骤基本相同,在“变量”指令区里,按下图所示“建立一个列表”。
在弹出的“新建列表”对话框里填入列表名,维持它的类型为“适用于所有角色”不变。至于列表变量的用法和普通变量有什么不同,我们后面再具体讲解。
心形角色代码段2:把单次测试作为消息的响应
心形角色的第2段代码如下图所示。
语句1表示,它并不是在单击绿色旗子时开始,而是在接收到消息“准备测试”时才执行这一段代码。
语句2强制显示列表变量。
语句3~9和之前的初级版代码一样,但现在它们处于接收到消息之后的位置。现在游戏的操作顺序是这样:单击绿旗运行后,单击“测试”按钮,程序开始做测试前的准备,比如把心形设成紫色,之后开始测试;完成一次测试后,再次单击“测试”按钮,还可以再次测试。
语句10是在一次测试结束后,发送“取得结果”消息,后面的第三段代码会响应这个消息,把测试结果加入到创建的列表变量中。
语句11~13是一些锦上添花的功能,语句11在屏幕上提示这次的反应速度时间,它和程序左上角的“反应时间”变量内容大同小异,这里的主要目的是让小朋友们感受一下字符串的“连接”操作。小朋友需要仔细分析一下这个操作的具体操作顺序,还要注意的是它还悄悄地把“反应时间”这个数值转换成了字符串。
语句12~13是来自“添加扩展”里“文字朗读”模块的内容,功能很强大,但实现却很简单,小朋友们可以尝试一下。
心形角色代码段3:整理反应时间列表
下面该把多次反应时间添加到列表的代码了。
前面我们给出的是一个完整的带有排序功能的代码。其实,如果你不想实现排序的功能,只需要用下图的代码块取代前面心形角色代码块里整个第3部分的语句块就可以。这两个语句很好理解,每次接收到“取得结果”的消息时,就把取得的“反应时间”添加到列表中。
什么是列表?简单地说,把多个类型相同的内容按一定顺序排列在一起,就形成了列表。比如下图所示的反应时间列表。
对于列表型变量,它的指令块就比较多了,比如下图的指令块只是其中的一部分。从字面的含义,我们就能大概猜出它们各自的功能。我们前面使用的是第一个“加入”指令,就是把一个值加入到列表中的最后面。
扩展阅读
你肯定希望把多次测试的反应时间结果按顺序排列在列表中,这样你一眼就能看出来最快时间和最慢时间是多少,这才是列表的初衷。这就涉及计算机编程里最基础的排序问题。
我们最终版的代码,就是心形代码块的第3部分语句,如下图所示,它使用了一种简单的插入式排序方法。它的原理也不复杂,在把每个时间插入到列表中时,都把它插入到符合由小到大排序的恰当位置上即可。
具体如何判断哪个位置是合适的位置呢?就是每次都从前向后寻找,找到第一个比它大的值,然后插入到这个值的前面。
本书配套视频里,也有对这个排序算法的展开讲解。
NOTICE注意:变量使用千万要注意
在Scratch里需要使用到变量的地方,一定要把变量块拖动到指令块里,而不能手工填写,比如下图中,把“反应时间”的变量块拖出来,改成手工输入的“反应时间”,你猜会有什么效果?它的执行结果不是把“反应时间”这个变量所代表的数值添加到列表中,却是把“反应时间”这四个字添加到了列表中。
小朋友们一定要自己测试一下这个区别。没错,计算机编程就是要“咬文嚼字”,这种细节千万不能马虎,否则就会引起错误,而且这种错误一旦出现,很难后期去查找原因。