朋友圈的亲子编程课——Scratch第一期全集

admin 发表于 2019-09-23 11:27

https://cdn.china-scratch.com/timg/190923/112F532Y-0.jpg前言https://cdn.china-scratch.com/timg/190923/112F5C55-1.jpg

在夏天开始之前,我设想用一段较长的时间,做一些跟编程教学有关的事情。经过一个夏天的断断续续的思考与准备,我决定从这个起点开始,这个起点,我称之为——《朋友圈的亲子编程课》。

(四年多前注册这个公众号的时候,原意只是发一些跟拍照、跟市场有关的内容。如今,似乎离初衷已经有了一段距离,但还是决定不去更名,跟我相关的东西,属于我的,看到的,想到的,可以分享的,挺好。就是在这第一篇枯燥的文字里,穿插一些过去岁月中与花花草草相关的照片有一些扣题,更有一些自己还想留存的风格。)

https://cdn.china-scratch.com/timg/190923/112F632b-2.jpg

感谢铺天盖地的人工智能对未来“恐怖前景”的描述,这两年来,很多朋友会在不同的场合问到我关于编程学习的事情,我也会主动的跟身边朋友交流一些程序的问题。当然,因为社会渲染和自身职业的关系,Python成为毫无疑问的频度最高的关键词。
甚至,在我尝试引导自己九岁女儿编程兴趣的开始,我也选择了Python。当然,这是一个挺失败的选择,简单的文字界面与枯燥的概念,自然无法引起一个低年级小学生足够的关注度。有意思的反转是,女儿在学校接触到了Scratch,并且主动要求我教她。在自己断断续续的尝试及与她的互动后,我开始了认真的备课,编排内容、设计例子,并在八月用了近两周的时间,对女儿进行了教学,效果是:我想要灌输的关于程序的基本概念都被毫无抵抗的接受了;即使有一些复杂的例子也被完全理解并得到扩展;她开始希望我教一些更难的例子或者,一门新的语言,例如Python,或者BASIChttps://cdn.china-scratch.com/timg/190923/112F62444-3.jpg 

三十年前的起步,一台叫做Laser310的“电脑”,我用的版本只能使用BASIC程序,功能还弱于稍晚几年风靡的“小霸王学习机”。由于程序不能保存,每次开机都要从自己厚厚的手抄程序本中找出一段代码,敲进去,再运行。最大的好处是,从小就建立了良好的盲打基础。

回顾自己差不多三十年前开始接触编程至今,唏嘘时代变迁:我那时候从认识二十六个英文字母开始,而如今简单的英语对八九岁的孩子来讲毫无压力;我那时候懵懵懂懂的从BASIC开始是毫无疑问的唯一选择,而如今的选择多了太多太多。更有许许多多不变的,是那个我们一直称为程序思维,看得见、摸得着,却很难简单定义的存在。也许诞生于互联网高速发展之前的“史前”程序员,如我,都有一种洁癖般的固执,一种对于数据、结构、算法,面向过程、面向对象这些概念朝圣般的偏执。一个最大的负面效果就是,当朋友问我,如何从零基础起步,我总会想很多,然后给不出答案。一如已经花去了我超过一个礼拜时间的风格迥异的前六个版本前言。https://cdn.china-scratch.com/timg/190923/112F61a6-4.jpg也许,重要的只是开始,而不是如何开始吧。所以,我决定这一定是最后一个版本的前言了。因为早已整理好的内容,如同整装待发却始终听不到出发汽笛声的一节节车皮一样,孤独的在角落里,落寞了很久。https://cdn.china-scratch.com/timg/190923/112FK1M-5.jpg呼应前段,我把从现在开始,大约持续两周时间的课程,叫做《朋友圈的亲子编程课》,选用的语言是Scratch。面向三类对象。

第一类对象

朋友圈里的父母

哪怕只有很短的时间,但是通过自己学习、整理、陪伴,输出给孩子,再得到反馈的过程,感觉真的很美妙。


第二类对象

那些“零基础”朋友

虽然内容看起来并不会很复杂,与传统理解的写代码也有些许差别,但是,我确实很认真的把我对程序入门的理解与更有趣的皮囊放在了一起,半个月的收获,不会比学习任何其他一门语言小。

第三类对象

寻找可能性的朋友

在我使用Scratch过程中,我发现了很多有意思的可能性,所以,第三类,姑且叫做寻找可能性的朋友。


简单讲几个问题,然后,鸣汽笛,启动。

1为什么用Scratch起步

https://cdn.china-scratch.com/timg/190923/112FIG5-6.jpg

对孩子来说,我们都知道,兴趣是第一重要的,而第二重要的是学习阶梯。如果倒推十年二十年,正如我的经历一样,也许我们没有其他选择,都需要从BASIC/PASCAL/C语言开始。然而放到如今,我们多了另一类选择,被称为积木式编程(Block-Based Coding),相对的,之前说的那些语言,称为文本式编程(Text-Based Coding)。相对于传统的文本式编程,积木式编程界面漂亮、娱乐性强的特点非常适合小朋友入门,另外,在Python、JavaScript等语言大行其道的当下,积木式编程反而拥有了更清晰的程序结构、逻辑关系,这些,对于建立初步的程序思维,都大有益处。

即使是“零基础”的成人,花一点点时间来熟悉和学习一下Scratch,也是有益无害。更扩展一下,Scratch本身非常适合做动画、交互等,那么做个有意思的PPT、动画,甚至一些简单的演示或者教学,也是非常合适的。

2
教什么?

https://cdn.china-scratch.com/timg/190923/112FM102-7.jpg

第一期的《朋友圈的亲子编程课》分为十节,大概两周推送完毕。在后面的实际内容中,我按照Scratch的功能设置与特点,结合自己在这个年龄起步时的经验,进行组织。编排上,概念、简单原理、例子、动手实践,这些环节都会涉及。我的目标也很明确:第一期课完成后,第一个层次,掌握了一些程序的基本概念、Scratch的基本功能、简单组合,能够编写一些中等复杂的例子;第二个层次,这时候可以有个选择,Scratch进阶,或者学习一门文本式编程语言,因为关于程序的基本概念已经有了,所以,学习一门文本式编程语言,起步不是太难的事情。

3
怎么学?

https://cdn.china-scratch.com/timg/190923/112FW240-8.jpg

就亲子编程目标而言,我建议家长朋友能够每天花一点时间做三件事情:

https://cdn.china-scratch.com/timg/190923/112FV645-9.jpg

1、看完我写的内容

2、自己动手实践

3、陪伴并带着孩子一起实践

编程的实践性非常强,只有不断的尝试,才能有提高。

亲子共同学习、实践,意义也不仅仅在于树立榜样、培养兴趣。小朋友的想象力是惊人的,程序世界是自由的,当这两个世界碰撞之后,我们可以得到很多难以想象的启发,而这种启发,没有陪伴,是很难获得的。

4
我的角色

https://cdn.china-scratch.com/timg/190923/112FSB6-10.jpg

