資訊內(nèi)容
朋友圈的親子編程課——Scratch第一期全集


在夏天開始之前,我設(shè)想用一段較長的時間,做一些跟編程教學(xué)有關(guān)的事情。經(jīng)過一個夏天的斷斷續(xù)續(xù)的思考與準(zhǔn)備,我決定從這個起點(diǎn)開始,這個起點(diǎn),我稱之為——《朋友圈的親子編程課》。
(四年多前注冊這個公眾號的時候,原意只是發(fā)一些跟拍照、跟市場有關(guān)的內(nèi)容。如今,似乎離初衷已經(jīng)有了一段距離,但還是決定不去更名,跟我相關(guān)的東西,屬于我的,看到的,想到的,可以分享的,挺好。就是在這第一篇枯燥的文字里,穿插一些過去歲月中與花花草草相關(guān)的照片有一些扣題,更有一些自己還想留存的風(fēng)格。)
甚至,在我嘗試引導(dǎo)自己九歲女兒編程興趣的開始,我也選擇了Python。當(dāng)然,這是一個挺失敗的選擇,簡單的文字界面與枯燥的概念,自然無法引起一個低年級小學(xué)生足夠的關(guān)注度。有意思的反轉(zhuǎn)是,女兒在學(xué)校接觸到了Scratch,并且主動要求我教她。在自己斷斷續(xù)續(xù)的嘗試及與她的互動后,我開始了認(rèn)真的備課,編排內(nèi)容、設(shè)計例子,并在八月用了近兩周的時間,對女兒進(jìn)行了教學(xué),效果是:我想要灌輸?shù)年P(guān)于程序的基本概念都被毫無抵抗的接受了;即使有一些復(fù)雜的例子也被完全理解并得到擴(kuò)展;她開始希望我教一些更難的例子或者,一門新的語言,例如Python,或者BASIC。

三十年前的起步,一臺叫做Laser310的“電腦”,我用的版本只能使用BASIC程序,功能還弱于稍晚幾年風(fēng)靡的“小霸王學(xué)習(xí)機(jī)”。由于程序不能保存,每次開機(jī)都要從自己厚厚的手抄程序本中找出一段代碼,敲進(jìn)去,再運(yùn)行。最大的好處是,從小就建立了良好的盲打基礎(chǔ)。
回顧自己差不多三十年前開始接觸編程至今,唏噓時代變遷:我那時候從認(rèn)識二十六個英文字母開始,而如今簡單的英語對八九歲的孩子來講毫無壓力;我那時候懵懵懂懂的從BASIC開始是毫無疑問的唯一選擇,而如今的選擇多了太多太多。更有許許多多不變的,是那個我們一直稱為程序思維,看得見、摸得著,卻很難簡單定義的存在。也許誕生于互聯(lián)網(wǎng)高速發(fā)展之前的“史前”程序員,如我,都有一種潔癖般的固執(zhí),一種對于數(shù)據(jù)、結(jié)構(gòu)、算法,面向過程、面向?qū)ο筮@些概念朝圣般的偏執(zhí)。一個最大的負(fù)面效果就是,當(dāng)朋友問我,如何從零基礎(chǔ)起步,我總會想很多,然后給不出答案。一如已經(jīng)花去了我超過一個禮拜時間的風(fēng)格迥異的前六個版本前言。

第一類對象
朋友圈里的父母
哪怕只有很短的時間,但是通過自己學(xué)習(xí)、整理、陪伴,輸出給孩子,再得到反饋的過程,感覺真的很美妙。
第二類對象
那些“零基礎(chǔ)”朋友
雖然內(nèi)容看起來并不會很復(fù)雜,與傳統(tǒng)理解的寫代碼也有些許差別,但是,我確實(shí)很認(rèn)真的把我對程序入門的理解與更有趣的皮囊放在了一起,半個月的收獲,不會比學(xué)習(xí)任何其他一門語言小。
第三類對象
尋找可能性的朋友
在我使用Scratch過程中,我發(fā)現(xiàn)了很多有意思的可能性,所以,第三類,姑且叫做尋找可能性的朋友。
簡單講幾個問題,然后,鳴汽笛,啟動。
1為什么用Scratch起步
對孩子來說,我們都知道,興趣是第一重要的,而第二重要的是學(xué)習(xí)階梯。如果倒推十年二十年,正如我的經(jīng)歷一樣,也許我們沒有其他選擇,都需要從BASIC/PASCAL/C語言開始。然而放到如今,我們多了另一類選擇,被稱為積木式編程(Block-Based Coding),相對的,之前說的那些語言,稱為文本式編程(Text-Based Coding)。相對于傳統(tǒng)的文本式編程,積木式編程界面漂亮、娛樂性強(qiáng)的特點(diǎn)非常適合小朋友入門,另外,在Python、JavaScript等語言大行其道的當(dāng)下,積木式編程反而擁有了更清晰的程序結(jié)構(gòu)、邏輯關(guān)系,這些,對于建立初步的程序思維,都大有益處。
即使是“零基礎(chǔ)”的成人,花一點(diǎn)點(diǎn)時間來熟悉和學(xué)習(xí)一下Scratch,也是有益無害。更擴(kuò)展一下,Scratch本身非常適合做動畫、交互等,那么做個有意思的PPT、動畫,甚至一些簡單的演示或者教學(xué),也是非常合適的。
2教什么?
第一期的《朋友圈的親子編程課》分為十節(jié),大概兩周推送完畢。在后面的實(shí)際內(nèi)容中,我按照Scratch的功能設(shè)置與特點(diǎn),結(jié)合自己在這個年齡起步時的經(jīng)驗(yàn),進(jìn)行組織。編排上,概念、簡單原理、例子、動手實(shí)踐,這些環(huán)節(jié)都會涉及。我的目標(biāo)也很明確:第一期課完成后,第一個層次,掌握了一些程序的基本概念、Scratch的基本功能、簡單組合,能夠編寫一些中等復(fù)雜的例子;第二個層次,這時候可以有個選擇,Scratch進(jìn)階,或者學(xué)習(xí)一門文本式編程語言,因?yàn)殛P(guān)于程序的基本概念已經(jīng)有了,所以,學(xué)習(xí)一門文本式編程語言,起步不是太難的事情。
3怎么學(xué)?
就親子編程目標(biāo)而言,我建議家長朋友能夠每天花一點(diǎn)時間做三件事情:

1、看完我寫的內(nèi)容
2、自己動手實(shí)踐
3、陪伴并帶著孩子一起實(shí)踐
編程的實(shí)踐性非常強(qiáng),只有不斷的嘗試,才能有提高。
親子共同學(xué)習(xí)、實(shí)踐,意義也不僅僅在于樹立榜樣、培養(yǎng)興趣。小朋友的想象力是驚人的,程序世界是自由的,當(dāng)這兩個世界碰撞之后,我們可以得到很多難以想象的啟發(fā),而這種啟發(fā),沒有陪伴,是很難獲得的。
4我的角色
為什么叫《朋友圈的親子編程課》,與我自己的角色定位有關(guān),我的角色就是朋友。與朋友分享、看下一代成長,是兩大趣事,結(jié)合起來,做一個更有意義的趣事。
為什么是朋友,一是有什么問題,可以隨時聯(lián)系到我;二是,我有什么新想法也可以隨時被看到,都是簡單直接的方式,省心。
當(dāng)然,借助于強(qiáng)大的線上資源,我也會利用各種工具來提升效果、提高效率,這個可以以后慢慢分享。
5下一步的計劃
在之前的每一個被我否定掉的前言的版本里,都會有一大堆關(guān)于規(guī)劃的內(nèi)容。可是正如之前所言,開始才是最重要的,也許以后會有類似于《朋友圈的編程課》、《朋友圈的Python從入門到放棄》、《朋友圈的好玩的BASIC》出現(xiàn),但是,沒有現(xiàn)在開始的一步一步,又何談未來,一切,慢慢來。
終于確定,這是一個最終面世版的前言了,在比原計劃整整晚了一個禮拜的時候。
恍惚間,又一個夏日終了,魔都也難得在連綿不斷的大中小雨后,展現(xiàn)出藍(lán)天白云下獨(dú)特的魅力。紛擾的世界、煩亂的內(nèi)心,都因開學(xué)季的到來,都因生命中數(shù)十個夏日、秋天的情緒切換,慢慢悸于平靜。


From the ground up,我們開始吧。

? ?Hello,World!
從這一節(jié)開始,正式進(jìn)入內(nèi)容,這一節(jié)會先有一個Scratch的基本介紹,然后是,對于多數(shù)純Scratch課程而言很奇怪,但是對于程序世界很有儀式感的歡迎詞:Hello,World!
我說過,我是個很固執(zhí)的“史前”生物。
1
Scratch最早是2006年,由The MIT Media Lab's Lifelong Kindergarten Group?推出。如今已經(jīng)發(fā)展到3.0版本,基于HTML5,不需要本地安裝。
訪問https://scratch.mit.edu,就是Scratch的官方網(wǎng)站。
我并沒有接觸過Scratch的前兩個大版本,所以也不清楚以前是什么樣子的,但如今,就是一個標(biāo)準(zhǔn)的社區(qū)模樣。開源、在線文檔、社區(qū),程序員三大寶,一個不缺。對了,Scratch是開源的,雖然對絕大多數(shù)使用者來說,這個根本不重要,但是它確實(shí)給了市面上不少“改裝版”存活基礎(chǔ)和空間,考慮到我是一個徹頭徹尾的“原創(chuàng)主義者”,所以,在學(xué)習(xí)過程中,我只推薦原版。另一個只推薦原版的理由是:Scratch的作用是啟蒙加基礎(chǔ)入門,這個階段,編程最重要的是基本思想的建立,每一種語言都有其適用范圍和局限性,Scratch當(dāng)然不例外。

“改裝版”或許在某些方面改進(jìn)了一些不足,甚至提供了更多更靈活的功能,但是否會破壞原有的體系和編程語言背后基礎(chǔ)而貫穿的邏輯,就不得而知了。
2
目前,線上已經(jīng)有大量的Scratch資源存在。
01?
官方網(wǎng)站
02?
Scratch Wiki
03?
第三方
首先,最大的資料來源就是官方網(wǎng)站,除了提供編程實(shí)踐的平臺之外,還可以通過訪問社區(qū)、支持板塊獲取足夠的相關(guān)信息。其中,最大的特色是網(wǎng)站上有來自全球用戶分享的Scratch項(xiàng)目,既可以直接看到結(jié)果(游戲、故事、動畫,等等),也可以查看源代碼,吸取別人的智慧。
其次,推薦Scratch?Wiki?(https://en.scratch-wiki.info/wiki/Scratch_Wiki_Home),這個百科網(wǎng)站最早與Scratch開發(fā)團(tuán)隊并沒有關(guān)聯(lián),后幾經(jīng)易手,曾經(jīng)由Scratch開發(fā)團(tuán)隊維護(hù)。如今,為了更好的服務(wù)于Scratch用戶,該網(wǎng)站已經(jīng)轉(zhuǎn)由第三方組織維護(hù),但是Scratch開發(fā)團(tuán)隊依然提供大量的支持。

一點(diǎn)一滴,交待的清清楚楚。當(dāng)我決定啟動編程課程的時候,最大的挑戰(zhàn)來自于內(nèi)心:我如何能夠長期的做下去?在這個目標(biāo)下,會有許許多多不同的選擇,有那么一點(diǎn)點(diǎn)是已經(jīng)做了的,還有許多是尚未面對的。一點(diǎn)一滴,慢慢來吧。
第三,通過搜索引擎能夠搜索到許多自媒體的資源,包括公眾號,博客等,也有不少的用戶會把自己的項(xiàng)目匯集起來,做成課程。對一些感興趣的目標(biāo),搜索相關(guān)資源,查看別人的代碼,是重要的學(xué)習(xí)。
寫代碼,大概永遠(yuǎn)是這么一個過程:學(xué)概念、學(xué)例子、模仿、改進(jìn),到自創(chuàng)。學(xué)習(xí)別人的經(jīng)驗(yàn),分享自己的收獲,這是開源最樸素的想法,也是程序員自由世界的基礎(chǔ)。
3
?https://scratch.mit.edu/

Scratch界面可以是中文的,甚至于程序模塊都可以中文顯示,但是,幾乎所有主流程序語言都是英文的,學(xué)習(xí)資料許多也是英文的,為了更好的與未來銜接,還是強(qiáng)烈建議從現(xiàn)在開始全程使用英文。
Scratch首頁的界面主要有以下幾部分內(nèi)容:
藍(lán)色菜單條部分:
左上角分別是Scratch圖標(biāo),點(diǎn)擊進(jìn)入首頁;
Create,無論有沒有注冊賬號并登陸,點(diǎn)擊就可以進(jìn)入一個新的項(xiàng)目界面;Explore,看看其他用戶都分享了哪些有趣的程序;
Ideas,有一些入門教程和主題導(dǎo)引;
右邊,就是跟賬號有關(guān)了,建議開始的時候就注冊一個賬號,最大的好處是所有編輯的項(xiàng)目和代碼都會保存下來,還可以修改,分享。
頁面主體就是一些用戶分享的項(xiàng)目,出于興趣,可以自由瀏覽、參考。
直接點(diǎn)擊Create,進(jìn)入一個新建項(xiàng)目,經(jīng)過一段時間的加載等待(取決于網(wǎng)速),就進(jìn)入了程序設(shè)計界面。?
可以看到,整個工作區(qū)被劃分為四大區(qū)域。
1和2是代碼模塊區(qū),其中1是代碼類別選區(qū),2是代碼塊選區(qū)。Scratch編程是不需要手寫代碼的,所有的代碼都靠積木塊組合實(shí)現(xiàn)。
3是編碼區(qū),把2中的代碼塊拖拽入3區(qū)域,并加以組合,就是Scratch的編碼過程。
4為預(yù)覽區(qū),可以隨時看到代碼運(yùn)行的結(jié)果。默認(rèn)模式下,預(yù)覽區(qū)顯示了一只貓。
5是Sprite編輯區(qū),可以對Sprite的屬性進(jìn)行編輯,例如位置,大小,方向,等等。
對于Sprite的準(zhǔn)確意思。在我的理解過程中也廢了些周折,開始時候,我本能的將之與對象聯(lián)系起來。甚至在這一節(jié)的初稿里我還專門寫了一段對于對象的簡單解釋。但是,實(shí)際上,Sprite是一個不同于對象的專有名詞,是動畫、游戲編程中最基本的存在。再一次為自己的淺薄暗自檢討的同時,尊重開發(fā)者的本來意愿,懷著敬畏的心態(tài)繼續(xù)使用Sprite的稱呼,并簡單翻譯成中文意思:精靈。
在后面章節(jié)的初稿里,仍有大段的關(guān)于Sprite的個人理解,我會保留自己原本的寫法,并加入業(yè)內(nèi)通用的理解。
6是Stage,場景編輯區(qū)。可以加入不同的背景,場景也可以單獨(dú)編碼,獲得不少炫酷有趣的效果。
4
按照我們從小學(xué)到大的習(xí)慣,這里應(yīng)該有一個小節(jié),叫做“Hello,World!”。作為一個pc單機(jī)時代走過來的程序員,開始講編程,必須對傳統(tǒng)足夠的尊重,所以,讓預(yù)覽區(qū)默認(rèn)出現(xiàn)的貓說一句“Hello,World!”,作為本章的結(jié)束,所有關(guān)于代碼、原理的解釋,則留待以后。
PS:關(guān)于“Hello,World!”在程序世界的魔力,是個很有意思的話題,關(guān)于它的起源,有不少說法,感興趣的可以搜一下。
三、Sprite 相關(guān)
Looks?&?Motion
在情懷式的“Hello,World!”之后,開始Scratch編碼課程的第一部分內(nèi)容,按照自己這些年來對編程語言的理解,Scratch的功能和語言邏輯,以及教自己女兒過程中的反饋,我把課程分為八節(jié)。
理論上,是可以做到一天一課的,但是,要知道,孩子的專注力是有限的,時間也是有限的,編程本身就是一個長期的學(xué)習(xí)與實(shí)踐過程,不在一朝一夕的填鴨,所以,我認(rèn)為把計劃中的課程內(nèi)容按照兩周的時間編排,即使目標(biāo)只是初步入門,強(qiáng)度也是不小的。同時,我不會像Scratch官網(wǎng)建議的那樣,從好玩的動畫和游戲出發(fā),因?yàn)槿绻@樣,很大可能興趣就止步于動畫和游戲了。任何興趣愛好,即使是游戲,都是值得我們花費(fèi)大量的時間去深入學(xué)習(xí)的,而基礎(chǔ),則是一切的開始,更何況Scratch本身已經(jīng)夠“好玩”了。所以,我會根據(jù)Scratch本身的功能,參照其他高級語言入門時的編排方式,進(jìn)行切割,形成五個講解內(nèi)容,三個綜合性的例子,其中一個是動畫、一個是游戲(呵呵),一個是數(shù)學(xué)(編程與數(shù)學(xué)分不開)小游戲(呵呵+1)。這樣的編排,基本涵蓋了Scratch提供的基本代碼模塊功能。至于擴(kuò)展的部分,特別是樂高之類的,對我來說都高級了,目前不在我計劃中。
講解內(nèi)容一:Sprite相關(guān)(Looks & Motion)
講解內(nèi)容二:變量與表達(dá)式(Variable,Operator)
講解內(nèi)容三:條件分支與事件(Conditional Branches,Events)
講解內(nèi)容四:循環(huán)(Loop)
綜合示例一:動畫
講解內(nèi)容五:傳感器及其他(Sensing)
綜合示例二:小游戲
綜合示例三:數(shù)學(xué)小競賽
另外,在計劃中,我會開第二個兩周課程,顯著的提升代碼復(fù)雜度,去實(shí)現(xiàn)一個又一個的小目標(biāo)。同時,計劃中應(yīng)該會有一個和階段二平行的基于文本編碼的入門課程,為什么這么做的目的現(xiàn)在不想過多解釋,只是真的會很有必要,至于選擇什么語言,以前我很確定,不會選擇Python,然而現(xiàn)在,我想說有不小的可能性會是Python。
對于這一系列安排與選擇,想說,我的固執(zhí)再一次起了巨大的作用,在邏輯與結(jié)構(gòu)先行的根深蒂固的概念影響下,我強(qiáng)行把Scratch積木菜單進(jìn)行了拆分。在Python很好用但是“功法有點(diǎn)邪惡”的長期印象下,我又本能的排斥將Python教給小朋友。好吧,如果我能順利的從Python中提取出自己所謂的“武林正宗”的精髓要義,我就不跟自己較勁了,選擇Python作為文本編碼的入門(腳本)語言。為了不辜負(fù)大家對Python的熱望,我會努力的。

