练习步骤
每个项目从最初构思到最终实现会有一系列的过程,我将它们归纳成四个步骤。
第一步,确定目标
练习之前,你需要有一个明确的目标,也就是你要做什么?
你要制作一个动画?还是一个游戏?如果是动画,它讲述的是一个什么样的故事?如果是游戏,它的玩法是什么?有哪些不同的游戏难度?是否可以多人竞赛?
在构思的过程中,最好可以使用文字将它们写在纸上,更好的方式是将它们需要呈现的效果在纸上画出来。
在这个Scratch学习手册中,我所提供的每一个的项目案例,就是一个目标。它们有的会很容易,有的会比较难。有的目标后面,我还会给你提出几个额外的问题作为扩展思考。
确定好目标后,就可以进入下一步,分析项目。
第二步,分析项目
现在你已经确定好需要实现的目标,接下来需要去分析目标,思考如何去实现它,也就是你要如何做?
分析Scratch项目时,通常可以将它拆分成三个问题。
- 它们发生的场景是什么?
- 每个场景中有哪些角色?
- 每个场景中的每个角色在做什么?
它们发生的场景是什么?
每个项目都会有一个或是多个场景,它们用来代表故事或游戏发生的地点。你在分析时需要考虑,它使用的是Scratch背景库中图片?还是需要自己上传的图片?选中的图片需不需要通过绘制工具进行修改?
每个场景中有哪些角色?
每个场景中会出现不同角色,它们是你故事或游戏的主角。同样的,你要考虑它们来自于Scratch角色库?还是需要自己上传?选中的角色需不需要通过绘制工具进行修改?
每个场景中的每个角色在做什么?
分析的维度
在分析这个问题时,你可以从三个维度去思考它,空间、时间和相互联系。
空间是指舞台在某个时刻展现出来的模样。比如角色的属性和造型是什么?是否在播放声音?是否在询问什么问题?
时间是指空间展示出来的模样,随时间变化的顺序。比如故事最开始有哪些角色,之后又变成了哪些角色?每个角色最开始的属性和造型是什么?之后又变成了什么?这一步分析出来的时间顺序,在下一步中将变成积木块上下拼接后的执行顺序。别忘了,指令会按照顺序执行。
相互联系是指角色、舞台和用户之间的相互联系。比如故事是在什么条件下开始?角色之间、角色和舞台之间发生碰撞后需要做什么?用户通过鼠标或键盘操作后需要做什么?这一步分析出的内容通常会变成指令串中的事件或者分支条件。
写出步骤
通过以上三个维度的分析,你就可以将故事发生的每一步都写在纸上。写的过程可以聚焦于角色,也可以聚焦于时间顺序。
聚焦于角色时,写出来的内容就像《少儿编程ScratchJr教程(6)——灌篮高手》open in new window中这样。
聚焦于时间顺序时,写出来的内容就像《少儿编程ScratchJr教程(7)——点球大战》open in new window中这样。
对于简单的项目,你可以完全按照这两种方式来分析,例如我在《少儿编程ScratchJr教程(启蒙篇)》open in new window其他案例分析中所写那样。如果项目变得复杂起来,你就需要将它们两种方式结合起来思考,例如将一个项目分为多个场景或者多个时间段,每个小段又利用上面的方式进行细分。
步骤的颗粒度
给你一个项目,让你按照上面的方式写出步骤,再将你写的步骤和另外一个人写的做对比,你会发现你们写的内容可能会不一样。
例如,要写将大象装进冰箱的步骤。也许你会分为三步:1、打开冰箱门。2、把大象装进去。3、把门关上。另一个人也许会这样分:1、控制机器手臂。2、使用手臂拉开冰箱门。3、使用手臂抓住大象。4、将大象搬入冰箱。5、使用手臂关闭冰箱门。6、离开机器手臂。
你们两个写的步骤谁对谁错?答案是,都对,只是步骤的颗粒度不同。只要比较一下你就会发现,你写的每一个步骤都被另外这个人分成了两个步骤,也就是说他写的步骤更细更明确。
那最细致的步骤是什么样呢?就是将每一步需要使用的指令都写出来。这样有什么好处呢?答案是可以帮助你更快的完成第三步编码和调试的工作。相对的,这样做会在第二步中花费你更多的时间。
如果你是刚刚开始学习Scratch,我的建议是尽量将步骤写的更细更明确,最好能做到每一步都能想到具体使用什么指令,这个过程也是在帮助你更快的熟悉Scratch中的指令积木。当你对项目分析和Scratch越来越熟悉,你会自然而然的将颗粒度变粗。
分析项目是整个项目练习中最重要也是最难的一步,需要你花费更多的时间来练习。也许刚开始你会不知道写什么,有个简单的方法可以帮助你。将自己看到的东西写出来,再将它描述给别人听。接着让别人想象出你所描述的画面,将它与目标效果做比较,看看有什么区别?最后再不断的丰富你的描述,直到别人想象的画面和目标效果一样为止。
第三步,编码和调试
如果第二步中你已经将每一步需要用到的积木块都写出来了,第三步就会变得容易许多,你只需要将每个问题的答案在Scratch中实现即可。
首先,将第一个问题的场景图片加入背景列表中。接着,将第二个问题的角色加入角色列表中。最后,再将第三个问题的指令积木拖入编程区执行。
程序执行的过程中,你一定会发现程序的运行效果与目标不一致。这时候就涉及到学习编程时,需要掌握的一个重要能力,调试程序(Debug)。
调试的过程很简单,分为两步:
第一步,定位问题
定位问题是指找到让程序运行效果与目标不一致的原因。具体是哪个指令让程序出错?为什么这个指令会导致错误?
如何能快速的定位问题?
首先,你需要对所用到的每一个指令和程序很熟悉,知道它们的作用。然后,你需要培养自己”读代码“的能力。也就是将自己的大脑当做一部计算机,读取你写好的指令串,在大脑中模拟出它们的运行结果。这就相当于训练自己上数学课时的心算能力,区别只是它们计算的内容不同。当你学会“读代码”后,就可以将大脑中计算的结果与程序实际运行的结果进行对比,从而定位问题。
如果你学习的是高级编程语言,往往会带有各自的调试工具,帮助你一个指令一个指令的运行程序,获得结果。或是通过明确的错误提示和打印输出帮助自己定位问题。在Scratch中,你只能通过“读代码”大致定位出有问题的指令串,然后将它拆分运行。或是在指令串中利用说话积木和变量查看程序运行过程的状态值,帮助你找出有问题的指令。
只有在清楚定位问题的基础上,你才能将问题修正,这也是是判断一个程序猿能力高低的指标之一。优秀的程序猿总是能快速精准的定位问题,这与他们在过往的开发过程中遇到的问题数量和难度直接相关。
第二步,修改指令
当你正确的定位问题后,就可以想办法去解决它。更换一个指令、填入不同的参数、换成另外一种实现方式,你可能会有很多不同的解决方法。也可能在修改以后程序还是不正确,这时说明你定位的问题出错了,需要重新定位。
如果你在定位问题后不知道如何解决,这时就可以进行场外求助,在搜索引擎(谷歌或百度)中将问题作为关键字搜索答案,或者询问一起学习的同学或老师,也可以加入我的星球中提问。
通过前面这三步,你就已经完成了项目目标,在这过程中最重要的就是需要自己主动思考,而不是照着现成的教程,将自己变成一个”代码复制机器人“。
第四步,分享和教学
我相信你做出一个动画或游戏肯定不止是想自己一个人玩,你可以将它分享给更多朋友,对方在玩的过程中可能还会给你提出宝贵的改进建议。
如何进行分享?你可以把电脑或平板直接交给对方玩。如果你想分享的朋友不在身边,你可以将项目保存到电脑上,把源文件发送给对方运行。你还能利用在线系统的分享功能,或是利用第三方工具将项目打包成可运行的网页,通过微信将网页地址发送给对方。。
分享的过程中你还可以向他们讲解你的构思和完成的步骤,以此锻炼自己的沟通和表达能力。如果听完你的讲解对方也对Scratch产生了兴趣,你就可以将自己学会的东西教给对方。在这个过程中你会发现,当你在不断教别人的同时,自己也会对Scratch更加熟练。因为你想教会别人的前提是自己已经掌握了Scratch的知识和用法,并且还能用自己的话向别人解释清楚。在教学的过程中,对方还会向你提问,相当于在对你的学习成果进行测试,帮助你发现自己的盲点。这种”以教为学”的方法,也就是被称为终极学习法的“费曼技巧”。
动手练习是学习编程的最快捷径,这里再推荐给你两种基础的学习方式open in new window。细心观察你会发现,上面的步骤不光可以用来练习Scratch,也可以用在其他学习的过程中。