为什么叫《朋友圈的亲子编程课》,与我自己的角色定位有关,我的角色就是朋友。与朋友分享、看下一代成长,是两大趣事,结合起来,做一个更有意义的趣事。

为什么是朋友,一是有什么问题,可以随时联系到我二是,我有什么新想法也可以随时被看到,都是简单直接的方式,省心。

当然,借助于强大的线上资源,我也会利用各种工具来提升效果、提高效率,这个可以以后慢慢分享。

5下一步的计划

https://cdn.china-scratch.com/timg/190923/112FTQ2-11.jpg

在之前的每一个被我否定掉的前言的版本里,都会有一大堆关于规划的内容。可是正如之前所言,开始才是最重要的,也许以后会有类似于《朋友圈的编程课》、《朋友圈的Python从入门到放弃》、《朋友圈的好玩的BASIC》出现,但是,没有现在开始的一步一步,又何谈未来,一切,慢慢来。

终于确定,这是一个最终面世版的前言了,在比原计划整整晚了一个礼拜的时候。

恍惚间,又一个夏日终了,魔都也难得在连绵不断的大中小雨后,展现出蓝天白云下独特的魅力。纷扰的世界、烦乱的内心,都因开学季的到来,都因生命中数十个夏日、秋天的情绪切换,慢慢悸于平静。

https://cdn.china-scratch.com/timg/190923/112F952O-12.jpg https://cdn.china-scratch.com/timg/190923/112FaF5-13.jpg 

From the ground up,我们开始吧。

https://cdn.china-scratch.com/timg/190923/112F95938-14.jpg 二、Scratch

   Hello,World!

从这一节开始,正式进入内容,这一节会先有一个Scratch的基本介绍,然后是,对于多数纯Scratch课程而言很奇怪,但是对于程序世界很有仪式感的欢迎词:Hello,World!

我说过,我是个很固执的“史前”生物。

1https://cdn.china-scratch.com/timg/190923/112F95637-15.jpg背景介绍

Scratch最早是2006年,由The MIT Media Lab's Lifelong Kindergarten Group 推出。如今已经发展到3.0版本,基于HTML5,不需要本地安装。

访问https://scratch.mit.edu,就是Scratch的官方网站。

我并没有接触过Scratch的前两个大版本,所以也不清楚以前是什么样子的,但如今,就是一个标准的社区模样。开源、在线文档、社区,程序员三大宝,一个不缺。对了,Scratch是开源的,虽然对绝大多数使用者来说,这个根本不重要,但是它确实给了市面上不少“改装版”存活基础和空间,考虑到我是一个彻头彻尾的“原创主义者”,所以,在学习过程中,我只推荐原版。另一个只推荐原版的理由是:Scratch的作用是启蒙加基础入门,这个阶段,编程最重要的是基本思想的建立,每一种语言都有其适用范围和局限性,Scratch当然不例外。

https://cdn.china-scratch.com/timg/190923/112G020C-16.jpg 

“改装版”或许在某些方面改进了一些不足,甚至提供了更多更灵活的功能,但是否会破坏原有的体系和编程语言背后基础而贯穿的逻辑,就不得而知了。

2https://cdn.china-scratch.com/timg/190923/112F95637-15.jpg各种资源

目前,线上已经有大量的Scratch资源存在。

01 

官方网站

02 

Scratch Wiki

03 

第三方

首先,最大的资料来源就是官方网站,除了提供编程实践的平台之外,还可以通过访问社区、支持板块获取足够的相关信息。其中,最大的特色是网站上有来自全球用户分享的Scratch项目,既可以直接看到结果(游戏、故事、动画,等等),也可以查看源代码,吸取别人的智慧。

