【青少年编程】【答疑】对「等待(0)秒」的理解
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。如果加入了之前的社群不需要重复加入。
微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档)。
问题
今天,我们在「青少年编程竞赛交流群」内一起讨论了一个遇到的问题。我把代码和视频放到下面,大家感觉一下。
舞台展示:
舞台中有两只一摸一样的小猫,一只在左边,一只在右边。
左边小猫的代码:
右边小猫的代码:
这两个代码,都是让小猫旋转2周。右边小猫的代码在循环中增加了一个积木块「等待(0)秒」,起初我认为这个积木块是多余的,直到运行之后才对这个积木块有了新的认知。
大家可以看下面的运行视频。
从运行结果可以发现,「等待(0)秒」会产生一个短暂的线程堵塞(看上去的0秒,其实并不是我们想象中的0秒)。从而导致左边的小猫比右边的小猫更快的完成了旋转2周的操作。
验证
我们有了以上的猜测,就可以用「等待(0)秒」这个积木块来解决点击绿旗后多个角色代码执行顺序控制的问题。
点击绿旗,程序开始。如果多个角色都有对应的代码,则同时开启多个线程并行执行。这里需要注意,看起来是同时一起执行,其实这些线程启动的先后顺序跟当时CPU的状态是有关系的,并不是严格意义上的同时。
我们先看下面小猫吃蛋糕的例子。
舞台展示:
小猫的代码:
点击绿旗之后,小猫移动到初始位置(X=-94,Y=-32)。按上下左右键,小猫做出相应的往上下左右走10步的动作。
蛋糕的代码:
点击绿旗之后,显示蛋糕,一直检测是否碰到小猫,如果碰到小猫就隐藏起来,并停止这个脚本。
看出来这块代码的问题了吗?我们先通过视频演示一下。
从视频中我们可以看到,小猫第一次吃掉蛋糕后,第二次运行的时候,蛋糕并没有显示。
怎么回事呢?比较靠谱的理由就是蛋糕的点击绿旗之后运行的代码先启动了,由于小猫在蛋糕的位置,所以条件语句为真,蛋糕被隐藏了。小猫代码后启动,小猫移动到初始位置,蛋糕却没有显示。
怎样解决这个问题呢,我们就可以使用「等待(0)秒」这个积木块来控制代码的执行顺序。
修改后蛋糕的代码:
增加一个「等待(0)秒」的积木块对当前的线程做一个短暂的堵塞,就不会出现上面的问题了。
我们再看一下运行的结果
总结
我组建这个「青少年编程竞赛交流群」的最大益处就是能够快速获取大家的学习反馈。收集大家学习中遇到的问题,一起讨论一起解决,从而提升我们对Scratch中各个积木块的认知。