国产日韩欧美一区二区三区综合,日本黄色免费在线,国产精品麻豆欧美日韩ww,色综合狠狠操

極客小將

您現在的位置是:首頁 » scratch編程資訊

資訊內容

朋友圈的親子編程課——Scratch第一期全集

極客小將2020-12-18-
前言
upload/article/images/2020-12-18/3e25948b1045c9fa4c7f541810297385.jpg前言upload/article/images/2020-12-18/c08791a9a4e616b3e6cc18bcfea37f04.jpg

在夏天開始之前,我設想用一段較長的時間,做一些跟編程教學有關的事情。經過一個夏天的斷斷續續的思考與準備,我決定從這個起點開始,這個起點,我稱之為——《朋友圈的親子編程課》。

(四年多前注冊這個公眾號的時候,原意只是發一些跟拍照、跟市場有關的內容。如今,似乎離初衷已經有了一段距離,但還是決定不去更名,跟我相關的東西,屬于我的,看到的,想到的,可以分享的,挺好。就是在這第一篇枯燥的文字里,穿插一些過去歲月中與花花草草相關的照片有一些扣題,更有一些自己還想留存的風格。)

upload/article/images/2020-12-18/fa2f829a540b94846c55884f63b30b4b.jpg

感謝鋪天蓋地的人工智能對未來“恐怖前景”的描述,這兩年來,很多朋友會在不同的場合問到我關于編程學習的事情,我也會主動的跟身邊朋友交流一些程序的問題。當然,因為社會渲染和自身職業的關系,Python成為毫無疑問的頻度最高的關鍵詞。
甚至,在我嘗試引導自己九歲女兒編程興趣的開始,我也選擇了Python。當然,這是一個挺失敗的選擇,簡單的文字界面與枯燥的概念,自然無法引起一個低年級小學生足夠的關注度。有意思的反轉是,女兒在學校接觸到了Scratch,并且主動要求我教她。在自己斷斷續續的嘗試及與她的互動后,我開始了認真的備課,編排內容、設計例子,并在八月用了近兩周的時間,對女兒進行了教學,效果是:我想要灌輸的關于程序的基本概念都被毫無抵抗的接受了;即使有一些復雜的例子也被完全理解并得到擴展;她開始希望我教一些更難的例子或者,一門新的語言,例如Python,或者BASIC。upload/article/images/2020-12-18/7b743ff35ada4f604aebb5e1751bb650.jpg?

三十年前的起步,一臺叫做Laser310的“電腦”,我用的版本只能使用BASIC程序,功能還弱于稍晚幾年風靡的“小霸王學習機”。由于程序不能保存,每次開機都要從自己厚厚的手抄程序本中找出一段代碼,敲進去,再運行。最大的好處是,從小就建立了良好的盲打基礎。

回顧自己差不多三十年前開始接觸編程至今,唏噓時代變遷:我那時候從認識二十六個英文字母開始,而如今簡單的英語對八九歲的孩子來講毫無壓力;我那時候懵懵懂懂的從BASIC開始是毫無疑問的唯一選擇,而如今的選擇多了太多太多。更有許許多多不變的,是那個我們一直稱為程序思維,看得見、摸得著,卻很難簡單定義的存在。也許誕生于互聯網高速發展之前的“史前”程序員,如我,都有一種潔癖般的固執,一種對于數據、結構、算法,面向過程、面向對象這些概念朝圣般的偏執。一個最大的負面效果就是,當朋友問我,如何從零基礎起步,我總會想很多,然后給不出答案。一如已經花去了我超過一個禮拜時間的風格迥異的前六個版本前言。upload/article/images/2020-12-18/bde9bfd89e418b40c9d6c8e4a2e78a12.jpg也許,重要的只是開始,而不是如何開始吧。所以,我決定這一定是最后一個版本的前言了。因為早已整理好的內容,如同整裝待發卻始終聽不到出發汽笛聲的一節節車皮一樣,孤獨的在角落里,落寞了很久。upload/article/images/2020-12-18/c4145b2568dc2aef5c933702cd5e2d1b.jpg呼應前段,我把從現在開始,大約持續兩周時間的課程,叫做《朋友圈的親子編程課》,選用的語言是Scratch。面向三類對象。

第一類對象

朋友圈里的父母

哪怕只有很短的時間,但是通過自己學習、整理、陪伴,輸出給孩子,再得到反饋的過程,感覺真的很美妙。


