【超详细Scratch教学课件分享】两位数可暂停倒计时
本篇内容在与非学堂公众号2020年9月7日首发。
全世界的少儿编程老师,Unite!
课件属性分析(每项数值最高都为10):
-
难易度-7(适用于具有循环、条件、变量基础,中等偏上水平的孩子)
-
趣味性-4(不是特别有趣,中偏下)
-
讲授性-7(需要老师比较多的讲解,学生听讲理解、接受)
-
启发性-5(使用了6次关键的选择题,2次关键的问答题)
故事背景:
小熊已经编写好了一个从9开始数到0的倒计时,并且还可以随时按下空格键,控制倒计时的开始或继续。但是现在它有了更多的想法:既然已经有这些功能了,为什么不能设计一个可以从99往下倒数的倒计时呢?
作品效果要求:
设计一个倒计时,可以从99开始倒计时,数字每秒减小1,显示0时,播放铃声,并且在倒计时过程中,按下空格键时,如果正在进行,则计时暂停,如果按下时已经暂停了,则计时继续。
课堂教学流程:
找回我们之前完成的“可暂停倒计时”(【超详细Scratch教学课件分享】可暂停倒计时)。
我们已经可以让数字从9倒数到0,在这个过程中可以随时按下空格暂停或继续了。
大家回想一下,曹老师是怎么让大家完成可暂停的倒计时这个功能的呢?
我们是这样做的。如上图,要用一个操作控制暂停和继续,关键是用一个“计时状态”的变量,让它在两种状态之间切换。然后在重复换造型的代码那里,根据这个变量的值来确定是否真的要换造型,循环的结束条件就是造型编号=10(即0的造型)。
现在,我们要让倒计时从99开始,意思就是要显示两位数。
原来一位数,现在要变成两位数。大家想一想,怎么做呢?
老师这里教大家两个方法。
第一个方法啊,很简单,同学们都能想得到。
大家说之前我们是怎么做到数字9、8、7……0这样变化的?是不是用的换造型?
那既然之前我们用的换造型,完成了从9到0的变化,现在我们是不是也一样可以用换造型的方式,让这个角色从99到0的变化啊?
回答肯定是YES!
我们试一试,把角色的造型,一个一个增加,从9一直添加到99,大的数字都往前放。来吧!
(此处如果真的要做的话,耗时5分钟……)
大家想一想,这种做法做完之后,需要改的地方只有一个:“重复执行直到”后面的条件,改为“造型编号=100”就可以了(因为这时造型0已经是第100个造型了)。
按理说,运行也不会有任何问题!
但是!大家想一想,这种方法是简单呢,还是不简单呢?
我们如果是从99倒数到0,用这种方法其实还可以,大不了费几分钟时间嘛!但是,如果要让这个程序,从999倒数到0呢?从9999倒数到0呢?是不是就会把人累死了啊?
同学们注意,我们在编程时,如果你写的程序,能解决当前你遇到的一个问题,那可以算是及格,如果能解决几种情况下的问题,可以得80分,如果能适用更多的情况,更加通用,那就能得90多100分了。
程序的通用性,一个代码能不能解决更多的同类问题,是判断这个代码好坏的一个方面。
这就是说,如果我们的代码更通用,那过一段时间我们就更有可能会再用到它,它重复使用的几率就增大了。同样,如果我们的代码更通用,大家也可以一起在网上共享了,我们就可以直接把别人已经写过的解决同样问题的代码,拿来就能解决自己的问题了。
大家别小看了这种代码的优势。正是有了这种通用性、可重用性,计算机技术才能在这么短短几十年取得这么大的成果。
好,那么我们现在就来想一想,怎么才能让这个倒计时的程序,能够以不变应万变,让我们不管想从几位数开始倒计时,都能够完美进行呢?
这就是曹老师要介绍给同学们的第二种办法。
这种方法更加通用,那说明我们考虑到的点就会更多,不用说,编程肯定会更加麻烦一点。但是麻烦只是暂时时,一旦写好这个程序,无论什么需求,都能很好的快速实现了!
不过为了使问题先不要一下子就变得很难,我们还是把数字先控制为从99开始。后面我们再说从任意位数开始的做法。
刚才第一种办法,我们是在1个角色上添加100个造型。现在我们换个思路,1个角色已经有了0-9这十个数字,那要显示0-99这一百个数字的话,还可以怎么做?(请同学们直接回答)
我们可以直接把有着0-9这十个数字的角色,再复制一个,这样的话,让它们一前一后,一个代表十位数,一个代表个位数,就可以了。
(练习时间)
大家注意,这一步完成之后,我们需要整体地思考一下,如何往下进行了。
现在我们有两个数字角色,每个上面都有10个数字的造型。要想从99开始倒计时,中间仍可以控制它的暂停继续。
(请同学们先回答这个问题后继续后面的内容)
哪些角色需要有暂停继续的功能呢?
A. 十位数
B. 个位数
C. 都需要
很明显,这里应该选“都需要”。这是因为我们计时暂停,是两个位上的数字都得暂停。
既然是都需要的话,整个程序共用一个“计时状态”的变量,是不是就可以了?并不需要单独控制某个数字,对不对?所以,原来我们在每个角色里的控制“计时状态”的代码块,现在不需要放到每一个角色里了。
就是上面这段代码,它本来是在数字角色中的,我们在复制数字角色的时候,把它也一起复制了。这样一来,对整个程序而言,有两段同样的代码,那么当我们按下空格键时,同样的代码就会执行2次了,因此这样反而会出错。
因此我们得删除其中的一个,并且最好是选择比较理想的地方来放这个共用的变量控制代码。放哪里好呢?
(请同学们先回答这个问题后继续后面的内容)
程序共用的这段“计时状态”变量控制代码,最好可以放到哪里?
A. 十位数
B. 个位数
C. 舞台背景
因为代码是“共用”的,所以最好把它移到一个公共的,谁也不偏袒的地方,因此,我们可以把它从角色里移到舞台背景上,表示可以控制整个程序。
(练习时间)
大家在改变用空格控制“计时状态”代码的位置后,可以运行试试,发现两个数字会同步从9变成0。
大家想一想,之前数字从9到0,非常简单,我们是直接让造型从9变到0就完事儿了。但是现在要从99开始,并且角色也变成了两个。
这里涉及两个问题:
问题一,怎么让程序知道,数到哪一个数字了呢?
问题二,怎么让两个角色,一起来表示0-99之间的某一个数字呢?
(请同学们先回答这个问题后继续后面的内容)
程序要知道数到哪一个数字了,需要用到什么编程概念?
A. 循环
B. 条件
C. 变量
D. 广播
这个我们没得选了,就是变量。因为变量的功能,就是记录。程序需要知道的任何东西,都可以用变量。
这个变量,我们给它起个名字,就叫“当前数字”。
因为“当前数字”也不是属于某一个角色的,而是要指挥两个角色共同变化造型,所以我们也要在舞台背景上编写“当前数字初始化的代码。
(练习时间)
那下面面临的问题是,两个角色怎么一起表示“当前数字”这个变量表示的数字呢?
这里我们可以这样想,是不是“当前数字”这个变量的值,才是我们倒计时真正计的数,它是灵魂,而舞台上的两个角色,是“当前数字”的两张皮。
所以,这里我们得先把代码再调整一下。之前我们是直接在角色上用“重复执行直到……”控制的造型变化,对不对?现在不行了,现在我们得控制这个“当前数字”变量的变化才行。
简单地说,不管是重复执行的每1秒的数字变化,还是空格造成的暂停和继续,控制的应该是“当前数字”这个变量才对,而舞台上的两个角色,需要用某种方法,从这个“当前数字”的灵魂处,获取信息,显示自己应该显示的那个造型。
所以,让我们复制一份角色中的代码到舞台背景上,然后再修改吧!
角色中要复制到背景上的代码(同时把两个角色中现有的代码都删除):
在舞台背景上,要把复制来的代码修改成什么样子呢?
首先,舞台背景上不需要处理造型相关的东西,“换成……造型”直接删除。
其次,“重复执行直到……”后面再也不是“造型编号=10”了,而是要用灵魂变量“当前数字=0”来判断。
最后,计时里每次“等待1秒”后,不是“下一个造型”了,而是换成对变量的控制:“将当前数字增加-1”。
所以这时舞台背景上修改后的代码是这个样子的:
(练习时间)
运行起来后,可以看到,“当前数字”的变量(打上勾显示在舞台上),可以从99一直往下减少了,按下空格,它也可以暂停了。
现在就剩下两个数字角色不跟着“当前数字”这个变量变化造型的问题了。
我们暂且不想,怎么让数字角色真正显示成变量对应的值。我们先想一想,要让它们跟变量的值时时对应,应该用什么方法吧!
(请同学们先回答这个问题后继续后面的内容)
“当前数字”随时可能改变,也可能不改变,用哪种方法能让数字角色,时时跟“当前数字”保持同步?
A. 循环
B. 条件
C. 克隆
相信同学们看到了,问题中的一个关键词“随时”,像“随时”“一直”“时时”等这种表示重复时间的词,在编程实现时,必须要用到“循环”。(其实用广播也可以,同学们可以在完成这种方法后,再自己思考怎么用广播实现)
具体循环里要做什么事情,才能让造型跟“当前数字”变量值保持一致呢?
“换成……造型”这个代码块,肯定是会要用到的,但是这个代码块只能选择换到某一个固定的造型,我总不可能要循环地换成一个固定的数字吧?那这样效果就是这个显示出来的数字再也不会改变了。
那这个怎么办呢?
其实,这里有一个小技巧,大家拿小本本记好了~我们这个“换成……造型”这个代码块,除了能够下拉选择造型之外,还可以拖一个数字变量进中间的椭圆形位置。这样的话,如果这个变量值为2,就会把角色切换到它的第2个造型。变量的值将对应到造型的编号上。
由于有这个性质,我们如果能让切换到的这个造型,刚好就显示变量里数的值,是不是就更省事儿了?(请同学们直接回答)大家看,我们现在角色的造型是这样排列的,应该怎么调整才能满足这个要求呢?
得让第1个造型,就显示数字1,第2个造型显示数字2,……第9个造型显示数字9,这样才行。暂时把数字0放到最后一个。
改变造型顺序后,是这样的:
十位数和个位数两个角色都调整成这样。(反正现在个位数什么代码也没有,可以直接先把它删除了,重复从十位数复制过来,再改名)
(练习时间)
好,现在我们需要让十位数和个位数两个角色,分别切换到一个数字对应的造型。
比如,现在“当前数字”是89,十位数是不是应该切换到8的造型,而个位数是不是应该切换到9的造型?
刚才这个代码里的“数”这个变量,对十位数而言,它就应该是8,而个位数而言,它应该是9。那很明显,这两个角色里需要的数字不一样。
既然需要的数字不一样,我们是不是直接再来一个变量,就可以了?
是的,并且为了记变量名更清楚,我们要把两个变量分别改名为“十位”和“个位”。
我们希望,十位数的角色,时时换成十位变量对应的造型,而个位数的角色,时时换成个位变量对应的造型。
(练习时间)
不过这一步写好了,倒计时程序仍然不会工作。因为我们只是认为有这样“十位”和“个位”的两个数字变量,但是它们的值到底是多少?默认的只是0啊!所以运行程序后,舞台上只会出现00。
到这里,其实我们离目标只有一步之遥了。
“十位”和“个位”两个数字,来自哪里?来自我们之前的“当前数字”这个变量啊!
那么,怎么把“当前数字”里的十位和个位,分别拆到“个位”和“十位”这两个变量里去呢?
这里需要考验大家的数学知识了!
我们都很容易看出来,89的十位是8,个位是9,那计算机怎么看出来呢?说白了,我们需要把咱们人看出这个8和9的过程,一五一十地告诉计算机。
其实我们89,可以写成80+9。
8所在的位置,之所以说它是十位,是说它这上面的一个数字,表示的是这么多个十,8就表示8个十。
而9所在的位置,是个位,是说它的数字表示的是这么多个一,9就表示9个一。
89 = 8 * 10 + 9 * 1
同样,
53 = 5 * 10 + 3 * 1
29 = 2 * 10 + 9 * 1
4 = 0 * 10 + 4 * 1
大家看,这样是不是就拆分出来一个两位数的十位和个位了?
我们用计算机算的时候也是,先看一个数里有多少个10,再看除去这个几十后,还剩下多少个1。
大家注意,老师这里用了一个“先”“再”对不对,说明咱们的程序只需要分两步就可以完成!开心吧?
问题是,怎么先看一个数里有多少个10?(现在只考虑它是100以内的数)
这个问题,难吗?80里有多少个10啊?89里有多少个10啊?
(请同学们先回答这个问题后继续后面的内容)
计算一个数里有多少个10,应该使用哪种计算?
A. 加法
B. 减法
C. 乘法
D. 除法
我们应该使用除法!80/10=8,所以80里有8个10。而89/10=8.9,虽然这里是小数,除不尽,但是也没有9个10,只能算有9个10。
我们在编程时,为了表示这种不管除得尽除不尽,都取结果的整数部分的运算,叫做“取整运算”。在“运算”代码组的最后一个。
用上面的方式就能得到“当前数字”的十位部分了。我们像下面这么写,把它放到十位的变量里。
有了十位之后,个位是不是就是剩下的部分了啊?那怎么算除掉10位后剩下的部分呢?其实就是计算一个数除以10的余数,对不对?
80/10=8 ...... 0
89/10=8 ...... 9
35/10=3 ...... 5
其实都是在原来的数上,减去刚才得到的十位数字*10之后,剩下的就是余数。
(请同学们先回答这个问题后继续后面的内容)
这段代码放哪里最好呢?
A. 舞台背景
B. 十位数字角色
C. 个位数字角色
因为它里面既涉及到十位变量,又涉及到个位变量,还涉及到当前数字,看来是一段公用的代码。所以我们可以把它放到舞台背景上。
在舞台背景上,什么时候执行这两行代码好呢?因为每一次当前数字改变,才会引起十位变量和个位变量的改变,所以把它放到当前数字变化的代码后面,是最妥当的了。
(练习时间)
到这里,一个完整的两位数可暂停倒计时程序,就完成了!
教学流程总结:(请横屏查看)
知识技巧总结:
-
理解程序的通用性、可复用性
-
区分公共代码与角色自身代码
-
掌握计算数字的十位和个位的方法
-
知道向下取整运算的用法
-
掌握“换成……造型”代码块中使用变量的用法
课后作业:
请同学们修改程序,在十位和个位这两个数字角色里,用广播的方法完成造型的切换。
与非学堂(codingclassonline)
一个专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源的公众号。
--------------------------------------
【课件分享】
【往期每日一题】
-
【Scratch竞赛每日一题】循环变大小
-
【Scratch竞赛每日一题】循环画画
-
【Scratch竞赛每日一题】循环变量
【近期考竞通知】
【高赞原创集锦】