后事交待完了,?我們終于可以開始了

Sprite基礎(chǔ)???
Sprite
Sprite,精靈,這個名詞最早來源于游戲中,首先,它是一張圖,比如默認(rèn)的那只貓,但是在背景刷新的時候,這張圖并不刷新,它也是獨(dú)立變化的,如同一個精靈一樣懸浮在背景之上,這是精靈這個名詞的由來。但是,我認(rèn)為,用Sprite這個概念,雖然在Scratch中是毫無問題的,但在后續(xù)編程的進(jìn)階中,會造成很多概念上的困擾。所以,我更愿意將它稱為“對象”,借用一定的面向?qū)ο缶幊讨械母拍睿驗(yàn)樗_實(shí)有許多類似的地方,雖然更多的不同,但是這個不同主要來自于功能的缺失,而非區(qū)別。
上面的正文是如第二節(jié)課中所言,沒有修改過的。Sprite是動畫、游戲中經(jīng)常使用到的概念,從理解上來講更具象化,可能是一只貓、一只老鼠,或者一輛車、一棟房子,等等。Scratch編碼也主要圍繞Sprite這個核心展開。


添加一個Sprite!?

點(diǎn)擊區(qū)域5中右下角如圖標(biāo)示的按鈕,進(jìn)入Sprite選擇界面。

Scratch提供了各種形態(tài)的Sprite選項(xiàng),好玩的東西就該如此,我們從Animals標(biāo)簽下,選擇跟默認(rèn)中一樣的Cat。

這樣,我們有了兩只貓,給它們改名,分別命名為Cat1和Cat2,同時,對位置和角度做一些調(diào)整。
?一個有意思的事情發(fā)生了,之前的那只貓Cat1依然在說“Hello,World!”,而Cat2則毫無表示。分別點(diǎn)擊Sprite選取里兩只貓的圖標(biāo),可以看到,Cat1在代碼區(qū)域是有代碼的,而新加的Cat2則空空如也。兩點(diǎn):一、要讓某個Sprite或者對象有動作,是需要編碼的;二、每個Sprite是需要(也可以說成可以,呵呵)獨(dú)立編碼的。所以,我們完全可以做成一個這樣的場景,Cat1說“Hello,Cat2!”,Cat2說“Hello,Cat1!”。