第二類對象

那些“零基礎”朋友

雖然內容看起來并不會很復雜,與傳統理解的寫代碼也有些許差別,但是,我確實很認真的把我對程序入門的理解與更有趣的皮囊放在了一起,半個月的收獲,不會比學習任何其他一門語言小。

第三類對象

尋找可能性的朋友

在我使用Scratch過程中,我發現了很多有意思的可能性,所以,第三類,姑且叫做尋找可能性的朋友。


簡單講幾個問題,然后,鳴汽笛,啟動。

1為什么用Scratch起步

upload/article/images/2020-12-18/3f72b20cd4868da6fd26ef812c2791da.jpg

對孩子來說,我們都知道,興趣是第一重要的,而第二重要的是學習階梯。如果倒推十年二十年,正如我的經歷一樣,也許我們沒有其他選擇,都需要從BASIC/PASCAL/C語言開始。然而放到如今,我們多了另一類選擇,被稱為積木式編程(Block-Based Coding),相對的,之前說的那些語言,稱為文本式編程(Text-Based Coding)。相對于傳統的文本式編程,積木式編程界面漂亮、娛樂性強的特點非常適合小朋友入門,另外,在Python、JavaScript等語言大行其道的當下,積木式編程反而擁有了更清晰的程序結構、邏輯關系,這些,對于建立初步的程序思維,都大有益處。

即使是“零基礎”的成人,花一點點時間來熟悉和學習一下Scratch,也是有益無害。更擴展一下,Scratch本身非常適合做動畫、交互等,那么做個有意思的PPT、動畫,甚至一些簡單的演示或者教學,也是非常合適的。

2
教什么?

upload/article/images/2020-12-18/3b09b24e3cb7343fac1717baac468b19.jpg

第一期的《朋友圈的親子編程課》分為十節,大概兩周推送完畢。在后面的實際內容中,我按照Scratch的功能設置與特點,結合自己在這個年齡起步時的經驗,進行組織。編排上,概念、簡單原理、例子、動手實踐,這些環節都會涉及。我的目標也很明確:第一期課完成后,第一個層次,掌握了一些程序的基本概念、Scratch的基本功能、簡單組合,能夠編寫一些中等復雜的例子;第二個層次,這時候可以有個選擇,Scratch進階,或者學習一門文本式編程語言,因為關于程序的基本概念已經有了,所以,學習一門文本式編程語言,起步不是太難的事情。

3
怎么學?

upload/article/images/2020-12-18/d9067cec29f7b09ac2eeb75a0da8d45c.jpg

就親子編程目標而言,我建議家長朋友能夠每天花一點時間做三件事情:

upload/article/images/2020-12-18/e7feee0a9240494470d40fa5a001cddf.jpg

1、看完我寫的內容

2、自己動手實踐

3、陪伴并帶著孩子一起實踐

編程的實踐性非常強,只有不斷的嘗試,才能有提高。

親子共同學習、實踐,意義也不僅僅在于樹立榜樣、培養興趣。小朋友的想象力是驚人的,程序世界是自由的,當這兩個世界碰撞之后,我們可以得到很多難以想象的啟發,而這種啟發,沒有陪伴,是很難獲得的。

4
我的角色

upload/article/images/2020-12-18/0c67f06d610ddd2a3ba2254256d39866.jpg

為什么叫《朋友圈的親子編程課》,與我自己的角色定位有關,我的角色就是朋友。與朋友分享、看下一代成長,是兩大趣事,結合起來,做一個更有意義的趣事。

為什么是朋友,一是有什么問題,可以隨時聯系到我二是,我有什么新想法也可以隨時被看到,都是簡單直接的方式,省心。

當然,借助于強大的線上資源,我也會利用各種工具來提升效果、提高效率,這個可以以后慢慢分享。

5下一步的計劃

upload/article/images/2020-12-18/54f1b4defb98921022155805a546f457.jpg

在之前的每一個被我否定掉的前言的版本里,都會有一大堆關于規劃的內容。可是正如之前所言,開始才是最重要的,也許以后會有類似于《朋友圈的編程課》、《朋友圈的Python從入門到放棄》、《朋友圈的好玩的BASIC》出現,但是,沒有現在開始的一步一步,又何談未來,一切,慢慢來。

終于確定,這是一個最終面世版的前言了,在比原計劃整整晚了一個禮拜的時候。

