卡卡逐渐摸出了规律——只要保持专注,还是能挣脱这些“注意力陷阱”的。他回忆起自己平时的情形——本来是打算用手机搜一道作业题,不知道怎么的就点开了一段视频,然后又下载了一个小游戏……等回过神来的时候都忘了自己最初要干什么了……
卡卡一边想一边来到了古堡的大门口,一只狮身鹰首兽(Griffin)守在那里,对卡卡说——
“能够安全到达这里,说明你挺厉害哦!这样吧,我就不跟你战斗了。只要你回答出我的问题,就可以通过这道门,我还会送你一把打开通关密道的钥匙,如果答不对,嘿嘿……”。
卡卡眼前一亮,通关密道的钥匙!拿到它就很容易过关啦!
“您出题吧!”
“听好了,小明身高172cm,体重82kg,请问他的身材属于 1、偏廋,2、正常,3、超重,4、肥胖。请在1分钟内回答——倒计时开始,60,59,58……”
这不是求BMI(身体质量指数)的数学题吗?还好前两天刚看过计算公式,卡卡心里飞快地计算起来。
学习目标
- 熟悉常见的数学运算指令,掌握使用 Scratch 进行数学运算的方法;
- 理解“广播消息”和“接收消息”的概念;
- 学会使用流程图梳理比较复杂的程序结构;
- 使用询问方式获得用户输入。
编程实战
本节我们编程实现BMI指数的计算。
BMI 是指身高体重指数,通过将人的身高及体重换算成BMI值,可以看出一个人是否超重。计算公式很简单,就是用体重的千克数除以身高平方(米为单位)。举例来说,一个人的身高为1.75米,体重为68千克,他的BMI=68/(1.75)² = 22.2,然后再根据下面的列表找到对应的范围可以看出这个人的体重是正常的(最理想的体重指数是22):
- 偏瘦:BMI<18.5
- 正常:18.5<=BMI<24
- 超重:24<=BMI<28
- 肥胖:28<=BMI
** 注意哦,BMI只是一个参考值,和性别、年龄等因素都有很大关系! 不能用这个数值直接判断一个人是不是真的超重哦!**
有了这个公式,我们就可以编写代码了。
第一步:Griffin(格里芬)角色编程
新建 Scratch 项目,将背景设置为背景库中的“Castle 1”,这是一个城堡的大门。然后添加一个内置的 “Griffin” 角色进来。这个角色有四个造型,我们进入造型标签页,把后面两个造型删除掉,接着把它的方向设置为-90度,左右翻转模式,和小猫面对面:
为了让 Griffin 在原地扇动翅膀,我们给它添加下面的简单代码——是不是和前面课程用到的蝙蝠代码一样?
第二步:计算格里芬的题目
完成场景之后,让我们实现让小猫计算BMI的功能。Scratch 提供了丰富的运行类指令供我们使用(绿色),你可以看到里面除了我们用过的随机数、逻辑判断之外,还有加减乘除四则运算,以及取余、四舍五入和字符操作的指令,以后我们将会用到:
现在要计算格里芬的题目,也就是82/(1.72)²,这个对你来说应该很简单,不过由于这里面不只一步运算,所以我们可以从优先级最高的计算开始,先计算(1.72)²,也就是1.72乘以1.72,在运算类指令中找到乘法指令,拖动到代码区:
接下来要用82除以上一步的计算结果,我们再拖动一个除法指令过来,然后把刚刚写好的指令拖过去就可以了:
现在这条指令的结果其实就是BMI的值。下面的代码我们还需要根据计算的BMI值来进行判断,所以我们可以把结果保存到一个变量中。
接下来我们就可以根据变量值进行判断了。我们可以从最小的值开始判断,如果BMI的值小于18.5,小猫就直接说“偏瘦”,否则说明BMI大于18.5,这时进行第二层判断它是否小于24,如果小于24成立,则说“正常”;否则说明BMI大于24,这时进行第三层判断它是否小于28,如果小于28成立则说“超重”,否则说明BMI大于28,小猫说“肥胖”——你是否感觉到这样表达啰嗦得不得了?是的,用自然语言表述这类逻辑判断层级多的场景时总有些力不从心,最好用图形来帮助我们整理逻辑——还记得我们第一章学习的流程图吧?现在它要派上用场了。
根据上面的逻辑描述,我们可以画出下面的流程图:
是不是很清晰?真的是“一图胜千言”呢。
根据这个流程图,你就很容易写出下面的代码了:
判断完成之后呢?小猫虽然“说”出了答案,可是对面的Griffin并没有什么反应,因为我们并没有编写代码通知它。怎么才能通知它小猫说出了答案呢?这牵涉到角色之间的通信问题,Scratch 为我们提供了“消息”机制。
首先,发送消息时,你并不能指定发给谁,而是本程序中所有的角色都可以接收到(但他们可以不处理,充耳不闻),如果用广播指令,则发完消息接着执行发消息下面的指令;如果用“广播并等待”,则发完消息后一直等待所有处理这条消息的代码执行完才继续执行后续代码,这两者的区别可以在日后的学习中体会。那么怎么接收消息呢?如果角色想接收另一个角色发来的消息,只要在“当接收到XX消息”指令后添加处理代码就可以。
这样,你就知道怎么办了吧?我们需要先给小猫代码最后加上一条“广播”指令,并在指令中点击那个向下箭头,选择“新消息”,会出现下面的窗口,让你输入消息名称:
我们输入“回答完毕”作为消息的名称,点击确定,小猫发消息的代码就完成了:
第三步:格里芬接收消息
小猫已经发送了消息,现在轮到Griffin接收消息了。
当接收到“回答完毕”消息时,Griffin先使用“停止该角色的其它脚本”指令,结束了不断扇动翅膀的代码,然后告诉小猫“你答对了,进去吧!”,把自己隐藏起来。为了让程序启动时Griffin恢复可见,我们在原有绿旗指令后加了一条显示指令。
第四步:显示钥匙
Griffin还要送给小猫一把钥匙让它直接进入最终BOSS关卡。这里我们再添加一个 Scratch 内置的“Key”角色进来,放到Griffin所处的位置,并给它编写下面的代码:
和Griffin正好相反,程序启动时钥匙隐藏,收到小猫回答完毕的消息后,它等待3秒钟(让Griffin有时间说完话隐藏起来),再显示出来,告诉小猫“钥匙就在这里”。
第五步:进一步提升
其实本节课程要求的功能已经实现了,但我们不妨来设想一下,如果每次小猫在计算之前,能让你输入身高和体重,然后它根据你输入的身高体重来计算BMI值,这个程序是不是就有一定的实用性了呢?其实这也不难,只需要用到下面这条“询问并等待”指令。执行这条指令的时候,舞台上会出现一个输入框,并显示提示信息,要求你输入内容。你输入的内容会保存到“回答”这个内置变量中(它就在“询问并等待”指令下面):
由于我们要让小猫询问两次,分别是身高和体重,而每次询问的结果都会覆盖上一次的回答,所以我们需要用不同的变量保存回答的值再用来计算。新建两个变量,分别命名为“身高”和“体重”,然后对小猫的代码做一下修改:
我们在计算BMI的代码前面增加了要求输入体重和身高的代码,并把原来BMI计算公式中固定的值换成了变量(从指令区拖动过来即可),这样小猫每次就会询问你体重和身高,再做相应的计算。你可以拿它来测试一下你身边的人是不是超重了——仅供娱乐哦!
指令小贴示
- 询问【提示】并等待:弹出一个气泡框让使用者输入内容,这个内容会保存在“回答”变量中,记得马上用;因为如果后边还有询问,回答的内容就被覆盖了;
- 【值】运算符号 【值】:一系列的数学计算指令,能进行简单的四则运算;
- 广播【消息名称】:向所有角色发送一条消息;
- 当接收到【消息名称】:控制类指令,当收到指定消息时触发后面的代码执行;
- 显示:让角色在舞台上显示出来;
- 隐藏:让角色不在舞台上显示。
课后思考
本节内容牵涉到消息发送和接收、多分支的逻辑运算以及程序输入等知识点,其中消息收发最为关键,需要你多练习几次。
最后请你思考一个问题:在输入身高或体重的时候,我如果不输入数字,输入一个“猫”或“Griffin”等其它不是数字的信息,程序会出现什么结果?这种结果符合你的预期吗?你应该怎样避免这种情况发生?