程序入口,就是程序開始執(zhí)行的地方。不管什么編程語言,程序入口都是最重要的第一步,不同的語言對于程序入口會有不同的約定或者說規(guī)則。
對于Scratch而言,程序入口可以有多種方式設(shè)定,正文中所述的When?green flag?clicked代碼塊是最常用的一種,還有一些其他的方式。同時,每個Sprite都可以有一個或者多個程序入口,不僅不同Sprite的代碼相互獨(dú)立,同一Sprite下多個入口區(qū)分的代碼段也是相互獨(dú)立的。
可以想象一下,如果我們加入的貓不是兩只,而是許多只,同時這些貓都在屏幕上漫無目的亂跑,彼此之間獨(dú)立,沒有相互影響,是一種怎樣的景象?這種在其他語言實(shí)現(xiàn)起來很復(fù)雜的效果,恰恰是Scratch的優(yōu)勢所在。
相應(yīng)的,點(diǎn)擊綠色旗幟旁邊的紅色八邊形按鈕,程序結(jié)束,顯示為兩只貓都是毫無表示。2
Motion、Looks??
Motion和Looks,顧名思義,動作和外觀。這兩個類別分別承擔(dān)了Sprite的動作和外觀,當(dāng)然,其他類別,例如Sound,Sensing等等,每一個都能說與Sprite息息相關(guān),畢竟,Scratch的核心就是Sprite。這一節(jié)只介紹Motion和Looks,是因?yàn)樗鼈兏兇猓哺庇^。點(diǎn)開每個類別里,都有一系列的代碼塊,代表不同的動作,或者外觀。這里,我就不一一列舉說明了,畢竟,寫一個《Language Reference》并不是我現(xiàn)在的目標(biāo)。但是,我還是建議大家每一個都試試,編程是一項(xiàng)實(shí)踐性很強(qiáng)的活動(我想說工作,呵呵+N),而在編程世界里真正的自由不是我們漫無目的的想干嘛就干嘛,而是我們了解并實(shí)踐了許多種基本的功能后,自由的組合,變成無限的可能。我也會在本節(jié)最后的小例子里面加入幾個功能塊作為展示和引玉。3
Costume???
點(diǎn)擊代碼區(qū)上方Tab頁中的Costumes,可以看到一個完全不同的界面。就按照Costume本意,我們就叫它皮膚吧(免費(fèi)的,不需要點(diǎn)券或者鉆石購買)。對于這只貓來說,系統(tǒng)默認(rèn)提供了兩種皮膚,一個是之前一直出現(xiàn)的cat-a,另一個就是cat-b,我們可以像畫圖一樣改變皮膚,也可以新建皮膚。當(dāng)然,Costume的功能可不僅僅是改個樣子,很多復(fù)雜一點(diǎn)的應(yīng)用中,都需要用到Costume這一設(shè)定。這里,就不過多解釋了。
簡單的畫圖功能,可以充分發(fā)揮小朋友的想象力和繪畫能力。
4一個簡單的例子??
用一個例子把這一節(jié)的內(nèi)容串起來,目標(biāo)很簡單:兩只貓互相打招呼,并且不斷靠近。?

注意不同Sprite的代碼的微小差別。
給家長的話
如前言所述,這個課程我第一類面向的對象就是家長朋友。為什么叫親子編程課,我的想法是親子共同來“玩”Scratch,既增強(qiáng)親子關(guān)系,又能更好的幫助孩子啟蒙到入門。我本著這樣一個目的,將內(nèi)容寫到這里,如果站在一個零基礎(chǔ)開始的家長的角度來說,我認(rèn)為這樣一種介紹方式,應(yīng)該是可以了。但是,對于我們的真正目標(biāo)而言,需要再往前走一步,直接面對每一個孩子的是家長自己,所以,我們需要加一部分內(nèi)容,作為家長如何啟發(fā)自己子女動腦動手的建議,暫且稱之為“親子實(shí)踐建議”。親子實(shí)踐建議
最開始的時候,可以讓孩子自己選擇一個喜歡的Sprite,可以是貓、狗,甚至任何動物也好,其他物件也好。
通過調(diào)整Sprite區(qū)域的屬性,例如size,x、y,direction等等,看看不同數(shù)值引起的變化,從而了解屬性的概念。
熟悉代碼區(qū)的操作,包括程序塊選擇,拖拉,修改白色圓角矩形中的參數(shù)。熟悉When?green flag?clicked代碼塊及程序啟動、停止(綠旗按鈕開始,紅色八邊形按鈕結(jié)束)。將Motion及Looks中代碼塊拖拽入代碼區(qū)中,看不同的代碼塊的效果。
切換至Costume頁,看看不同外觀對Sprite影響,有興趣的可以修改并保存自己的Costume。
按照示例代碼,開始我們第一個完整的例子。
PS:在這個例子中,我只使用了Motion和Looks。這樣做的原因是希望循序接近,孩子的理解力和專注力是有限的,重點(diǎn)應(yīng)該是如何在有限的專注時間段里盡可能培養(yǎng)孩子的興趣,潛移默化的灌輸基本的程序思維和邏輯思維,而不是選擇如何在短時間里灌輸多的知識。

這一節(jié)中,大家一定會注意到大量的名詞被我用花花綠綠的色塊標(biāo)示出來。其實(shí),從第一節(jié)開始,我就有意識的這么去做了。其中的原因來自于程序中一個很重要的概念:保留字。保留字,顧名思義,就是保留下來,在程序語言中承擔(dān)特定功能的名詞或者字符。如今,在代碼編寫里面,保留字還有一個很有意義的作用就是:通過不同顏色對保留字及其他功能的字符、數(shù)字、符號等加以區(qū)分,可以極大提升編碼效率。Scratch借鑒了這個概念,對于不同類別功能的代碼積木用不同顏色標(biāo)示,而不僅僅是為了五顏六色吸引孩子的注意力。我基本繼承Scratch的做法,盡可能的在提到這些保留字時,用相同或者相近的顏色標(biāo)示,希望能夠提升閱讀的效率。


四、Variables,Operators
這一節(jié),講Variables(變量),Operators(表達(dá)式)。這是一般程序語言參考中緊接著“Hello,World!”的內(nèi)容,我把它挪到了關(guān)于Sprite的基本概念之后。可是,我依然會困擾于如何向一個大概率不超過十歲的小朋友介紹變量的概念。如果說,Sprite,Motion,Looks在Scratch漂亮的界面下,是直觀的話,那么,Variables則是很不直觀的。而,Operators更是一個看起來很簡單,其實(shí)有很多內(nèi)涵的概念。
對于這一節(jié),當(dāng)初我想了很久,應(yīng)該怎么去講。坦白說,按照一般的Scratch教法,基本可以一筆帶過,因?yàn)樵趺从茫词剐∨笥岩惨豢淳兔靼住5恰肮虉?zhí)”告訴我,無論是變量還是表達(dá)式,對于一門程序語言來講都是很重要的基礎(chǔ),基本的概念點(diǎn)時時刻刻會用到,即使后面用Scratch做一些復(fù)雜的程序時,我堅持自己想做的是一個在Scratch載體上的程序思維的入門,所以,內(nèi)容會是以下呈現(xiàn)的樣子。
這一節(jié)內(nèi)容非常多,我覺得兩天的時間來學(xué)習(xí)是合適的。