其次,推荐Scratch Wiki (https://en.scratch-wiki.info/wiki/Scratch_Wiki_Home),这个百科网站最早与Scratch开发团队并没有关联,后几经易手,曾经由Scratch开发团队维护。如今,为了更好的服务于Scratch用户,该网站已经转由第三方组织维护,但是Scratch开发团队依然提供大量的支持。

https://cdn.china-scratch.com/timg/190923/112G13523-18.jpg 

一点一滴,交待的清清楚楚。当我决定启动编程课程的时候,最大的挑战来自于内心:我如何能够长期的做下去?在这个目标下,会有许许多多不同的选择,有那么一点点是已经做了的,还有许多是尚未面对的。一点一滴,慢慢来吧。

第三,通过搜索引擎能够搜索到许多自媒体的资源,包括公众号,博客等,也有不少的用户会把自己的项目汇集起来,做成课程。对一些感兴趣的目标,搜索相关资源,查看别人的代码,是重要的学习。

https://cdn.china-scratch.com/timg/190923/112G231X-19.jpg

写代码,大概永远是这么一个过程:学概念、学例子、模仿、改进,到自创。学习别人的经验,分享自己的收获,这是开源最朴素的想法,也是程序员自由世界的基础。

3https://cdn.china-scratch.com/timg/190923/112F95637-15.jpg界面

 https://scratch.mit.edu/

https://cdn.china-scratch.com/timg/190923/112G260R-21.jpg 

Scratch界面可以是中文的,甚至于程序模块都可以中文显示,但是,几乎所有主流程序语言都是英文的,学习资料许多也是英文的,为了更好的与未来衔接,还是强烈建议从现在开始全程使用英文。

Scratch首页的界面主要有以下几部分内容:

蓝色菜单条部分:

左上角分别是Scratch图标,点击进入首页;

Create,无论有没有注册账号并登陆,点击就可以进入一个新的项目界面;Explore,看看其他用户都分享了哪些有趣的程序;

Ideas,有一些入门教程和主题导引;

右边,就是跟账号有关了,建议开始的时候就注册一个账号,最大的好处是所有编辑的项目和代码都会保存下来,还可以修改,分享。

页面主体就是一些用户分享的项目,出于兴趣,可以自由浏览、参考。

直接点击Create,进入一个新建项目,经过一段时间的加载等待(取决于网速),就进入了程序设计界面。 

https://cdn.china-scratch.com/timg/190923/112G2H23-22.jpg

可以看到,整个工作区被划分为四大区域。

12是代码模块区,其中1是代码类别选区,2是代码块选区。Scratch编程是不需要手写代码的,所有的代码都靠积木块组合实现。

3是编码区,把2中的代码块拖拽入3区域,并加以组合,就是Scratch的编码过程。

4为预览区,可以随时看到代码运行的结果。默认模式下,预览区显示了一只猫。

5是Sprite编辑区,可以对Sprite的属性进行编辑,例如位置,大小,方向,等等。

https://cdn.china-scratch.com/timg/190923/112G231X-19.jpg

对于Sprite的准确意思。在我的理解过程中也废了些周折,开始时候,我本能的将之与对象联系起来。甚至在这一节的初稿里我还专门写了一段对于对象的简单解释。但是,实际上,Sprite是一个不同于对象的专有名词,是动画、游戏编程中最基本的存在。再一次为自己的浅薄暗自检讨的同时,尊重开发者的本来意愿,怀着敬畏的心态继续使用Sprite的称呼,并简单翻译成中文意思:精灵。

在后面章节的初稿里,仍有大段的关于Sprite的个人理解,我会保留自己原本的写法,并加入业内通用的理解。

6是Stage,场景编辑区。可以加入不同的背景,场景也可以单独编码,获得不少炫酷有趣的效果。

4https://cdn.china-scratch.com/timg/190923/112F95637-15.jpgHello,World!

按照我们从小学到大的习惯,这里应该有一个小节,叫做“Hello,World!”。作为一个pc单机时代走过来的程序员,开始讲编程,必须对传统足够的尊重,所以,让预览区默认出现的猫说一句“Hello,World!”,作为本章的结束,所有关于代码、原理的解释,则留待以后。

https://cdn.china-scratch.com/timg/190923/112G34027-25.jpg

PS:关于“Hello,World!”在程序世界的魔力,是个很有意思的话题,关于它的起源,有不少说法,感兴趣的可以搜一下。

三、Sprite 相关

Looks & Motion

在情怀式的“Hello,World!”之后,开始Scratch编码课程的第一部分内容,按照自己这些年来对编程语言的理解,Scratch的功能和语言逻辑,以及教自己女儿过程中的反馈,我把课程分为八节。

理论上,是可以做到一天一课的,但是,要知道,孩子的专注力是有限的,时间也是有限的,编程本身就是一个长期的学习与实践过程,不在一朝一夕的填鸭,所以,我认为把计划中的课程内容按照两周的时间编排,即使目标只是初步入门,强度也是不小的。
同时,我不会像Scratch官网建议的那样,从好玩的动画和游戏出发,因为如果这样,很大可能兴趣就止步于动画和游戏了。任何兴趣爱好,即使是游戏,都是值得我们花费大量的时间去深入学习的,而基础,则是一切的开始,更何况Scratch本身已经够“好玩”了。所以,我会根据Scratch本身的功能,参照其他高级语言入门时的编排方式,进行切割,形成五个讲解内容,三个综合性的例子,其中一个是动画、一个是游戏(呵呵),一个是数学(编程与数学分不开)小游戏(呵呵+1)。这样的编排,基本涵盖了Scratch提供的基本代码模块功能。至于扩展的部分,特别是乐高之类的,对我来说都高级了,目前不在我计划中。

讲解内容一:Sprite相关(Looks & Motion)

讲解内容二:变量与表达式(Variable,Operator)

讲解内容三:条件分支与事件(Conditional Branches,Events)

讲解内容四:循环(Loop)

综合示例一:动画

讲解内容五:传感器及其他(Sensing)

综合示例二:小游戏

综合示例三:数学小竞赛


另外,在计划中,我会开第二个两周课程,显著的提升代码复杂度,去实现一个又一个的小目标。同时,计划中应该会有一个和阶段二平行的基于文本编码的入门课程,为什么这么做的目的现在不想过多解释,只是真的会很有必要,至于选择什么语言,以前我很确定,不会选择Python,然而现在,我想说有不小的可能性会是Python。

对于这一系列安排与选择,想说,我的固执再一次起了巨大的作用,在逻辑与结构先行的根深蒂固的概念影响下,我强行把Scratch积木菜单进行了拆分。在Python很好用但是“功法有点邪恶”的长期印象下,我又本能的排斥将Python教给小朋友。好吧,如果我能顺利的从Python中提取出自己所谓的“武林正宗”的精髓要义,我就不跟自己较劲了,选择Python作为文本编码的入门(脚本)语言。为了不辜负大家对Python的热望,我会努力的。

https://cdn.china-scratch.com/timg/190923/112G3E31-26.jpg

后事交待完了, 我们终于可以开始了

https://cdn.china-scratch.com/timg/190923/112G3M40-27.jpg  1

Sprite基础   

https://cdn.china-scratch.com/timg/190923/112G453J-28.jpg

继续拿出上一节中工作区区域图,区别是,还留着“Hello,World!”,标示出了区域1中的两个类别MotionLooks,和右上角Tab页中的“Costumes”选项。区域145,加上标记的两个部分,就是这一节的主要内容,当然,编码区,每一次都跑不掉,所以,不特别说了。

Sprite

Sprite,精灵,这个名词最早来源于游戏中,首先,它是一张图,比如默认的那只猫,但是在背景刷新的时候,这张图并不刷新,它也是独立变化的,如同一个精灵一样悬浮在背景之上,这是精灵这个名词的由来。但是,我认为,用Sprite这个概念,虽然在Scratch中是毫无问题的,但在后续编程的进阶中,会造成很多概念上的困扰。所以,我更愿意将它称为“对象”,借用一定的面向对象编程中的概念,因为它确实有许多类似的地方,虽然更多的不同,但是这个不同主要来自于功能的缺失,而非区别。https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

上面的正文是如第二节课中所言,没有修改过的。Sprite是动画、游戏中经常使用到的概念,从理解上来讲更具象化,可能是一只猫、一只老鼠,或者一辆车、一栋房子,等等。Scratch编码也主要围绕Sprite这个核心展开。

https://cdn.china-scratch.com/timg/190923/112G45492-30.jpg  通过区域5的显示,我们可以看到灰色背景区域存在一个名为Sprite1的猫,就是我们默认看见的那只,当然还可以存在Sprite2,……,SpriteN。上面白色区域,标示着Sprite1的一些属性(你看,叫对象就没什么问题了,对象也有属性Attributes),这些属性包括,名字(Sprite1),位置(X,Y,目前都是0,即正中心,这个设定很赞),显示(Show)或者隐藏(Hide),大小(Size)100,方向(Direction)90度。
https://cdn.china-scratch.com/timg/190923/112G44194-31.jpg动手小尝试
添加一个Sprite! https://cdn.china-scratch.com/timg/190923/112G52c2-32.jpg 

点击区域5中右下角如图标示的按钮,进入Sprite选择界面。

https://cdn.china-scratch.com/timg/190923/112G91T6-33.jpg 

Scratch提供了各种形态的Sprite选项,好玩的东西就该如此,我们从Animals标签下,选择跟默认中一样的Cat。

https://cdn.china-scratch.com/timg/190923/112G910Y-34.jpg 

这样,我们有了两只猫,给它们改名,分别命名为Cat1和Cat2,同时,对位置和角度做一些调整。

 
一个有意思的事情发生了,之前的那只猫Cat1依然在说“Hello,World!”,而Cat2则毫无表示。分别点击Sprite选取里两只猫的图标,可以看到,Cat1在代码区域是有代码的,而新加的Cat2则空空如也。两点:一、要让某个Sprite或者对象有动作,是需要编码的;二、每个Sprite是需要(也可以说成可以,呵呵)独立编码的。所以,我们完全可以做成一个这样的场景,Cat1说“Hello,Cat2!”,Cat2说“Hello,Cat1!”。https://cdn.china-scratch.com/timg/190923/112H044T-35.jpghttps://cdn.china-scratch.com/timg/190923/112H041H-36.jpg有人说,我改了,为什么看不到效果呢?注意区域4左上角的那面绿色小旗和代码区域里黄色背景的When green flag clicked代码块了吗?前者可以理解为一个“开始”键,按下后,在代码里的相应块被触发,后面的代码则顺序执行。这就是Scratch的一个通用的程序入口。理解起来简单,描述起来费劲,所以,记住,大多数情况下,每个Sprite都需要这样一个When green flag clicked块来标示出程序的开始,而且,一个Sprite是可以有多个程序入口的,这个以后讲到,自然明白了。https://cdn.china-scratch.com/timg/190923/112H13423-37.jpg

程序入口,就是程序开始执行的地方。不管什么编程语言,程序入口都是最重要的第一步,不同的语言对于程序入口会有不同的约定或者说规则。

对于Scratch而言,程序入口可以有多种方式设定,正文中所述的When green flag clicked代码块是最常用的一种,还有一些其他的方式。同时,每个Sprite都可以有一个或者多个程序入口,不仅不同Sprite的代码相互独立,同一Sprite下多个入口区分的代码段也是相互独立的。

可以想象一下,如果我们加入的猫不是两只,而是许多只,同时这些猫都在屏幕上漫无目的乱跑,彼此之间独立,没有相互影响,是一种怎样的景象?这种在其他语言实现起来很复杂的效果,恰恰是Scratch的优势所在。


相应的,点击绿色旗帜旁边的红色八边形按钮,程序结束,显示为两只猫都是毫无表示。2

MotionLooks  

Motion和Looks,顾名思义,动作和外观。这两个类别分别承担了Sprite的动作和外观,当然,其他类别,例如Sound,Sensing等等,每一个都能说与Sprite息息相关,毕竟,Scratch的核心就是Sprite。这一节只介绍Motion和Looks,是因为它们更纯粹,也更直观。点开每个类别里,都有一系列的代码块,代表不同的动作,或者外观。这里,我就不一一列举说明了,毕竟,写一个《Language Reference》并不是我现在的目标。但是,我还是建议大家每一个都试试,编程是一项实践性很强的活动(我想说工作,呵呵+N),而在编程世界里真正的自由不是我们漫无目的的想干嘛就干嘛,而是我们了解并实践了许多种基本的功能后,自由的组合,变成无限的可能。我也会在本节最后的小例子里面加入几个功能块作为展示和引玉。
3

Costume   

点击代码区上方Tab页中的Costumes,可以看到一个完全不同的界面。就按照Costume本意,我们就叫它皮肤吧(免费的,不需要点券或者钻石购买)。对于这只猫来说,系统默认提供了两种皮肤,一个是之前一直出现的cat-a,另一个就是cat-b,我们可以像画图一样改变皮肤,也可以新建皮肤。当然,Costume的功能可不仅仅是改个样子,很多复杂一点的应用中,都需要用到Costume这一设定。这里,就不过多解释了。https://cdn.china-scratch.com/timg/190923/112H11T5-38.jpg 

简单的画图功能,可以充分发挥小朋友的想象力和绘画能力。

4

一个简单的例子  

用一个例子把这一节的内容串起来,目标很简单:两只猫互相打招呼,并且不断靠近。 https://cdn.china-scratch.com/timg/190923/112H13c9-39.jpghttps://cdn.china-scratch.com/timg/190923/112H234J-40.jpg

注意不同Sprite的代码的微小差别。

https://cdn.china-scratch.com/timg/190923/112H22439-41.jpg

给家长的话

如前言所述,这个课程我第一类面向的对象就是家长朋友。为什么叫亲子编程课,我的想法是亲子共同来“玩”Scratch,既增强亲子关系,又能更好的帮助孩子启蒙到入门。我本着这样一个目的,将内容写到这里,如果站在一个零基础开始的家长的角度来说,我认为这样一种介绍方式,应该是可以了。但是,对于我们的真正目标而言,需要再往前走一步,直接面对每一个孩子的是家长自己,所以,我们需要加一部分内容,作为家长如何启发自己子女动脑动手的建议,暂且称之为“亲子实践建议”。

亲子实践建议

最开始的时候,可以让孩子自己选择一个喜欢的Sprite,可以是猫、狗,甚至任何动物也好,其他物件也好。

通过调整Sprite区域的属性,例如size,x、y,direction等等,看看不同数值引起的变化,从而了解属性的概念。

熟悉代码区的操作,包括程序块选择,拖拉,修改白色圆角矩形中的参数。熟悉When green flag clicked代码块及程序启动、停止(绿旗按钮开始,红色八边形按钮结束)。将Motion及Looks中代码块拖拽入代码区中,看不同的代码块的效果。

切换至Costume页,看看不同外观对Sprite影响,有兴趣的可以修改并保存自己的Costume。

按照示例代码,开始我们第一个完整的例子。


PS:在这个例子中,我只使用了Motion和Looks。这样做的原因是希望循序接近,孩子的理解力和专注力是有限的,重点应该是如何在有限的专注时间段里尽可能培养孩子的兴趣,潜移默化的灌输基本的程序思维和逻辑思维,而不是选择如何在短时间里灌输多的知识。https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

这一节中,大家一定会注意到大量的名词被我用花花绿绿的色块标示出来。其实,从第一节开始,我就有意识的这么去做了。其中的原因来自于程序中一个很重要的概念:保留字。保留字,顾名思义,就是保留下来,在程序语言中承担特定功能的名词或者字符。如今,在代码编写里面,保留字还有一个很有意义的作用就是:通过不同颜色对保留字及其他功能的字符、数字、符号等加以区分,可以极大提升编码效率。Scratch借鉴了这个概念,对于不同类别功能的代码积木用不同颜色标示,而不仅仅是为了五颜六色吸引孩子的注意力。我基本继承Scratch的做法,尽可能的在提到这些保留字时,用相同或者相近的颜色标示,希望能够提升阅读的效率。

https://cdn.china-scratch.com/timg/190923/112G45492-30.jpg 
https://cdn.china-scratch.com/timg/190923/112H42130-44.jpg

四、Variables,Operators

这一节,讲Variables(变量),Operators(表达式)。这是一般程序语言参考中紧接着“Hello,World!”的内容,我把它挪到了关于Sprite的基本概念之后。可是,我依然会困扰于如何向一个大概率不超过十岁的小朋友介绍变量的概念。如果说,Sprite,Motion,Looks在Scratch漂亮的界面下,是直观的话,那么,Variables则是很不直观的。而,Operators更是一个看起来很简单,其实有很多内涵的概念。

对于这一节,当初我想了很久,应该怎么去讲。坦白说,按照一般的Scratch教法,基本可以一笔带过,因为怎么用,即使小朋友也一看就明白。但是“固执”告诉我,无论是变量还是表达式,对于一门程序语言来讲都是很重要的基础,基本的概念点时时刻刻会用到,即使后面用Scratch做一些复杂的程序时,我坚持自己想做的是一个在Scratch载体上的程序思维的入门,所以,内容会是以下呈现的样子。

这一节内容非常多,我觉得两天的时间来学习是合适的。

/Public/Home/images/grey.gif 

1

变量 

对于看我写了这么多废话还在坚持捧场的朋友们,我想这样去解释Variable变量:与我们数学里面学到的变量的概念并无任何区别,程序里的变量用来存储会变化的值(可能是数字,字符,甚至其他形式)。好了,这就是解释。对于小孩子,我还是建议用一个例子去取代解释。这个例子是对上一节的例子做一些小小的修改:我们加入一个变量,叫steps。https://cdn.china-scratch.com/timg/190923/112H44255-46.jpg 

点击Make a variable即可创建变量

然后会要求输入变量名,以及一个对所有精灵(对象)有效,还是仅针对当前精灵(对象)有效的选项。稍微懂一点程序的人,自然知道这是全局变量还是局部变量的意思,但是在这里,卖个关子,选择默认的,选项的区别,稍后直接看结果就可以了。 

https://cdn.china-scratch.com/timg/190923/112H410R-47.jpg


这时候,我们能够看到在结果展示区域,多了一个steps的显示,并且数字为0。 

https://cdn.china-scratch.com/timg/190923/112H53501-48.jpg

设置完变量之后,我们对上一节的代码做修改:首先,在程序最开始就把steps初始化为0,同时,在Cat1和Cat2每说一句话后,让steps变量加1。代码如下: 

https://cdn.china-scratch.com/timg/190923/112H62640-49.jpg


对Cat2代码也做类似的修改,但是要注意两者在说的话和移动位置上的微小区别,当然,这些区别都跟上一节一样,这里就不再赘述了。代码修改好后,我们可以直接点击绿旗看结果:随着两只小猫迈开脚步,steps的值变化了,但是问题也来了,1、steps每次增加都是2,可是我们明明设置的是每次变化1啊;2、steps最后的值为10,可是猫只走了五步啊!https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

还记得我们在添加变量steps时卖的关子吗?那个关于“For all sprites”还是“For this sprite only”的选项,就是这个选项在捣鬼。

https://cdn.china-scratch.com/timg/190923/112G45492-30.jpg  幸运的是,我们第一次触碰到了编程中一个重要的核心概念——全局变量与局部变量,不幸的是,类似这样的核心概念,后面还有很多很多,慢慢来。

什么样的概念可以称为编程的核心概念?我的理解是要超越具体语言本身的,更多体现编程思想的东西,对一个才开始接触Scratch的孩子来说,我知道这样的说法很晦涩,所以,只是提一句,不展开。


关于“全局变量与局部变量”的概念(变量作用域)。任何编程语言都有变量,也都有全局变量和局部变量的概念,Scratch当然不例外。只不过,感谢Scratch有趣的皮囊,让我们可以很直观的感受到变量作用域的区别。言归正传,在我们这个例子里,“For all sprites”意思就是这个变量对所有的Sprite都可见,而且不仅仅是可以“看见”,还是可以“修改”。这样,就很好解释例子中的现象了,Cat1每走一步都对steps+1,Cat2同样,那不就是它们合起来走了十步吗?它们走的又是那么的同步,看起来不就是steps每次都+2吗?

计算机小知识

正文为什么叫“看起来”,稍稍扩展一下,无论现代科技如何进步,计算机的基本设计原理并没有太多改变,程序的执行从严格意义上来讲,都是按照一定的顺序执行的,所以,如果我们把时间观察粒度切的足够小,一定是能够看到先是执行了Cat1中的代码,或者先是执行了Cat2中的代码的,在这样的粒度下,我们也应该可以看到steps每一次都是在偶数停留1秒后,增加了1变为奇数,又瞬间增加1变为偶数。这种极其细微的变化,对多数程序来讲,都是没有影响的,但是对于高频交易,影响就是巨大的,毕竟无论是证券交易,还是线上秒杀活动,瞬间的区别都会影响到钱的多少。


好了,概念说完了,那么我们如何对两只猫单独计步呢?最理想的方法当然是给每只猫设定一个“For this sprite only”的steps变量,分别统计。这里,我们用一个取巧的办法,为Cat2新增一个“For this sprite only”的变量steps2,并将Cat2代码里的steps变量全部替换为steps2。这里,不再贴出截图,我建议家长能够跟孩子一起动手,看结果的不同。 https://cdn.china-scratch.com/timg/190923/112G44194-31.jpg取巧可以吗当然可以,程序是自由的。

https://cdn.china-scratch.com/timg/190923/112HJ612-53.jpg


细心的朋友一定注意到了一个地方,就是当我们添加了steps2后,在代码结果区显示了一个Cat2:steps,显而易见,这是一个“For cat2 only”的变量。
啰啰嗦嗦,变量的基本大体介绍完。

2

表达式

进入这一节的第二部分:Operators,表达式。

我突然意识到自己在编排上还是犯了一个巨大的错误:把变量和表达式,这两个如此重要的概念放到了一节之中。但是没办法,我给自己框定的就是十节内容,其中还包括了两节废话。

从内容的编排上来讲,我之前也提过,是在参照一般编程语言的逻辑基础上结合Scratch的特点。如今开始学习编程,Scratch自然是个不错的入门方式,但,Scratch就是Scratch,有有趣的皮囊,可以很方便的做一些动画,小游戏,可以培养编程的兴趣。但如果只是为了兴趣,可能最终一无所得,记得动画、游戏的样子,却不记得怎么实现。

所以,我想尽可能多讲基础知识,这一节以及接下来的两节,我会更多的按照自己理解的编程语言的核心概念去编排、讲解、举例。在我学习和使用了几十种形形色色的编程语言的经历中,唯有这三节里的内容,是所有基础的基础。正如人类最初用简单的动词、副词、量词、介词逐渐构建了如今丰富多彩的语言世界一样,神奇的程序世界也是从这三节开始的。


我一直觉得“表达式”这个翻译甚至比Operators更加贴切,内涵更丰富,以至于我很难用一句话去更好的解释其完整的意思。这里,只在当前的应用环境下,做一个解释:表达式,就是对变量(或者常量,顾名思义,值不变)进行某种或者某几种组合运算。如何理解?就以Scratch为例,目前的版本中,对表达式用了绿色的框表示,在绿色的框内,是个式子,有变量有常量,有运算,有判断,但是跳出绿色的框,对一段程序而言,就变成了一个结果。如果这种理解不直观的话,那么想象一下Excel表格,可能里面的单元格写着公式(表达式),但是就表格看来,公式并不显示出来,显示的只是公式的运算结果。换句话说,表达式也是最小的程序形式,简单而言,1+1,就是程序,当然在有些对格式要求严格的语言里面,会报语法错误,但是不少灵活的语言里面,就会直接以“2”作为程序的结果输出,比如Python。表达式有种类之分,从大类来讲,是两类:算术表达式和逻辑表达式。算术表达式算术运算,结果为数字逻辑表达式逻辑运算,结果为真假在Scratch中,两者的区别一目了然:前者是圆角矩形,后者则是六边形(可以看到,字符的运算也用圆角矩形来表示,本质上,字符运算也是算术运算,计算机把字符转换成数字进行运算后,再转换回字符而已)。
关于算术表达式,相信不需要如何解释,需要解释的是逻辑表达式。我们知道,整个现代计算机的基础是二进制,而逻辑运算的结果也只有两个:真、假。逻辑运算则有:与、或、非及其组合。实际上,任何算术运算都可以转换为逻辑运算,当然,这个已经是大学二年级课程《数字电路》中的内容了,这里,不展开,只是简单解释一下与、或、非运算。

与(and):输入是两个及以上的逻辑判断,当所有逻辑判断都为“真”时,与运算结果为“真”,只要有一个逻辑判断为“假”时,与运算结果就为“假”。

或(or):跟与运算的区别在于,只要有一个逻辑判断为“真”,或运算结果就为“真”,但是请注意,与运算和或运算并非相互为反运算,因为当所有逻辑判断都为“真”时,与运算和或运算的结果都是“真”。

非(not):把“真”的变成“假”的,“假”的说成“真”的。


关于Operators(表达式)的基本概念到此讲完。遗憾的是,因为技术原因,接下来,我只能用程序给出算术表达式的例子,而无法给出逻辑表达式的例子,当然这会在下一节补上,因为下一节,我们会进入一个非常重要的基础程序结构:条件分支。
例子很简单,这次出场三只猫,Cat1和Cat2随机报一个10以内的数,Cat3把两个数乘起来,并报答案。三只猫对应的代码如图。

https://cdn.china-scratch.com/timg/190923/112HT5R-54.jpg

https://cdn.china-scratch.com/timg/190923/112HQ4H-55.jpg

https://cdn.china-scratch.com/timg/190923/112HS2V-56.jpg

https://cdn.china-scratch.com/timg/190923/112H955U-57.jpg

简单解释一下程序,主要是两个表达式:

1、pick random:意思就是产生一个随机数,例子中产生的是1到10的随机数。

2、join:字符串拼接,字符串拼接是可以不断嵌套使用的,这个例子中,假设x为2,y为5,那么,四个join的结果就是“2X5=10”。这种字符串拼接术,无论在任何程序语言中,都是最常用的技巧之一。

https://cdn.china-scratch.com/timg/190923/112H92957-58.jpg

给家长的话

这一节有不少的概念,而且非常重要。变量与常量(不变的值就是常量,Scratch里没有常量的设置,那么我们可以认为具体的数字就是一个常量,比如上面的think “” for 2 seconds,这个2就是一个常量)、全局变量与局部变量表达式、算术表达式、逻辑表达式逻辑“真”与逻辑“假”逻辑运算(与、或、非),虽然我把这些内容压缩进了一节,但是我希望家长可以花两天(每天半小时)的时间帮助孩子去理解与消化。


参照我给的例子,我会给出如下实践建议

实践建议

  • 增加变量,看到程序运行中变量的变化;

  • 提出问题,为什么变量的变化跟我们想象的不一样;

  • 新增加一个“For this sprite only”变量,通过前后区别,让孩子初步明白全局变量和局部变量的区别;

  • 鼓励孩子自己做简单的例子,能够用到全局变量和局部变量;

  • 解释表达式的概念,可以按照Scratch编排的方式,简单的解释一下绿色圆角矩形程序块(算术表达式)的概念,这里面有两个比较难解释的运算,一是pick number,二是join。上面的内容已经做过解释。

  • 通过逻辑训练来帮助孩子理解基本的逻辑和逻辑预算,逻辑训练分为两部分,一部分是逻辑真假判断,可以提出几个问题,例如,今天下雨了;现在是早上;30比50小(真),等等这些问题,让孩子判断真假。第二部分是逻辑运算,首先是非运算,非建议直接用数字比较来,比如,30>=50(假)的非运算是30<50(真);其次是与运算和或运算,比如要表示40是否在一个数字区间范围内,可以用40>30 and 40<50(真)、30>40 or 30 <20(假)这样的表达式,可以直接帮助孩子无缝对接Scratch中的表达式。

  • 最后,是让孩子实现我最后给出的一个三只猫做计算题的例子,强烈建议先给孩子描述任务,让孩子自己尝试去实现,遇到问题再找参考,直至完成。编程是一项实践性非常强的工作,眼高手低(看程序都明白,写程序一句不会)是最容易发生的事情,只有让孩子多动手,才会打下更好的基础。 

五、Conditional Branch条件分支

Events事件

按照Scratch对代码积木的分类,我们这节涉及到Control和Events,但是如果按照一般程序语言的习惯,Scratch的Control模块至少包含了两块重要的内容。但是从逻辑关系来讲,这一节要说的两部分内容关联度略高一点,所以我把Control模块一切为二,其中一部分跟Events模块一起,构成这一节的内容,剩余的一块组成下一节的内容。

Scratch团队应该也是认为Control和Events关联度很大,所以积木块都用了相近的颜色。事实上也是如此。

如果说前面两节的内容更多的是在讲编程语言的基本元素,及在Scratch中的具体形态,那么这一节和下一节其实是在讲编程语言的基本骨架。骨架+元素构成基本同时完整的可被执行的代码段。

至于这些代码段如何组装,构造复杂的程序,这就是一步步不断进阶的过程了。

/Public/Home/images/grey.gif 

1

 Conditional Branch条件分支

其实,Scratch里,没有任何一个地方会提到条件分支这样的概念,只是用了Control,我理解这个本意就是说控制程序结构或者说控制代码走向的。然而,这样的划分虽然简单,在我看来却不够,既然用到了这样的概念,那何不讲的清清楚楚明明白白呢?

https://cdn.china-scratch.com/timg/190923/112FK1M-5.jpg首先做一些基本的概念解释,Conditional Branch,这个词可以拆成Conditional条件和Branch分支两个意思。Conditional条件,简而言之,就是承接上一节的逻辑判断,判断一个逻辑表达式是“真”还是“假”。
Branch分支,是基于条件判断的后续分叉,好比一条岔路口,上面的条件给出了我们要选择哪条路,这里的分叉则指明不同道路的方向。几乎所有的编程语言,条件分支都会用类似if-else的结构,Scratch也不例外。在Control类里,有两个积木块,实现了这样的功能结构。 

https://cdn.china-scratch.com/timg/190923/112I14640-61.jpg

https://cdn.china-scratch.com/timg/190923/112I11157-62.jpg

https://cdn.china-scratch.com/timg/190923/112I1J22-63.jpg

https://cdn.china-scratch.com/timg/190923/112I15434-64.jpg

这个意思非常的简洁明确,右边代表如果条件A成立就怎样怎样,而左边则代表如果条件A成立就这样,否则就那样。“

注意到两个程序块里面的六边形了吗?跟上一节中逻辑表达式一模一样的六边形,意义也很直观,我们把一个逻辑表达式填入if程序块的六边形中,程序自己去对逻辑表达式进行计算并判断“真”与“假”,然后再按照编写好的分支继续下去。

”顺便解释一下为什么上一节对于逻辑表达式我没有举例子,因为逻辑表达式天然就是要跟条件判断和分支(这里为什么把条件分支拆开,写成条件判断和分支,因为条件分支是个更小的概念,条件判断和分支的形式有更多种,至少下一节中也会涉及到不同的形式)结合使用的,一个例子也必须讲了条件分支后,才有更实际的意义。好,例子开始。上一节,我们的例子是,两只猫报数,第三只猫做乘法报结果。这次我们修改一下,还是两只猫报数,但是第三只猫不再是做乘法,而是作为裁判,比较两只猫报的数字的大小,并宣布结果。在这个例子中,Cat1与Cat2的代码跟上一节的例子中一模一样,这里就不再贴出来了,只给出不一样的Cat3的代码的截图。 https://cdn.china-scratch.com/timg/190923/112I22391-65.jpg 

不知道是不是错觉,当程序已这种形式构架后,一下子觉得美感提升不止十倍。这种因为有了程序结构的支撑,血肉都变得生动的感觉,让我痴迷了几十年。

https://cdn.china-scratch.com/timg/190923/112I212X-66.jpg

需要对代码做一些解释,由于Scratch只给出了两种条件分支的结构,而数字大小的比较结果则有三种:1赢、2赢、3打平,用两种积木去实现三条岔路,美感多少打了折扣,这也是Scratch的不足之处,对于复杂的逻辑结构虽然能够实现,但是也极其复杂。

我们来分析这个逻辑结构的实现,首先,三种结果一定是排他的,一次只会有一种结果,对于Cat1来讲,要么赢,要么输,要么打平,对Cat2而言也是。理论上弄一个三岔路,问题就轻松解决,但是在没有的情况下,我们只能分成两步:第一步,先判断Cat1有没有赢,所以会有第一个if-else积木,里面的逻辑表达式是x>y,如果为“真”,那么很简单,直接宣布结果。如果为“假”呢?为“假”的时候可能会有两种情况,要么xy或者x=y,但是由于x>y在之前已经被我们判断过了,如果x>y为“真”的话,程序是不可能再来判断x

有点绕,但是逻辑就是如此。任何一段程序都是由各种逻辑构架出来的,没有逻辑的代码就如同流水账般记事的电影或小说,不仅没有吸引力,更没有意义。各种各样的逻辑判断和分支,构建了程序的起承转合。也许手误打错字是程序漏洞的原因之一,但是绝大多数的程序错误或者漏洞都是来自于对某种环境下逻辑构架的不完整不严密造成的。

/Public/Home/images/grey.gif 

https://cdn.china-scratch.com/timg/190923/112I2I24-68.jpg

2

 Events事件

理解完了条件分支这个重要部分,我们花很短的时间过一下Events。在程序世界里,Events非常重要,而且丰富多彩。什么是Events,简单说,就是某个事件发生了,那么什么是事件?事件是一个广义的逻辑表达式。例如,“吃饭”事件,我们问Cat1:“你吃过了吗?”,这是一个事件逻辑表达式,Cat1回答:“吃过了!”,代表前一个逻辑表达式运算结果为“真”,“吃饭事件”发生了。然后呢?然后就进入“吃饭事件”发生后的分支。Scratch中,最简单最常用的就是When green flag clicked事件,也是我们程序一开始就接触到的一个积木块。完整的意义这里可以再解释一下:通常情况下,我们每一个Sprite对象的代码都写在When green flag clicked之后,可以理解为这些代码存在于这个事件的分支之内,当我们点击了程序结果展示区域的绿旗后,这些代码就被执行,而如果没有点击,这些代码就不会得到执行。这里,一个事件就是一个开关,事件发生的逻辑判断为“真”,则开关打开,分支内的程序被执行,如果事件没发生,那么你可以当作这些代码不存在,如果事件永远没发生,那么代码就如同永远不存在。不仅仅在Events类别里面存在事件程序块,其他类别里面也有,我把各个类别里的代码块罗列截图。我们也可以仔细看他们的相同与区别。 

https://cdn.china-scratch.com/timg/190923/112I364A-69.jpg

可以很明显的看到,事件类的程序块有三种颜色,分别来自Scratch的Events、Motion和Sensing类。他们相同吗?在我看来,至少类似,因为它们都是在判断某一特定事件是否发生?那么它们有区别吗?在Scratch看来,它们的意义不同,功能不同,黄色的来自Events类的积木块,我们看到顶上是个圆弧,代表着它必须是一段代码的第一个程序块,是代码的开始,我们之前也按照程序世界的默认,叫它程序入口,对应的事件发生,程序块后的代码便开始执行;蓝色的积木块,我们看到它不仅有事件判断“if on edge”,而且直接给出了分支执行“bounce”,这其实就是一个条件分支,意思是如果一个Sprite碰到边界,就反弹。这个积木块被放在了Motion类别里,因为是事件加动作的结构;青色的积木块,我们看到都是六边形,也就是说是纯粹的逻辑表达式,只是在判断里面描述的事件是否发生,它必须使用在条件判断及分支的程序结构中。在后面,我会专门用半节来讲Sensing的部分。这些积木块,我们现在不需要记住,因为在后续的例子里,我们会逐渐用到,用的时候,直观的看结果,反推功能,这是在我看来更快的学习方法。一个非常简单的例子,作为本节内容的结束。 还是那三只猫,我们不再用When green flag clicked程序块,而是改用When this sprite clicked程序块,代码也只有简单的一句自我介绍。另外两只猫的代码也一样,只是名字改一改。这次,我们不需要再去点绿旗开始了,点任何一只猫就好了,看看结果如何,并观察一下程序运行区上方绿旗和红色八边形的变化。

https://cdn.china-scratch.com/timg/190923/112I55623-70.jpg

https://cdn.china-scratch.com/timg/190923/112I51a9-71.jpg

给家长的话

实践建议

  • 这一节其实就是讲了条件分支,包括条件判断、分支,并在此基础上扩展了Events事件的概念。

  • 对于这一节,如何去教小朋友,我建议是因人而异。每一个小朋友的年龄、知识储备、兴趣点都不尽相同,对于重要的逻辑的理解,在短短的半小时内能够给出的反应也不会相同。

  • 不必在开始的时候就说概念,就从我给出的数字比大小的例子开始,让小朋友自己尝试去解释,如果能够解释,那说明本身理解了,这时候可以多讲一些逻辑的概念;如果短时间内解释起来有困难,那不妨把程序一块块拆解来启发式的解释,Srcath对不同功能的程序块颜色做了区分,这是个很好的功能,特别是在帮助小朋友理解上。

  • 正如同,学数学要先会数数,学英语要先认识字母一样,学程序,也得先理解一些逻辑、条件分支以及其他一些概念,我相信一个大班或者小学低年级的孩子理解这些不是难事,需要的只是耐心。程序世界很大,孩子未来也很长,一点点来,不去跟别人比,跟自己比就够了。

  • 关于事件,我不建议教孩子太多,就用我的例子让他们有个直观感受就好了。我之所以要在这一节写事件,一是从完整性来说,要有,二是以后其实会用到。但是在理解了条件分支后,事件并不难,至少在Scratch中不难,用到了就会了。


 

六、循环

终于到循环了。Scratch很有意思,编内容,做例子也很好玩。但是码字太痛苦了,整理格式太费神了。好在,能够自由发挥的介绍循环,就都不是事情了。循环当然很重要,更重要的是,把循环讲完,程序世界的自由大门也就打开大半了。

人类为什么要发明计算机、设计编程语言,最初的目的是因为要进行科学计算,因为科学计算需要大量的复杂的,重复的运算过程靠人做,耗时而且容易出错。于是靠程序来完成,虽然对于很多计算,程序也要耗费大量的时间,但是:一、总比人力计算来的快;二、只要程序没错,结果就基本不错;三、可以无上限的重复。这里的重复有两重含义,一是程序写好了,可能条件变了,环境变了,需要重新计算,随时可以;二是,程序内部,本身也需要许多重复,这个也能比较容易的实现,而实现这个,靠的就是这一节要讲的:循环。上一节提到过,在程序语言里,循环与条件分支共同构成一个程序的骨架。所以,在Scratch中,设计者将循环与条件分支共同放入了Control类别中。那么什么是循环:简单说,不简单的重复叫做循环。正是这种不简单的重复,与条件分支一起构成了五彩缤纷的程序世界。先看Scratch提供的循环相关的程序块,主要是三个按字面意义,分别是永远循环(forever),循环N次(repeat),循环直到某一逻辑表达式为“真”结束(repeat until)。需要解释一下的是,forever虽然叫永远循环,但是指的是在程序里,一旦按下红色八边形停止按钮,随着程序的结束,循环自然也就结束了。简单的循环,是很容易被理解的,我们通过三个简单例子分别来看三种不同循环的效果。第一个例子用forever。一个猫报数的例子。
很显然,如果不按下红色八边形按钮让程序终止,猫会不断的报数报下去。第二个例子,还记得我们在前几节里面用到两只猫一边打招呼一边互相靠近的例子吗?我们用repeat修改一下,让程序在功能相同的前提下,看起来更好看一点。可以回想一下之前例子里面,我们的代码有多冗长。循环有效的减少的重复代码的数量,让程序结构看起来更加美观易懂。另一个与前面例子不同的修改是,在循环里,我用next costume程序块替换了之前的switch costume to,这是一个典型的在循环结构里会用到的思路:很多时候我们并不知道一些东西的具体数量,这里是猫的不同外观,还可以是其他的,但是我们想都用到,而不是去指定用哪一个,那么类似于next的功能就变得有意义。当然,Scratch里面只提供了有限的几种next,更复杂的编程语言则会有类似的设计,但是可以提供更多变化可能。
第三个例子,我们想让猫做一个累加法,比如像当初的高斯一样,去计算1加到10或者1加到100,我们很容易想到可以用repeat 10或者repeat 100这样的结构。这里,我们尝试换种思路,用repeat until的结构。几乎我们点击绿旗的瞬间,猫就报出了“5050”的答案。答案显然是正确的(对于幼儿园的小朋友,可以把x>100改成x>10)。
需要解释一下repeat until循环。可以看到这个循环里面有一个绿色六边形的逻辑表达式,我们不妨称之为条件循环,每一次执行循环体(在循环程序块里面被包裹的程序我们叫做循环体)之前,程序都要对绿色六边形的逻辑表达式进行逻辑判断,如果为“假”则执行,如果为“真”呢?那么循环直接结束,循环体内的代码不被执行。在这个例子里面,每一轮循环的时候,程序都要去比较一下x与100的大小,当x<=100时,循环不断得到执行,我们看到的就是s变量每一次都被加上x,x每一次都被加上1。当最后一次x=101时,条件判断产生了“真”的结果,循环结束,猫直接报出答案(可以看到s最后加的数字是100,而不是101)。本节最后一个例子,我们要讲循环的嵌套,什么叫循环的嵌套?循环里面加循环,就叫嵌套(其实,我们在上一节介绍条件分支时,已经用到了嵌套,为了表示出“>、=、<”三种条件,我们在一个条件分支内又加入了条件分支)。程序里,循环嵌套是非常常用的。一个简单又应景的例子是,我们让猫背诵乘法口诀如何?

http://a.miyanlife.com/a.php?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FLIUqicscSKicTeeH6IhFW1KG0HpNcB6CGwDySrrq2R3xIylnfVBcGgqmG9FMHdq3qn8TjoBR8gUqwH09BG76OPSA%2F640%3Fwx_fmt%3Dgif

解释一下代码,首先,一个乘法包含三个数:乘数、被乘数、积。分别用变量x、y、product表示。一个最简单的想法是,我们用两个循环嵌套,分别让x、y从1变到9,计算积。可是,我们从小背的乘法口诀里面有1*8,但是却没有8*1这样的吧?所以,我们得稍微复杂一点。在外层的循环里,让x从1变到9没问题,所以,外面的循环我们设置的退出条件为x>9,而内层循环里面呢?我们需要让y从x变到9,退出条件是类似的y>9,但是注意到在内层循环开始之前我们需要set y to x,做一个初始化。
这里,就需要讲一个顺序概念,我们看到了循环嵌套,但是哪个循环先被执行呢?从程序来看,不难发现是内层的先被执行。每一次内层的被执行完,退出后,回到外层的循环体,然后再重新进入内层,再退出,再重新开始。所以,在这个程序里面,x被加了9次,y呢?被加了9+8+7+6+5+4+3+2+1次。所以最后的结果呢?如果细心一点,我们会发现当猫把乘法口诀背完以后,x是10,y也是10。因为这是两个循环都结束的条件(>9),但是在程序最后用绿色椭圆圈住来的代码,我把x、y都设回了9,为什么?对小孩子来说,看到x是10,y是10,但是积(product)却是81,大概率会产生误导。所以我加了两句对程序没有任何影响的语句。我想,这也是一种简单的user friendly吧,而对于程序来讲,功能完整准确,user friendly都应该是追求的目标。

给家长的话

实践建议

  • 这一节,对于家长如何与小朋友共同尝试,我没有特别的建议,按照例子走就好了。循环当然是很重要的概念,循环也非常难,但是基础的内容,在Scratch里,其实就是这些,更重要的是小朋友在自己动手的尝试中理解了这些概念,并会应用。

  • 这节结束,Scratch,或者说一个编程语言的最基础的概念,就告一段落了。编程是一个实践性非常强的学科。从小到大学了这么多语言,也参加了大大小小的考试或者比赛,从没有任何一次会来问循环的概念是什么,只会有两种形式,一种是给出一段代码,让你写出运行结果,一种是给出一个问题,让你写出代码。只有不断积累的实践,才能让我们更加知道计算机是怎么想的,也才能更容易的让计算机实现我们想要的。

  • 后面四节,按照我的定义,才算是

    后记,小编朋友公司研发了一个游戏化的少儿编程在线课程(5-12岁),游戏化教学结合scratch(一款在线少儿编程工具,类似乐高的积木拼搭),我家娃娃学了几次课,非常喜欢(超预期),16次课才200多块钱,对锻炼孩子的思维能力和动手动力很有帮助。

    感兴趣的朋友可以扫描二维码,关注一下,或微信搜索“大耳猴少儿编程”

    https://www.china-scratch.com/Uploads/Editor/2018-04-22/5adca08bdc212.jpg