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