1
變量?
對于看我寫了這么多廢話還在堅持捧場的朋友們,我想這樣去解釋Variable變量:與我們數(shù)學(xué)里面學(xué)到的變量的概念并無任何區(qū)別,程序里的變量用來存儲會變化的值(可能是數(shù)字,字符,甚至其他形式)。好了,這就是解釋。對于小孩子,我還是建議用一個例子去取代解釋。這個例子是對上一節(jié)的例子做一些小小的修改:我們加入一個變量,叫steps。
點(diǎn)擊Make a variable即可創(chuàng)建變量
然后會要求輸入變量名,以及一個對所有精靈(對象)有效,還是僅針對當(dāng)前精靈(對象)有效的選項(xiàng)。稍微懂一點(diǎn)程序的人,自然知道這是全局變量還是局部變量的意思,但是在這里,賣個關(guān)子,選擇默認(rèn)的,選項(xiàng)的區(qū)別,稍后直接看結(jié)果就可以了。?
這時候,我們能夠看到在結(jié)果展示區(qū)域,多了一個steps的顯示,并且數(shù)字為0。?
對Cat2代碼也做類似的修改,但是要注意兩者在說的話和移動位置上的微小區(qū)別,當(dāng)然,這些區(qū)別都跟上一節(jié)一樣,這里就不再贅述了。代碼修改好后,我們可以直接點(diǎn)擊綠旗看結(jié)果:隨著兩只小貓邁開腳步,steps的值變化了,但是問題也來了,1、steps每次增加都是2,可是我們明明設(shè)置的是每次變化1啊;2、steps最后的值為10,可是貓只走了五步啊!

還記得我們在添加變量steps時賣的關(guān)子嗎?那個關(guān)于“For all sprites”還是“For this sprite only”的選項(xiàng),就是這個選項(xiàng)在搗鬼。

什么樣的概念可以稱為編程的核心概念?我的理解是要超越具體語言本身的,更多體現(xiàn)編程思想的東西,對一個才開始接觸Scratch的孩子來說,我知道這樣的說法很晦澀,所以,只是提一句,不展開。
關(guān)于“全局變量與局部變量”的概念(變量作用域)。任何編程語言都有變量,也都有全局變量和局部變量的概念,Scratch當(dāng)然不例外。只不過,感謝Scratch有趣的皮囊,讓我們可以很直觀的感受到變量作用域的區(qū)別。言歸正傳,在我們這個例子里,“For all sprites”意思就是這個變量對所有的Sprite都可見,而且不僅僅是可以“看見”,還是可以“修改”。這樣,就很好解釋例子中的現(xiàn)象了,Cat1每走一步都對steps+1,Cat2同樣,那不就是它們合起來走了十步嗎?它們走的又是那么的同步,看起來不就是steps每次都+2嗎?
計算機(jī)小知識
正文為什么叫“看起來”,稍稍擴(kuò)展一下,無論現(xiàn)代科技如何進(jìn)步,計算機(jī)的基本設(shè)計原理并沒有太多改變,程序的執(zhí)行從嚴(yán)格意義上來講,都是按照一定的順序執(zhí)行的,所以,如果我們把時間觀察粒度切的足夠小,一定是能夠看到先是執(zhí)行了Cat1中的代碼,或者先是執(zhí)行了Cat2中的代碼的,在這樣的粒度下,我們也應(yīng)該可以看到steps每一次都是在偶數(shù)停留1秒后,增加了1變?yōu)槠鏀?shù),又瞬間增加1變?yōu)榕紨?shù)。這種極其細(xì)微的變化,對多數(shù)程序來講,都是沒有影響的,但是對于高頻交易,影響就是巨大的,畢竟無論是證券交易,還是線上秒殺活動,瞬間的區(qū)別都會影響到錢的多少。
好了,概念說完了,那么我們?nèi)绾螌芍回垎为?dú)計步呢?最理想的方法當(dāng)然是給每只貓設(shè)定一個“For this sprite only”的steps變量,分別統(tǒng)計。這里,我們用一個取巧的辦法,為Cat2新增一個“For this sprite only”的變量steps2,并將Cat2代碼里的steps變量全部替換為steps2。這里,不再貼出截圖,我建議家長能夠跟孩子一起動手,看結(jié)果的不同。?

細(xì)心的朋友一定注意到了一個地方,就是當(dāng)我們添加了steps2后,在代碼結(jié)果區(qū)顯示了一個Cat2:steps,顯而易見,這是一個“For cat2 only”的變量。
啰啰嗦嗦,變量的基本大體介紹完。
2
表達(dá)式
進(jìn)入這一節(jié)的第二部分:Operators,表達(dá)式。我突然意識到自己在編排上還是犯了一個巨大的錯誤:把變量和表達(dá)式,這兩個如此重要的概念放到了一節(jié)之中。但是沒辦法,我給自己框定的就是十節(jié)內(nèi)容,其中還包括了兩節(jié)廢話。
從內(nèi)容的編排上來講,我之前也提過,是在參照一般編程語言的邏輯基礎(chǔ)上結(jié)合Scratch的特點(diǎn)。如今開始學(xué)習(xí)編程,Scratch自然是個不錯的入門方式,但,Scratch就是Scratch,有有趣的皮囊,可以很方便的做一些動畫,小游戲,可以培養(yǎng)編程的興趣。但如果只是為了興趣,可能最終一無所得,記得動畫、游戲的樣子,卻不記得怎么實(shí)現(xiàn)。
所以,我想盡可能多講基礎(chǔ)知識,這一節(jié)以及接下來的兩節(jié),我會更多的按照自己理解的編程語言的核心概念去編排、講解、舉例。在我學(xué)習(xí)和使用了幾十種形形色色的編程語言的經(jīng)歷中,唯有這三節(jié)里的內(nèi)容,是所有基礎(chǔ)的基礎(chǔ)。正如人類最初用簡單的動詞、副詞、量詞、介詞逐漸構(gòu)建了如今豐富多彩的語言世界一樣,神奇的程序世界也是從這三節(jié)開始的。
我一直覺得“表達(dá)式”這個翻譯甚至比Operators更加貼切,內(nèi)涵更豐富,以至于我很難用一句話去更好的解釋其完整的意思。這里,只在當(dāng)前的應(yīng)用環(huán)境下,做一個解釋:表達(dá)式,就是對變量(或者常量,顧名思義,值不變)進(jìn)行某種或者某幾種組合運(yùn)算。如何理解?就以Scratch為例,目前的版本中,對表達(dá)式用了綠色的框表示,在綠色的框內(nèi),是個式子,有變量有常量,有運(yùn)算,有判斷,但是跳出綠色的框,對一段程序而言,就變成了一個結(jié)果。如果這種理解不直觀的話,那么想象一下Excel表格,可能里面的單元格寫著公式(表達(dá)式),但是就表格看來,公式并不顯示出來,顯示的只是公式的運(yùn)算結(jié)果。換句話說,表達(dá)式也是最小的程序形式,簡單而言,1+1,就是程序,當(dāng)然在有些對格式要求嚴(yán)格的語言里面,會報語法錯誤,但是不少靈活的語言里面,就會直接以“2”作為程序的結(jié)果輸出,比如Python。表達(dá)式有種類之分,從大類來講,是兩類:算術(shù)表達(dá)式和邏輯表達(dá)式。算術(shù)表達(dá)式算術(shù)運(yùn)算,結(jié)果為數(shù)字邏輯表達(dá)式邏輯運(yùn)算,結(jié)果為真假在Scratch中,兩者的區(qū)別一目了然:前者是圓角矩形,后者則是六邊形(可以看到,字符的運(yùn)算也用圓角矩形來表示,本質(zhì)上,字符運(yùn)算也是算術(shù)運(yùn)算,計算機(jī)把字符轉(zhuǎn)換成數(shù)字進(jìn)行運(yùn)算后,再轉(zhuǎn)換回字符而已)。
關(guān)于算術(shù)表達(dá)式,相信不需要如何解釋,需要解釋的是邏輯表達(dá)式。我們知道,整個現(xiàn)代計算機(jī)的基礎(chǔ)是二進(jìn)制,而邏輯運(yùn)算的結(jié)果也只有兩個:真、假。邏輯運(yùn)算則有:與、或、非及其組合。實(shí)際上,任何算術(shù)運(yùn)算都可以轉(zhuǎn)換為邏輯運(yùn)算,當(dāng)然,這個已經(jīng)是大學(xué)二年級課程《數(shù)字電路》中的內(nèi)容了,這里,不展開,只是簡單解釋一下與、或、非運(yùn)算。
與(and):輸入是兩個及以上的邏輯判斷,當(dāng)所有邏輯判斷都為“真”時,與運(yùn)算結(jié)果為“真”,只要有一個邏輯判斷為“假”時,與運(yùn)算結(jié)果就為“假”。
或(or):跟與運(yùn)算的區(qū)別在于,只要有一個邏輯判斷為“真”,或運(yùn)算結(jié)果就為“真”,但是請注意,與運(yùn)算和或運(yùn)算并非相互為反運(yùn)算,因?yàn)楫?dāng)所有邏輯判斷都為“真”時,與運(yùn)算和或運(yùn)算的結(jié)果都是“真”。
非(not):把“真”的變成“假”的,“假”的說成“真”的。
關(guān)于Operators(表達(dá)式)的基本概念到此講完。遺憾的是,因?yàn)榧夹g(shù)原因,接下來,我只能用程序給出算術(shù)表達(dá)式的例子,而無法給出邏輯表達(dá)式的例子,當(dāng)然這會在下一節(jié)補(bǔ)上,因?yàn)橄乱还?jié),我們會進(jìn)入一個非常重要的基礎(chǔ)程序結(jié)構(gòu):條件分支。
例子很簡單,這次出場三只貓,Cat1和Cat2隨機(jī)報一個10以內(nèi)的數(shù),Cat3把兩個數(shù)乘起來,并報答案。三只貓對應(yīng)的代碼如圖。

