1.5 临摹案例
通过阅读前面的内容,相信读者已经大致了解Scratch编辑器的界面组成和功能作用,以及Scratch指令积木的操作方法了。接下来,就让我们以临摹方式创作两个简单的Scratch项目:使用Scratch编程解决数学问题和开发趣味游戏。在这两个案例中,读者只要照着书中步骤操作即可,遇到疑惑的地方可暂时略过,在学习本书的过程中就能找到答案。为了帮助读者顺利完成这两个案例项目的创作,下面的内容将会详细地讲述编程的各个步骤,使读者在临摹过程中逐步熟悉Scratch编辑器的使用和Scratch项目的开发方法。
1.5.1 数学编程:韩信点兵
本案例是一道著名的数学题——韩信点兵,问题描述如下。
韩信带兵1500人去打仗,战死四五百人。战后清点人数时,韩信命令士兵每3人站一排,多出2人;每5人站一排,多出3人;每7人站一排,多出2人。韩信由此马上算出了部队人数。请你也算一算,这支部队在战后还有多少人?
从现代数学的观点来看,这是一个求解不定方程组的问题。但是,假如我们面对的是小学四、五年级的学生,那么该如何教他(她)解决这个问题呢?答案是,我们可以使用Scratch编程来求解答案。
为了便于理解题意,我们把这个问题中的故事成分去除,将它重新描述如下。
有一个数在1000~1500之间,它同时满足被3除余2、被5除余3、被7除余2这三个条件。求这个数是多少?
解决这个问题,有一个很“笨”的方法,那就是先判断1000是否能同时满足题目中要求的3个条件,接着判断1001,1002,……直到1500为止。这样的方法在编程算法中叫作“枚举法”。这种方法对于人来说过于枯燥,很容易因疲劳而出错。但是,这对于计算机却很简单,正好发挥计算机运算速度快的优势。
接下来,我们介绍使用枚举法编程求解这个问题,具体步骤如下。
1.创建新的Scratch项目
从桌面启动Scratch软件后,会创建一个默认的项目,在一个白色背景的舞台上有一只黄颜色的可爱小猫。在角色列表中可以看到“角色1”处于被选中状态,如图1-5-1所示。我们将在角色1的脚本区中使用指令积木来编写程序脚本。
2.添加“当被点击”积木
在指令面板中单击“事件”类别标签,切换到“事件”指令面板的界面。如图1-5-2所示,从事件指令列表中将“当被点击”指令积木拖动到右侧的脚本区中。通常情况下,在一个Scratch项目中,这是第一个被添加的积木,其他的积木将会添加在这个帽子积木之后。当舞台右上方的按钮被单击后,我们创作的Scratch项目就开始运行了。
图1-5-1 启动Scratch并创建默认项目
3.构建计数循环结构的脚本
要让计算机从1000数到1500,需要用到“数据”指令面板中创建变量的指令积木和“控制”指令面板中的“重复执行直到…”指令积木。
切换到“数据”指令面板,在显示的指令列表中单击“建立一个变量”按钮❶,这时会弹出一个“新建变量”对话框❷。在对话框的“变量名”文本框中输入“人数”❸,再单击“确定”按钮,就创建了一个名为“人数”的变量,同时在数据指令列表中将出现刚才创建的变量和一些用于操作变量的指令积木❹。接下来,从数据指令列表中把“将[人数]设定为0”积木拖动到脚本区拼接在“当被点击”积木之后,再把它的文本框中的数字0修改为1000。这样就把变量“人数”的初始值设定为1000❺。这个过程如图1-5-3所示。
图1-5-2 把“当被点击”积木拖动到脚本区
图1-5-3 创建“人数”变量并设定初始值为1000
切换到“控制”指令面板,将“重复执行直到…”积木拖动到脚本区拼接在“将[人数]设定为1000”积木后面❶;再切换到“运算”指令面板,将大于运算符“>”积木拖动到“重复执行直到…”积木的六边形小孔中❷;然后在大于运算符积木的第一个方形小孔中嵌入“人数”变量积木,在第二个方形小孔中输入数字1500❸;最后把“将[人数]增加1”积木拖动到脚本区拼接在“重复执行直到…”积木的中间❹。这样就创建了一个计数循环结构的脚本,它能够让变量“人数”的值从1000逐一递增到1500。这个脚本的添加过程如图1-5-4所示。
图1-5-4 实现计数循环结构的脚本
4.构建条件判断的脚本
要让计算机判断一个数能同时满足被3除余2、被5除余3、被7除余2这三个条件,需要用到“控制”指令面板中的“如果…那么”积木和“运算”指令面板中的“求余数”积木、“等于”运算积木和“逻辑与”运算积木。
从指令面板中将“人数”变量积木、“等于”运算积木和“求余数”运算积木拖动到脚本区中的空位处,然后按照图1-5-5中的指示将它们组合成一个“人数除以3的余数=2”的表达式积木,再将这个表达式积木复制两份,分别修改为另外两个条件的表达式积木。这样就创建完成了三个条件的表达式积木。
图1-5-5 构建三个条件表达式的过程
从指令面板中把两个“逻辑与”运算积木和一个“如果…那么”积木拖动到脚本区的空位处,然后按照图1-5-6中的指示将两个“逻辑与”运算积木嵌套后再放入“如果…那么”积木的小孔中。最后按照图1-5-7中的指示,把前面组装好的三个条件表达式积木组合分别拖入“逻辑与”运算积木组合的三个小孔中。这样就创建完毕判断三个条件是否同时满足的积木组合,最后的效果如图1-5-8所示。
图1-5-6 将“逻辑与”运算积木与判断积木组合
图1-5-7 将三个条件表达式嵌入“逻辑与”运算积木
图1-5-8 用于判断三个条件同时成立的积木组合
5.创建存放问题解的列表
在“数据”指令面板中单击“建立一个列表”按钮❶,就会弹出一个“新建列表”对话框❷。在这个对话框的“列表名称”文本框中输入“解”❸,再单击“确定”按钮,就创建了一个名为“解”的列表,同时在数据指令面板中将出现刚才创建的列表和一些用于操作列表的积木❹。这个列表用于存放找到的韩信点兵问题的解。当使用步骤4中创建的脚本找到解后,就将“人数”变量的当前值加入到“解”列表中,使用“将…加到[解]”积木来完成这个工作❺。这个过程如图1-5-9所示。
图1-5-9 建立一个名为“解”的列表
6.构建完整的解题脚本
在步骤3中创建了一段从1000数到1500的计数循环脚本;在步骤4中创建了一段用于判断一个数是否同时满足被3除余2、被5除余3、被7除余2这三个条件的判断脚本;在步骤5中创建了将找到的解加入“解”列表中的脚本。将这3段脚本拼接为一个脚本,就能够找出韩信点兵问题的可能解。
这个脚本运行时,最好先将“解”列表清空,从“数据”指令面板中将“删除第(全部)项于[解]”积木拖动到脚本区的“当被点击”积木之后作为这个脚本的第2个积木。
至此,解决韩信点兵问题的脚本编写完毕,完整的程序脚本如图1-5-10所示。
图1-5-10 “韩信点兵”脚本清单
7.保存和运行Scratch项目
图1-5-11 韩信点兵问题的可能解
在Scratch编辑器的菜单栏中选择“文件”→“保存”命令,将创建的这个项目以“韩信点兵”为名称存储到本地磁盘上,将我们的工作成果保存下来。
单击舞台右上方的按钮,这个Scratch项目就开始运行,在舞台上的“解”列表中就会显示出韩信点兵问题的可能解,如图1-5-11所示。
8.分析结果
从“解”列表中可以看到,在1000~1500之间,有5个数能同时满足被3除余2、被5除余3、被7除余2这三个条件。但是,只有一个数是韩信点兵问题的解。根据韩信点兵问题的描述,韩信的1500人在战斗中死去四五百人,所以,韩信在战后清点人数时最接近的答案是1073。
通过“韩信点兵”这个案例,让我们知道可以使用编程的方式去解决数学问题。甚至一些需要高中或大学的数学知识才能求解的数学问题,小学生也能够使用编程的方式解决。因此,学习Scratch编程,让我们多了一种解决数学问题的“神兵利器”。
1.5.2 游戏编程:星际飞行
在这个案例中,我们来设计一款名叫“星际飞行”的小游戏。这个游戏的情节和要求描述如下。
玩家驾驶宇宙飞船意外穿越到了太阳系中危险的小行星带,无数大小不等的小行星迎着飞船飞来。玩家通过鼠标控制飞船左右移动,避免与小行星相撞。如果能坚持超过30秒,则游戏胜利;如果不小心与小行星相撞,则游戏结束。
要求在舞台上显示玩家的游戏时间,并且,当游戏胜利时,提示“你真棒!”;当游戏失败时,提示“你光荣了!”。
按照以上描述使用Scratch编写“星际飞行”游戏,需要准备一些素材:1个星空背景图、一个宇宙飞船图片和一个小行星的图片。由于这些素材可以在Scratch编辑器的素材库中找到,所以可以直接开始创作这个游戏项目。如图1-5-12所示,这是一个运行中的“星际飞行”游戏画面截图。
图1-5-12 “星际飞行”游戏运动画面
接下来,我们将编程实现这个“星际飞行”游戏,具体步骤如下。
1.创建新的Scratch项目
从桌面启动Scratch软件后会创建一个默认项目,在一个白色背景的舞台上有个可爱的小猫角色。这个角色不是我们需要的,把它删除。在角色列表中小猫角色的缩略图上右击,在弹出的快捷菜单中选择“删除”命令把小猫角色删除。
2.添加舞台背景和角色
如图1-5-13所示,在背景和角色列表区中单击“从背景库中选择背景”图标按钮,把背景库中的星空背景stars添加为舞台的背景,并将默认创建的白色背景删除。然后单击“从角色库中选取角色”图标按钮,把角色库中的Spaceship和Rocks角色分别添加到角色列表区中,将它们作为“星际飞行”游戏中的宇宙飞船和小行星角色。
图1-5-13 “星际飞行”游戏的背景和角色列表区
如图1-5-14所示,星空背景stars的路径是“..\背景库\主题\太空\stars”,飞船角色Spaceship的路径是“..\角色库\分类\交通\Spaceship”,小行星角色Rocks的路径是“..\角色库\分类\物品\Rocks”。
图1-5-14 添加“星际飞行”游戏的背景和角色
3.编写飞船的控制脚本
图1-5-15 飞船跟随鼠标水平移动
在角色列表区中单击飞船角色的缩略图,然后在脚本区中开始编写飞船的控制脚本。
如图1-5-15所示,首先创建一个名为“状态”的变量,用于存放游戏的状态。“状态”变量有3个值:0表示游戏进行中,1表示游戏胜利,2表示游戏失败。“状态”变量的初始值设定为0。
接着,编写控制飞船移动的脚本。我们的设计是把飞船放在舞台的底部区域,用鼠标控制飞船作水平移动来躲避小行星的撞击。要实现这个功能,需要用到运动指令面板中的“移到x, y”积木和侦测指令面板中的“鼠标的x坐标”积木。将“鼠标的x坐标”积木放入“移到x, y”积木的第一个孔(x坐标),而第二个孔(y坐标)的值设定为-150。这样就使飞船固定在“y坐标”为-150的位置上跟随鼠标作水平移动。将这个积木组合放入一个“重复执行直到…”积木中,使飞船在游戏过程中能够一直跟随鼠标移动。
最后,由于角色库提供的飞船造型较大,在舞台上显得不协调,需要使用“外观”指令面板中的“将角色的大小设定为20”指令积木把飞船角色的大小设定为原始大小的20%。
在图1-5-15所示的脚本上单击,这个脚本边缘会出现亮黄色的发光效果,表示这个脚本在运行中。这时在舞台上移动鼠标,能看到飞船跟随鼠标作水平移动,达到期望效果。
4.编写游戏计时功能的脚本
这个游戏设定玩家坚持30秒就获得胜利,同时将游戏的持续时间显示在舞台上。要达到计时目的,可以使用“侦测”指令面板中的“计时器”积木。这个积木在项目运行时从0开始计时,只要检测“计时器”积木的返回值超过30秒,就把“状态”变量的值修改为1,即游戏胜利。同时为了在舞台上显示游戏持续时间,需要创建一个名为“时间”的变量,并把“定时器”积木的返回值传递给它。如图1-5-16所示,这是实现游戏计时和显示游戏时间的控制脚本。
5.显示游戏提示信息
当游戏胜利时,使用“外观”指令面板中的“说”积木显示“你真棒!”的提示信息;当游戏失败时,使用“说”积木显示“你牺牲了!”的提示信息。如图1-5-17所示,这是根据“状态”变量的值来实现显示不同提示信息的控制脚本。
图1-5-16 计时和显示游戏持续时间
图1-5-17 显示游戏提示信息
6.组装主控脚本
图1-5-18 飞船角色的控制脚本
将步骤3、4、5中编写的3段脚本组合在一起,就得到飞船角色的控制脚本,如图1-5-18所示。
单击舞台右上方的按钮,运行这个游戏项目,开始测试飞船的控制脚本。如果一切顺利,能够看到舞台上的飞船角色跟随鼠标作水平移动,同时舞台上“时间”变量中的时间也在不断变化。当游戏时间超过30秒时,飞船角色会显示“你真棒!”的信息。
7.编写小行星运动的脚本
在角色列表区中单击小行星角色的缩略图,然后在脚本区中编写小行星的控制脚本。
我们的设计是让数量众多的小行星从舞台的顶部由上往下随机运动,这要用到Scratch的克隆功能。在一个“重复执行直到…”积木内,以0.2秒为间隔,不断地使用“克隆[自己]”积木创建小行星角色的副本,直到游戏结束。
小行星角色的副本(克隆体)被创建后,需要随机设定它的大小和方向,这样模拟的小行星运动将显得比较自然,且富于变化。接着,使用“移到x, y”积木将小行星角色的克隆体移到舞台顶部的一个随机位置上,再使用“在3秒内滑行到x, y”积木将小行星的克隆体移到舞台底部的一个随机位置上,之后将小行星克隆体删除。
如图1-5-19所示,这个脚本能够实现小行星从舞台顶部随机飞向底部的功能。可以运行项目,对小行星角色的脚本进行测试,观察是否实现预期效果。
图1-5-19 小行星角色的控制脚本
8.编写碰撞检测功能
当舞台上的飞船角色与飞来的小行星相撞时,就将“状态”变量的值设定为2,表示游戏失败。可以使用侦测指令面板中的“碰到…”积木进行碰撞检测。切换到飞船角色的脚本区,创建如图1-5-20所示的碰撞检测脚本。
重新运行这个项目,对碰撞检测功能进行测试,观察是否实现了预期效果。这时会发现,当飞船与小行星相撞后,舞台上的其他小行星仍然按照各自的轨道在运动,这显然不是我们想要的效果。当飞船撞到小行星后,整个游戏就结束了,应该让所有的小行星从舞台上消失。要实现这个效果,可以在小行星角色的脚本区中添加如图1-5-21所示的脚本。
图1-5-20 飞船与小行星的碰撞检测
图1-5-21 游戏结束时删除小行星克隆体
9.挑战30秒
至此,这个“星际飞行”游戏项目创作完毕。你可以立即运行它,挑战自己能否坚持30秒。你也可以把它分享给小伙伴,一起来挑战30秒。
是不是难度不够?你可以尝试修改“在…秒内滑行到x, y”积木中的时间参数,设置为更短的时间,或者是设置为随机1~3秒,产生更加刺激的游戏效果。
通过“星际飞行”这个案例,我们看到只需要少量的脚本就能创作出有趣的游戏。这个小游戏只是抛砖引玉,相信你学完本书,一定能创作出优秀的作品。