恍惚間,又一個夏日終了,魔都也難得在連綿不斷的大中小雨后,展現出藍天白云下獨特的魅力。紛擾的世界、煩亂的內心,都因開學季的到來,都因生命中數十個夏日、秋天的情緒切換,慢慢悸于平靜。

upload/article/images/2020-12-18/1192aefa87b20b964289e49e0076b770.jpg?upload/article/images/2020-12-18/f01afc59ffc38c60f79425540640ec0e.jpg?

From the ground up,我們開始吧。

upload/article/images/2020-12-18/4d1ad9a793b7aac360c61d49165e6721.jpg?二、Scratch

? ?Hello,World!

從這一節開始,正式進入內容,這一節會先有一個Scratch的基本介紹,然后是,對于多數純Scratch課程而言很奇怪,但是對于程序世界很有儀式感的歡迎詞:Hello,World!

我說過,我是個很固執的“史前”生物。

1upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.jpg背景介紹

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

訪問https://scratch.mit.edu,就是Scratch的官方網站。

我并沒有接觸過Scratch的前兩個大版本,所以也不清楚以前是什么樣子的,但如今,就是一個標準的社區模樣。開源、在線文檔、社區,程序員三大寶,一個不缺。對了,Scratch是開源的,雖然對絕大多數使用者來說,這個根本不重要,但是它確實給了市面上不少“改裝版”存活基礎和空間,考慮到我是一個徹頭徹尾的“原創主義者”,所以,在學習過程中,我只推薦原版。另一個只推薦原版的理由是:Scratch的作用是啟蒙加基礎入門,這個階段,編程最重要的是基本思想的建立,每一種語言都有其適用范圍和局限性,Scratch當然不例外。

upload/article/images/2020-12-18/097ef996d062befdd981b85733f622f4.jpg?

“改裝版”或許在某些方面改進了一些不足,甚至提供了更多更靈活的功能,但是否會破壞原有的體系和編程語言背后基礎而貫穿的邏輯,就不得而知了。

2upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.jpg各種資源

目前,線上已經有大量的Scratch資源存在。

01?

官方網站

02?

Scratch Wiki

03?

第三方

首先,最大的資料來源就是官方網站,除了提供編程實踐的平臺之外,還可以通過訪問社區、支持板塊獲取足夠的相關信息。其中,最大的特色是網站上有來自全球用戶分享的Scratch項目,既可以直接看到結果(游戲、故事、動畫,等等),也可以查看源代碼,吸取別人的智慧。

其次,推薦Scratch?Wiki?(https://en.scratch-wiki.info/wiki/Scratch_Wiki_Home),這個百科網站最早與Scratch開發團隊并沒有關聯,后幾經易手,曾經由Scratch開發團隊維護。如今,為了更好的服務于Scratch用戶,該網站已經轉由第三方組織維護,但是Scratch開發團隊依然提供大量的支持。

upload/article/images/2020-12-18/32d971c4a5f5215b05844391c6eabd10.jpg?

一點一滴,交待的清清楚楚。當我決定啟動編程課程的時候,最大的挑戰來自于內心:我如何能夠長期的做下去?在這個目標下,會有許許多多不同的選擇,有那么一點點是已經做了的,還有許多是尚未面對的。一點一滴,慢慢來吧。

第三,通過搜索引擎能夠搜索到許多自媒體的資源,包括公眾號,博客等,也有不少的用戶會把自己的項目匯集起來,做成課程。對一些感興趣的目標,搜索相關資源,查看別人的代碼,是重要的學習。

upload/article/images/2020-12-18/bdc26b178946f78f05446b7152c2a351.jpg

寫代碼,大概永遠是這么一個過程:學概念、學例子、模仿、改進,到自創。學習別人的經驗,分享自己的收獲,這是開源最樸素的想法,也是程序員自由世界的基礎。

3upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.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的屬性進行編輯,例如位置,大小,方向,等等。

upload/article/images/2020-12-18/bdc26b178946f78f05446b7152c2a351.jpg

對于Sprite的準確意思。在我的理解過程中也廢了些周折,開始時候,我本能的將之與對象聯系起來。甚至在這一節的初稿里我還專門寫了一段對于對象的簡單解釋。但是,實際上,Sprite是一個不同于對象的專有名詞,是動畫、游戲編程中最基本的存在。再一次為自己的淺薄暗自檢討的同時,尊重開發者的本來意愿,懷著敬畏的心態繼續使用Sprite的稱呼,并簡單翻譯成中文意思:精靈。

在后面章節的初稿里,仍有大段的關于Sprite的個人理解,我會保留自己原本的寫法,并加入業內通用的理解。

6是Stage,場景編輯區??梢约尤氩煌谋尘埃瑘鼍耙部梢詥为毦幋a,獲得不少炫酷有趣的效果。

4upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.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”選項。區域1、4、5,加上標記的兩個部分,就是這一節的主要內容,當然,編碼區,每一次都跑不掉,所以,不特別說了。

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),大?。⊿ize)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/Public/Home/images/grey.gif