簡單解釋一下程序,主要是兩個表達(dá)式:
1、pick random:意思就是產(chǎn)生一個隨機(jī)數(shù),例子中產(chǎn)生的是1到10的隨機(jī)數(shù)。
2、join:字符串拼接,字符串拼接是可以不斷嵌套使用的,這個例子中,假設(shè)x為2,y為5,那么,四個join的結(jié)果就是“2X5=10”。這種字符串拼接術(shù),無論在任何程序語言中,都是最常用的技巧之一。
給家長的話
這一節(jié)有不少的概念,而且非常重要。變量與常量(不變的值就是常量,Scratch里沒有常量的設(shè)置,那么我們可以認(rèn)為具體的數(shù)字就是一個常量,比如上面的think “” for 2 seconds,這個2就是一個常量)、全局變量與局部變量、表達(dá)式、算術(shù)表達(dá)式、邏輯表達(dá)式,邏輯“真”與邏輯“假”,邏輯運(yùn)算(與、或、非),雖然我把這些內(nèi)容壓縮進(jìn)了一節(jié),但是我希望家長可以花兩天(每天半小時)的時間幫助孩子去理解與消化。
參照我給的例子,我會給出如下實(shí)踐建議
實(shí)踐建議
-
增加變量,看到程序運(yùn)行中變量的變化;
-
提出問題,為什么變量的變化跟我們想象的不一樣;
-
新增加一個“For this sprite only”變量,通過前后區(qū)別,讓孩子初步明白全局變量和局部變量的區(qū)別;
-
鼓勵孩子自己做簡單的例子,能夠用到全局變量和局部變量;
-
解釋表達(dá)式的概念,可以按照Scratch編排的方式,簡單的解釋一下綠色圓角矩形程序塊(算術(shù)表達(dá)式)的概念,這里面有兩個比較難解釋的運(yùn)算,一是pick number,二是join。上面的內(nèi)容已經(jīng)做過解釋。
-
通過邏輯訓(xùn)練來幫助孩子理解基本的邏輯和邏輯預(yù)算,邏輯訓(xùn)練分為兩部分,一部分是邏輯真假判斷,可以提出幾個問題,例如,今天下雨了;現(xiàn)在是早上;30比50小(真),等等這些問題,讓孩子判斷真假。第二部分是邏輯運(yùn)算,首先是非運(yùn)算,非建議直接用數(shù)字比較來,比如,30>=50(假)的非運(yùn)算是30<50(真);其次是與運(yùn)算和或運(yùn)算,比如要表示40是否在一個數(shù)字區(qū)間范圍內(nèi),可以用40>30 and 40<50(真)、30>40 or 30 <20(假)這樣的表達(dá)式,可以直接幫助孩子無縫對接Scratch中的表達(dá)式。
-
最后,是讓孩子實(shí)現(xiàn)我最后給出的一個三只貓做計算題的例子,強(qiáng)烈建議先給孩子描述任務(wù),讓孩子自己嘗試去實(shí)現(xiàn),遇到問題再找參考,直至完成。編程是一項(xiàng)實(shí)踐性非常強(qiáng)的工作,眼高手低(看程序都明白,寫程序一句不會)是最容易發(fā)生的事情,只有讓孩子多動手,才會打下更好的基礎(chǔ)。?
五、Conditional Branch條件分支
Events事件按照Scratch對代碼積木的分類,我們這節(jié)涉及到Control和Events,但是如果按照一般程序語言的習(xí)慣,Scratch的Control模塊至少包含了兩塊重要的內(nèi)容。但是從邏輯關(guān)系來講,這一節(jié)要說的兩部分內(nèi)容關(guān)聯(lián)度略高一點(diǎn),所以我把Control模塊一切為二,其中一部分跟Events模塊一起,構(gòu)成這一節(jié)的內(nèi)容,剩余的一塊組成下一節(jié)的內(nèi)容。
Scratch團(tuán)隊?wèi)?yīng)該也是認(rèn)為Control和Events關(guān)聯(lián)度很大,所以積木塊都用了相近的顏色。事實(shí)上也是如此。
如果說前面兩節(jié)的內(nèi)容更多的是在講編程語言的基本元素,及在Scratch中的具體形態(tài),那么這一節(jié)和下一節(jié)其實(shí)是在講編程語言的基本骨架。骨架+元素構(gòu)成基本同時完整的可被執(zhí)行的代碼段。
至于這些代碼段如何組裝,構(gòu)造復(fù)雜的程序,這就是一步步不斷進(jìn)階的過程了。

1
?Conditional Branch條件分支
其實(shí),Scratch里,沒有任何一個地方會提到條件分支這樣的概念,只是用了Control,我理解這個本意就是說控制程序結(jié)構(gòu)或者說控制代碼走向的。然而,這樣的劃分雖然簡單,在我看來卻不夠,既然用到了這樣的概念,那何不講的清清楚楚明明白白呢?

Branch分支,是基于條件判斷的后續(xù)分叉,好比一條岔路口,上面的條件給出了我們要選擇哪條路,這里的分叉則指明不同道路的方向。幾乎所有的編程語言,條件分支都會用類似if-else的結(jié)構(gòu),Scratch也不例外。在Control類里,有兩個積木塊,實(shí)現(xiàn)了這樣的功能結(jié)構(gòu)。?
注意到兩個程序塊里面的六邊形了嗎?跟上一節(jié)中邏輯表達(dá)式一模一樣的六邊形,意義也很直觀,我們把一個邏輯表達(dá)式填入if程序塊的六邊形中,程序自己去對邏輯表達(dá)式進(jìn)行計算并判斷“真”與“假”,然后再按照編寫好的分支繼續(xù)下去。
”順便解釋一下為什么上一節(jié)對于邏輯表達(dá)式我沒有舉例子,因?yàn)檫壿嫳磉_(dá)式天然就是要跟條件判斷和分支(這里為什么把條件分支拆開,寫成條件判斷和分支,因?yàn)闂l件分支是個更小的概念,條件判斷和分支的形式有更多種,至少下一節(jié)中也會涉及到不同的形式)結(jié)合使用的,一個例子也必須講了條件分支后,才有更實(shí)際的意義。好,例子開始。上一節(jié),我們的例子是,兩只貓報數(shù),第三只貓做乘法報結(jié)果。這次我們修改一下,還是兩只貓報數(shù),但是第三只貓不再是做乘法,而是作為裁判,比較兩只貓報的數(shù)字的大小,并宣布結(jié)果。在這個例子中,Cat1與Cat2的代碼跟上一節(jié)的例子中一模一樣,這里就不再貼出來了,只給出不一樣的Cat3的代碼的截圖。?
不知道是不是錯覺,當(dāng)程序已這種形式構(gòu)架后,一下子覺得美感提升不止十倍。這種因?yàn)橛辛顺绦蚪Y(jié)構(gòu)的支撐,血肉都變得生動的感覺,讓我癡迷了幾十年。

需要對代碼做一些解釋,由于Scratch只給出了兩種條件分支的結(jié)構(gòu),而數(shù)字大小的比較結(jié)果則有三種:1贏、2贏、3打平,用兩種積木去實(shí)現(xiàn)三條岔路,美感多少打了折扣,這也是Scratch的不足之處,對于復(fù)雜的邏輯結(jié)構(gòu)雖然能夠?qū)崿F(xiàn),但是也極其復(fù)雜。
我們來分析這個邏輯結(jié)構(gòu)的實(shí)現(xiàn),首先,三種結(jié)果一定是排他的,一次只會有一種結(jié)果,對于Cat1來講,要么贏,要么輸,要么打平,對Cat2而言也是。理論上弄一個三岔路,問題就輕松解決,但是在沒有的情況下,我們只能分成兩步:第一步,先判斷Cat1有沒有贏,所以會有第一個if-else積木,里面的邏輯表達(dá)式是x>y,如果為“真”,那么很簡單,直接宣布結(jié)果。如果為“假”呢?為“假”的時候可能會有兩種情況,要么xy或者x=y,但是由于x>y在之前已經(jīng)被我們判斷過了,如果x>y為“真”的話,程序是不可能再來判斷x有點(diǎn)繞,但是邏輯就是如此。任何一段程序都是由各種邏輯構(gòu)架出來的,沒有邏輯的代碼就如同流水賬般記事的電影或小說,不僅沒有吸引力,更沒有意義。各種各樣的邏輯判斷和分支,構(gòu)建了程序的起承轉(zhuǎn)合。也許手誤打錯字是程序漏洞的原因之一,但是絕大多數(shù)的程序錯誤或者漏洞都是來自于對某種環(huán)境下邏輯構(gòu)架的不完整不嚴(yán)密造成的。