給家長的話

如前言所述,這個課程我第一類面向的對象就是家長朋友。為什么叫親子編程課,我的想法是親子共同來“玩”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載體上的程序思維的入門,所以,內容會是以下呈現的樣子。

這一節內容非常多,我覺得兩天的時間來學習是合適的。

https://cdn.china-scratch.com/timg/190923/112H44919-45.jpg?

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/Public/Home/images/grey.gif

給家長的話

這一節有不少的概念,而且非常重要。變量與常量(不變的值就是常量,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中的具體形態,那么這一節和下一節其實是在講編程語言的基本骨架。骨架+元素構成基本同時完整的可被執行的代碼段。

至于這些代碼段如何組裝,構造復雜的程序,這就是一步步不斷進階的過程了。

https://cdn.china-scratch.com/timg/190923/112H44919-45.jpg?

1

?Conditional Branch條件分支

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

upload/article/images/2020-12-18/c4145b2568dc2aef5c933702cd5e2d1b.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

有點繞,但是邏輯就是如此。任何一段程序都是由各種邏輯構架出來的,沒有邏輯的代碼就如同流水賬般記事的電影或小說,不僅沒有吸引力,更沒有意義。各種各樣的邏輯判斷和分支,構建了程序的起承轉合。也許手誤打錯字是程序漏洞的原因之一,但是絕大多數的程序錯誤或者漏洞都是來自于對某種環境下邏輯構架的不完整不嚴密造成的。

https://cdn.china-scratch.com/timg/190923/112H44919-45.jpg?

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

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/Public/Home/images/grey.gif

給家長的話

實踐建議

  • 這一節其實就是講了條件分支,包括條件判斷、分支,并在此基礎上擴展了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)。本節最后一個例子,我們要講循環的嵌套,什么叫循環的嵌套?循環里面加循環,就叫嵌套(其實,我們在上一節介紹條件分支時,已經用到了嵌套,為了表示出“>、=、<”三種條件,我們在一個條件分支內又加入了條件分支)。程序里,循環嵌套是非常常用的。一個簡單又應景的例子是,我們讓貓背誦乘法口訣如何?

https://cdn.china-scratch.com/Public/Home/images/grey.gif

解釋一下代碼,首先,一個乘法包含三個數:乘數、被乘數、積。分別用變量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,或者說一個編程語言的最基礎的概念,就告一段落了。編程是一個實踐性非常強的學科。從小到大學了這么多語言,也參加了大大小小的考試或者比賽,從沒有任何一次會來問循環的概念是什么,只會有兩種形式,一種是給出一段代碼,讓你寫出運行結果,一種是給出一個問題,讓你寫出代碼。只有不斷積累的實踐,才能讓我們更加知道計算機是怎么想的,也才能更容易的讓計算機實現我們想要的。

  • 后面四節,按照我的定義,才算是

    聲明:本文章由網友投稿作為教育分享用途,如有侵權原作者可通過郵件及時和我們聯系刪除

預約試聽課

已有385人預約都是免費的,你也試試吧...

主站蜘蛛池模板: 达孜县| 安泽县| 伊宁县| 会东县| 汨罗市| 仁寿县| 文登市| 新宁县| 邵阳市| 舒兰市| 静宁县| 进贤县| 策勒县| 常山县| 丰原市| 花莲市| 南丰县| 广安市| 休宁县| 阿克陶县| 龙山县| 大关县| 修武县| 博兴县| 临城县| 新河县| 沙雅县| 桑植县| 如东县| 巴南区| 灵石县| 蓝田县| 南京市| 贞丰县| 双鸭山市| 嘉义市| 博乐市| 常熟市| 济源市| 东丰县| 扎赉特旗|