2
?Events事件
理解完了條件分支這個重要部分,我們花很短的時間過一下Events。在程序世界里,Events非常重要,而且豐富多彩。什么是Events,簡單說,就是某個事件發(fā)生了,那么什么是事件?事件是一個廣義的邏輯表達(dá)式。例如,“吃飯”事件,我們問Cat1:“你吃過了嗎?”,這是一個事件邏輯表達(dá)式,Cat1回答:“吃過了!”,代表前一個邏輯表達(dá)式運(yùn)算結(jié)果為“真”,“吃飯事件”發(fā)生了。然后呢?然后就進(jìn)入“吃飯事件”發(fā)生后的分支。Scratch中,最簡單最常用的就是When?green flag?clicked事件,也是我們程序一開始就接觸到的一個積木塊。完整的意義這里可以再解釋一下:通常情況下,我們每一個Sprite對象的代碼都寫在When?green flag?clicked之后,可以理解為這些代碼存在于這個事件的分支之內(nèi),當(dāng)我們點(diǎn)擊了程序結(jié)果展示區(qū)域的綠旗后,這些代碼就被執(zhí)行,而如果沒有點(diǎn)擊,這些代碼就不會得到執(zhí)行。這里,一個事件就是一個開關(guān),事件發(fā)生的邏輯判斷為“真”,則開關(guān)打開,分支內(nèi)的程序被執(zhí)行,如果事件沒發(fā)生,那么你可以當(dāng)作這些代碼不存在,如果事件永遠(yuǎn)沒發(fā)生,那么代碼就如同永遠(yuǎn)不存在。不僅僅在Events類別里面存在事件程序塊,其他類別里面也有,我把各個類別里的代碼塊羅列截圖。我們也可以仔細(xì)看他們的相同與區(qū)別。?
給家長的話
實(shí)踐建議
-
這一節(jié)其實(shí)就是講了條件分支,包括條件判斷、分支,并在此基礎(chǔ)上擴(kuò)展了Events事件的概念。
-
對于這一節(jié),如何去教小朋友,我建議是因人而異。每一個小朋友的年齡、知識儲備、興趣點(diǎn)都不盡相同,對于重要的邏輯的理解,在短短的半小時內(nèi)能夠給出的反應(yīng)也不會相同。
-
不必在開始的時候就說概念,就從我給出的數(shù)字比大小的例子開始,讓小朋友自己嘗試去解釋,如果能夠解釋,那說明本身理解了,這時候可以多講一些邏輯的概念;如果短時間內(nèi)解釋起來有困難,那不妨把程序一塊塊拆解來啟發(fā)式的解釋,Srcath對不同功能的程序塊顏色做了區(qū)分,這是個很好的功能,特別是在幫助小朋友理解上。
-
正如同,學(xué)數(shù)學(xué)要先會數(shù)數(shù),學(xué)英語要先認(rèn)識字母一樣,學(xué)程序,也得先理解一些邏輯、條件分支以及其他一些概念,我相信一個大班或者小學(xué)低年級的孩子理解這些不是難事,需要的只是耐心。程序世界很大,孩子未來也很長,一點(diǎn)點(diǎn)來,不去跟別人比,跟自己比就夠了。
-
關(guān)于事件,我不建議教孩子太多,就用我的例子讓他們有個直觀感受就好了。我之所以要在這一節(jié)寫事件,一是從完整性來說,要有,二是以后其實(shí)會用到。但是在理解了條件分支后,事件并不難,至少在Scratch中不難,用到了就會了。
六、循環(huán)
終于到循環(huán)了。Scratch很有意思,編內(nèi)容,做例子也很好玩。但是碼字太痛苦了,整理格式太費(fèi)神了。好在,能夠自由發(fā)揮的介紹循環(huán),就都不是事情了。循環(huán)當(dāng)然很重要,更重要的是,把循環(huán)講完,程序世界的自由大門也就打開大半了。
人類為什么要發(fā)明計算機(jī)、設(shè)計編程語言,最初的目的是因?yàn)橐M(jìn)行科學(xué)計算,因?yàn)榭茖W(xué)計算需要大量的復(fù)雜的,重復(fù)的運(yùn)算過程靠人做,耗時而且容易出錯。于是靠程序來完成,雖然對于很多計算,程序也要耗費(fèi)大量的時間,但是:一、總比人力計算來的快;二、只要程序沒錯,結(jié)果就基本不錯;三、可以無上限的重復(fù)。這里的重復(fù)有兩重含義,一是程序?qū)懞昧耍赡軛l件變了,環(huán)境變了,需要重新計算,隨時可以;二是,程序內(nèi)部,本身也需要許多重復(fù),這個也能比較容易的實(shí)現(xiàn),而實(shí)現(xiàn)這個,靠的就是這一節(jié)要講的:循環(huán)。上一節(jié)提到過,在程序語言里,循環(huán)與條件分支共同構(gòu)成一個程序的骨架。所以,在Scratch中,設(shè)計者將循環(huán)與條件分支共同放入了Control類別中。那么什么是循環(huán):簡單說,不簡單的重復(fù)叫做循環(huán)。正是這種不簡單的重復(fù),與條件分支一起構(gòu)成了五彩繽紛的程序世界。先看Scratch提供的循環(huán)相關(guān)的程序塊,主要是三個很顯然,如果不按下紅色八邊形按鈕讓程序終止,貓會不斷的報數(shù)報下去。第二個例子,還記得我們在前幾節(jié)里面用到兩只貓一邊打招呼一邊互相靠近的例子嗎?我們用repeat修改一下,讓程序在功能相同的前提下,看起來更好看一點(diǎn)。
第三個例子,我們想讓貓做一個累加法,比如像當(dāng)初的高斯一樣,去計算1加到10或者1加到100,我們很容易想到可以用repeat 10或者repeat 100這樣的結(jié)構(gòu)。這里,我們嘗試換種思路,用repeat until的結(jié)構(gòu)。
需要解釋一下repeat until循環(huán)。可以看到這個循環(huán)里面有一個綠色六邊形的邏輯表達(dá)式,我們不妨稱之為條件循環(huán),每一次執(zhí)行循環(huán)體(在循環(huán)程序塊里面被包裹的程序我們叫做循環(huán)體)之前,程序都要對綠色六邊形的邏輯表達(dá)式進(jìn)行邏輯判斷,如果為“假”則執(zhí)行,如果為“真”呢?那么循環(huán)直接結(jié)束,循環(huán)體內(nèi)的代碼不被執(zhí)行。在這個例子里面,每一輪循環(huán)的時候,程序都要去比較一下x與100的大小,當(dāng)x<=100時,循環(huán)不斷得到執(zhí)行,我們看到的就是s變量每一次都被加上x,x每一次都被加上1。當(dāng)最后一次x=101時,條件判斷產(chǎn)生了“真”的結(jié)果,循環(huán)結(jié)束,貓直接報出答案(可以看到s最后加的數(shù)字是100,而不是101)。本節(jié)最后一個例子,我們要講循環(huán)的嵌套,什么叫循環(huán)的嵌套?循環(huán)里面加循環(huán),就叫嵌套(其實(shí),我們在上一節(jié)介紹條件分支時,已經(jīng)用到了嵌套,為了表示出“>、=、<”三種條件,我們在一個條件分支內(nèi)又加入了條件分支)。程序里,循環(huán)嵌套是非常常用的。一個簡單又應(yīng)景的例子是,我們讓貓背誦乘法口訣如何?
這里,就需要講一個順序概念,我們看到了循環(huán)嵌套,但是哪個循環(huán)先被執(zhí)行呢?從程序來看,不難發(fā)現(xiàn)是內(nèi)層的先被執(zhí)行。每一次內(nèi)層的被執(zhí)行完,退出后,回到外層的循環(huán)體,然后再重新進(jìn)入內(nèi)層,再退出,再重新開始。所以,在這個程序里面,x被加了9次,y呢?被加了9+8+7+6+5+4+3+2+1次。所以最后的結(jié)果呢?如果細(xì)心一點(diǎn),我們會發(fā)現(xiàn)當(dāng)貓把乘法口訣背完以后,x是10,y也是10。因?yàn)檫@是兩個循環(huán)都結(jié)束的條件(>9),但是在程序最后用綠色橢圓圈住來的代碼,我把x、y都設(shè)回了9,為什么?對小孩子來說,看到x是10,y是10,但是積(product)卻是81,大概率會產(chǎn)生誤導(dǎo)。所以我加了兩句對程序沒有任何影響的語句。我想,這也是一種簡單的user friendly吧,而對于程序來講,功能完整準(zhǔn)確,user friendly都應(yīng)該是追求的目標(biāo)。
給家長的話
實(shí)踐建議
-
這一節(jié),對于家長如何與小朋友共同嘗試,我沒有特別的建議,按照例子走就好了。循環(huán)當(dāng)然是很重要的概念,循環(huán)也非常難,但是基礎(chǔ)的內(nèi)容,在Scratch里,其實(shí)就是這些,更重要的是小朋友在自己動手的嘗試中理解了這些概念,并會應(yīng)用。
-
這節(jié)結(jié)束,Scratch,或者說一個編程語言的最基礎(chǔ)的概念,就告一段落了。編程是一個實(shí)踐性非常強(qiáng)的學(xué)科。從小到大學(xué)了這么多語言,也參加了大大小小的考試或者比賽,從沒有任何一次會來問循環(huán)的概念是什么,只會有兩種形式,一種是給出一段代碼,讓你寫出運(yùn)行結(jié)果,一種是給出一個問題,讓你寫出代碼。只有不斷積累的實(shí)踐,才能讓我們更加知道計算機(jī)是怎么想的,也才能更容易的讓計算機(jī)實(shí)現(xiàn)我們想要的。
-
后面四節(jié),按照我的定義,才算是
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時和我們聯(lián)系刪除

- 上一篇
Scratch全國少兒編程競賽獲獎作品《時空穿越》解析上篇
Scratch全國少兒編程競賽 獲獎作品解析 《時空穿越》 本文介紹的作品是全國青少年創(chuàng)意編程與智能設(shè)計大賽創(chuàng)意編程比賽一等獎獲得者江夷越同學(xué)的最新參賽作品。 作品說明 一位天才創(chuàng)造了許多發(fā)明,其中最強(qiáng)大的就是時空傳
- 下一篇
52用scratch實(shí)現(xiàn)閃卡拼單詞
單詞輕松記,閃卡來幫忙。 第一步下載腳本文件。 https://pan.baidu.com/s/1gtjT_VF1OgKNJryR_ynPsA 第二步打開腳本文件。