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

極客小將

您現(xiàn)在的位置是:首頁(yè) » scratch編程資訊

資訊內(nèi)容

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

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

在夏天開(kāi)始之前,我設(shè)想用一段較長(zhǎng)的時(shí)間,做一些跟編程教學(xué)有關(guān)的事情。經(jīng)過(guò)一個(gè)夏天的斷斷續(xù)續(xù)的思考與準(zhǔn)備,我決定從這個(gè)起點(diǎn)開(kāi)始,這個(gè)起點(diǎn),我稱之為——《朋友圈的親子編程課》。

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

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

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

三十年前的起步,一臺(tái)叫做Laser310的“電腦”,我用的版本只能使用BASIC程序,功能還弱于稍晚幾年風(fēng)靡的“小霸王學(xué)習(xí)機(jī)”。由于程序不能保存,每次開(kāi)機(jī)都要從自己厚厚的手抄程序本中找出一段代碼,敲進(jìn)去,再運(yùn)行。最大的好處是,從小就建立了良好的盲打基礎(chǔ)。

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

第一類對(duì)象

朋友圈里的父母

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


第二類對(duì)象

那些“零基礎(chǔ)”朋友

雖然內(nèi)容看起來(lái)并不會(huì)很復(fù)雜,與傳統(tǒng)理解的寫代碼也有些許差別,但是,我確實(shí)很認(rèn)真的把我對(duì)程序入門的理解與更有趣的皮囊放在了一起,半個(gè)月的收獲,不會(huì)比學(xué)習(xí)任何其他一門語(yǔ)言小。

第三類對(duì)象

尋找可能性的朋友

在我使用Scratch過(guò)程中,我發(fā)現(xiàn)了很多有意思的可能性,所以,第三類,姑且叫做尋找可能性的朋友。


簡(jiǎn)單講幾個(gè)問(wèn)題,然后,鳴汽笛,啟動(dòng)。

1為什么用Scratch起步

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

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

即使是“零基礎(chǔ)”的成人,花一點(diǎn)點(diǎn)時(shí)間來(lái)熟悉和學(xué)習(xí)一下Scratch,也是有益無(wú)害。更擴(kuò)展一下,Scratch本身非常適合做動(dòng)畫、交互等,那么做個(gè)有意思的PPT、動(dòng)畫,甚至一些簡(jiǎn)單的演示或者教學(xué),也是非常合適的。

2
教什么?

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

第一期的《朋友圈的親子編程課》分為十節(jié),大概兩周推送完畢。在后面的實(shí)際內(nèi)容中,我按照Scratch的功能設(shè)置與特點(diǎn),結(jié)合自己在這個(gè)年齡起步時(shí)的經(jīng)驗(yàn),進(jìn)行組織。編排上,概念、簡(jiǎn)單原理、例子、動(dòng)手實(shí)踐,這些環(huán)節(jié)都會(huì)涉及。我的目標(biāo)也很明確:第一期課完成后,第一個(gè)層次,掌握了一些程序的基本概念、Scratch的基本功能、簡(jiǎn)單組合,能夠編寫一些中等復(fù)雜的例子;第二個(gè)層次,這時(shí)候可以有個(gè)選擇,Scratch進(jìn)階,或者學(xué)習(xí)一門文本式編程語(yǔ)言,因?yàn)殛P(guān)于程序的基本概念已經(jīng)有了,所以,學(xué)習(xí)一門文本式編程語(yǔ)言,起步不是太難的事情。

3
怎么學(xué)?

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

就親子編程目標(biāo)而言,我建議家長(zhǎng)朋友能夠每天花一點(diǎn)時(shí)間做三件事情:

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

1、看完我寫的內(nèi)容

2、自己動(dòng)手實(shí)踐

3、陪伴并帶著孩子一起實(shí)踐

編程的實(shí)踐性非常強(qiáng),只有不斷的嘗試,才能有提高。

親子共同學(xué)習(xí)、實(shí)踐,意義也不僅僅在于樹(shù)立榜樣、培養(yǎng)興趣。小朋友的想象力是驚人的,程序世界是自由的,當(dāng)這兩個(gè)世界碰撞之后,我們可以得到很多難以想象的啟發(fā),而這種啟發(fā),沒(méi)有陪伴,是很難獲得的。

4
我的角色

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

為什么叫《朋友圈的親子編程課》,與我自己的角色定位有關(guān),我的角色就是朋友。與朋友分享、看下一代成長(zhǎng),是兩大趣事,結(jié)合起來(lái),做一個(gè)更有意義的趣事。

為什么是朋友,一是有什么問(wèn)題,可以隨時(shí)聯(lián)系到我二是,我有什么新想法也可以隨時(shí)被看到,都是簡(jiǎn)單直接的方式,省心。

當(dāng)然,借助于強(qiáng)大的線上資源,我也會(huì)利用各種工具來(lái)提升效果、提高效率,這個(gè)可以以后慢慢分享。

5下一步的計(jì)劃

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

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

終于確定,這是一個(gè)最終面世版的前言了,在比原計(jì)劃整整晚了一個(gè)禮拜的時(shí)候。

恍惚間,又一個(gè)夏日終了,魔都也難得在連綿不斷的大中小雨后,展現(xiàn)出藍(lán)天白云下獨(dú)特的魅力。紛擾的世界、煩亂的內(nèi)心,都因開(kāi)學(xué)季的到來(lái),都因生命中數(shù)十個(gè)夏日、秋天的情緒切換,慢慢悸于平靜。

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

From the ground up,我們開(kāi)始吧。

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

? ?Hello,World!

從這一節(jié)開(kāi)始,正式進(jìn)入內(nèi)容,這一節(jié)會(huì)先有一個(gè)Scratch的基本介紹,然后是,對(duì)于多數(shù)純Scratch課程而言很奇怪,但是對(duì)于程序世界很有儀式感的歡迎詞:Hello,World!

我說(shuō)過(guò),我是個(gè)很固執(zhí)的“史前”生物。

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

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

訪問(wèn)https://scratch.mit.edu,就是Scratch的官方網(wǎng)站。

我并沒(méi)有接觸過(guò)Scratch的前兩個(gè)大版本,所以也不清楚以前是什么樣子的,但如今,就是一個(gè)標(biāo)準(zhǔn)的社區(qū)模樣。開(kāi)源、在線文檔、社區(qū),程序員三大寶,一個(gè)不缺。對(duì)了,Scratch是開(kāi)源的,雖然對(duì)絕大多數(shù)使用者來(lái)說(shuō),這個(gè)根本不重要,但是它確實(shí)給了市面上不少“改裝版”存活基礎(chǔ)和空間,考慮到我是一個(gè)徹頭徹尾的“原創(chuàng)主義者”,所以,在學(xué)習(xí)過(guò)程中,我只推薦原版。另一個(gè)只推薦原版的理由是:Scratch的作用是啟蒙加基礎(chǔ)入門,這個(gè)階段,編程最重要的是基本思想的建立,每一種語(yǔ)言都有其適用范圍和局限性,Scratch當(dāng)然不例外。

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

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

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

目前,線上已經(jīng)有大量的Scratch資源存在。

01?

官方網(wǎng)站

02?

Scratch Wiki

03?

第三方

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

其次,推薦Scratch?Wiki?(https://en.scratch-wiki.info/wiki/Scratch_Wiki_Home),這個(gè)百科網(wǎng)站最早與Scratch開(kāi)發(fā)團(tuán)隊(duì)并沒(méi)有關(guān)聯(lián),后幾經(jīng)易手,曾經(jīng)由Scratch開(kāi)發(fā)團(tuán)隊(duì)維護(hù)。如今,為了更好的服務(wù)于Scratch用戶,該網(wǎng)站已經(jīng)轉(zhuǎn)由第三方組織維護(hù),但是Scratch開(kāi)發(fā)團(tuán)隊(duì)依然提供大量的支持。

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

一點(diǎn)一滴,交待的清清楚楚。當(dāng)我決定啟動(dòng)編程課程的時(shí)候,最大的挑戰(zhàn)來(lái)自于內(nèi)心:我如何能夠長(zhǎng)期的做下去?在這個(gè)目標(biāo)下,會(huì)有許許多多不同的選擇,有那么一點(diǎn)點(diǎn)是已經(jīng)做了的,還有許多是尚未面對(duì)的。一點(diǎn)一滴,慢慢來(lái)吧。

第三,通過(guò)搜索引擎能夠搜索到許多自媒體的資源,包括公眾號(hào),博客等,也有不少的用戶會(huì)把自己的項(xiàng)目匯集起來(lái),做成課程。對(duì)一些感興趣的目標(biāo),搜索相關(guān)資源,查看別人的代碼,是重要的學(xué)習(xí)。

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

寫代碼,大概永遠(yuǎn)是這么一個(gè)過(guò)程:學(xué)概念、學(xué)例子、模仿、改進(jìn),到自創(chuàng)。學(xué)習(xí)別人的經(jīng)驗(yàn),分享自己的收獲,這是開(kāi)源最樸素的想法,也是程序員自由世界的基礎(chǔ)。

3upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.jpg界面

?https://scratch.mit.edu/

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

Scratch界面可以是中文的,甚至于程序模塊都可以中文顯示,但是,幾乎所有主流程序語(yǔ)言都是英文的,學(xué)習(xí)資料許多也是英文的,為了更好的與未來(lái)銜接,還是強(qiáng)烈建議從現(xiàn)在開(kāi)始全程使用英文。

Scratch首頁(yè)的界面主要有以下幾部分內(nèi)容:

藍(lán)色菜單條部分:

左上角分別是Scratch圖標(biāo),點(diǎn)擊進(jìn)入首頁(yè);

Create,無(wú)論有沒(méi)有注冊(cè)賬號(hào)并登陸,點(diǎn)擊就可以進(jìn)入一個(gè)新的項(xiàng)目界面;Explore,看看其他用戶都分享了哪些有趣的程序;

Ideas,有一些入門教程和主題導(dǎo)引;

右邊,就是跟賬號(hào)有關(guān)了,建議開(kāi)始的時(shí)候就注冊(cè)一個(gè)賬號(hào),最大的好處是所有編輯的項(xiàng)目和代碼都會(huì)保存下來(lái),還可以修改,分享。

頁(yè)面主體就是一些用戶分享的項(xiàng)目,出于興趣,可以自由瀏覽、參考。

直接點(diǎn)擊Create,進(jìn)入一個(gè)新建項(xiàng)目,經(jīng)過(guò)一段時(shí)間的加載等待(取決于網(wǎng)速),就進(jìn)入了程序設(shè)計(jì)界面。?

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

可以看到,整個(gè)工作區(qū)被劃分為四大區(qū)域。

12是代碼模塊區(qū),其中1是代碼類別選區(qū),2是代碼塊選區(qū)。Scratch編程是不需要手寫代碼的,所有的代碼都靠積木塊組合實(shí)現(xiàn)。

3是編碼區(qū),把2中的代碼塊拖拽入3區(qū)域,并加以組合,就是Scratch的編碼過(guò)程。

4為預(yù)覽區(qū),可以隨時(shí)看到代碼運(yùn)行的結(jié)果。默認(rèn)模式下,預(yù)覽區(qū)顯示了一只貓。

5是Sprite編輯區(qū),可以對(duì)Sprite的屬性進(jìn)行編輯,例如位置,大小,方向,等等。

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

對(duì)于Sprite的準(zhǔn)確意思。在我的理解過(guò)程中也廢了些周折,開(kāi)始時(shí)候,我本能的將之與對(duì)象聯(lián)系起來(lái)。甚至在這一節(jié)的初稿里我還專門寫了一段對(duì)于對(duì)象的簡(jiǎn)單解釋。但是,實(shí)際上,Sprite是一個(gè)不同于對(duì)象的專有名詞,是動(dòng)畫、游戲編程中最基本的存在。再一次為自己的淺薄暗自檢討的同時(shí),尊重開(kāi)發(fā)者的本來(lái)意愿,懷著敬畏的心態(tài)繼續(xù)使用Sprite的稱呼,并簡(jiǎn)單翻譯成中文意思:精靈。

在后面章節(jié)的初稿里,仍有大段的關(guān)于Sprite的個(gè)人理解,我會(huì)保留自己原本的寫法,并加入業(yè)內(nèi)通用的理解。

6是Stage,場(chǎng)景編輯區(qū)。可以加入不同的背景,場(chǎng)景也可以單獨(dú)編碼,獲得不少炫酷有趣的效果。

4upload/article/images/2020-12-18/925db6027c30486159358cd41fc67a34.jpgHello,World!

按照我們從小學(xué)到大的習(xí)慣,這里應(yīng)該有一個(gè)小節(jié),叫做“Hello,World!”。作為一個(gè)pc單機(jī)時(shí)代走過(guò)來(lái)的程序員,開(kāi)始講編程,必須對(duì)傳統(tǒng)足夠的尊重,所以,讓預(yù)覽區(qū)默認(rèn)出現(xiàn)的貓說(shuō)一句“Hello,World!”,作為本章的結(jié)束,所有關(guān)于代碼、原理的解釋,則留待以后。

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

PS:關(guān)于“Hello,World!”在程序世界的魔力,是個(gè)很有意思的話題,關(guān)于它的起源,有不少說(shuō)法,感興趣的可以搜一下。

三、Sprite 相關(guān)

Looks?&?Motion

在情懷式的“Hello,World!”之后,開(kāi)始Scratch編碼課程的第一部分內(nèi)容,按照自己這些年來(lái)對(duì)編程語(yǔ)言的理解,Scratch的功能和語(yǔ)言邏輯,以及教自己女兒過(guò)程中的反饋,我把課程分為八節(jié)。

理論上,是可以做到一天一課的,但是,要知道,孩子的專注力是有限的,時(shí)間也是有限的,編程本身就是一個(gè)長(zhǎng)期的學(xué)習(xí)與實(shí)踐過(guò)程,不在一朝一夕的填鴨,所以,我認(rèn)為把計(jì)劃中的課程內(nèi)容按照兩周的時(shí)間編排,即使目標(biāo)只是初步入門,強(qiáng)度也是不小的。
同時(shí),我不會(huì)像Scratch官網(wǎng)建議的那樣,從好玩的動(dòng)畫和游戲出發(fā),因?yàn)槿绻@樣,很大可能興趣就止步于動(dòng)畫和游戲了。任何興趣愛(ài)好,即使是游戲,都是值得我們花費(fèi)大量的時(shí)間去深入學(xué)習(xí)的,而基礎(chǔ),則是一切的開(kāi)始,更何況Scratch本身已經(jīng)夠“好玩”了。所以,我會(huì)根據(jù)Scratch本身的功能,參照其他高級(jí)語(yǔ)言入門時(shí)的編排方式,進(jìn)行切割,形成五個(gè)講解內(nèi)容,三個(gè)綜合性的例子,其中一個(gè)是動(dòng)畫、一個(gè)是游戲(呵呵),一個(gè)是數(shù)學(xué)(編程與數(shù)學(xué)分不開(kāi))小游戲(呵呵+1)。這樣的編排,基本涵蓋了Scratch提供的基本代碼模塊功能。至于擴(kuò)展的部分,特別是樂(lè)高之類的,對(duì)我來(lái)說(shuō)都高級(jí)了,目前不在我計(jì)劃中。

講解內(nèi)容一:Sprite相關(guān)(Looks & Motion)

講解內(nèi)容二:變量與表達(dá)式(Variable,Operator)

講解內(nèi)容三:條件分支與事件(Conditional Branches,Events)

講解內(nèi)容四:循環(huán)(Loop)

綜合示例一:動(dòng)畫

講解內(nèi)容五:傳感器及其他(Sensing)

綜合示例二:小游戲

綜合示例三:數(shù)學(xué)小競(jìng)賽


另外,在計(jì)劃中,我會(huì)開(kāi)第二個(gè)兩周課程,顯著的提升代碼復(fù)雜度,去實(shí)現(xiàn)一個(gè)又一個(gè)的小目標(biāo)。同時(shí),計(jì)劃中應(yīng)該會(huì)有一個(gè)和階段二平行的基于文本編碼的入門課程,為什么這么做的目的現(xiàn)在不想過(guò)多解釋,只是真的會(huì)很有必要,至于選擇什么語(yǔ)言,以前我很確定,不會(huì)選擇Python,然而現(xiàn)在,我想說(shuō)有不小的可能性會(huì)是Python。

對(duì)于這一系列安排與選擇,想說(shuō),我的固執(zhí)再一次起了巨大的作用,在邏輯與結(jié)構(gòu)先行的根深蒂固的概念影響下,我強(qiáng)行把Scratch積木菜單進(jìn)行了拆分。在Python很好用但是“功法有點(diǎn)邪惡”的長(zhǎng)期印象下,我又本能的排斥將Python教給小朋友。好吧,如果我能順利的從Python中提取出自己所謂的“武林正宗”的精髓要義,我就不跟自己較勁了,選擇Python作為文本編碼的入門(腳本)語(yǔ)言。為了不辜負(fù)大家對(duì)Python的熱望,我會(huì)努力的。

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

后事交待完了,?我們終于可以開(kāi)始了

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

Sprite基礎(chǔ)???

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

繼續(xù)拿出上一節(jié)中工作區(qū)區(qū)域圖,區(qū)別是,還留著“Hello,World!”,標(biāo)示出了區(qū)域1中的兩個(gè)類別MotionLooks,和右上角Tab頁(yè)中的“Costumes”選項(xiàng)。區(qū)域145,加上標(biāo)記的兩個(gè)部分,就是這一節(jié)的主要內(nèi)容,當(dāng)然,編碼區(qū),每一次都跑不掉,所以,不特別說(shuō)了。

Sprite

Sprite,精靈,這個(gè)名詞最早來(lái)源于游戲中,首先,它是一張圖,比如默認(rèn)的那只貓,但是在背景刷新的時(shí)候,這張圖并不刷新,它也是獨(dú)立變化的,如同一個(gè)精靈一樣懸浮在背景之上,這是精靈這個(gè)名詞的由來(lái)。但是,我認(rèn)為,用Sprite這個(gè)概念,雖然在Scratch中是毫無(wú)問(wèn)題的,但在后續(xù)編程的進(jìn)階中,會(huì)造成很多概念上的困擾。所以,我更愿意將它稱為“對(duì)象”,借用一定的面向?qū)ο缶幊讨械母拍睿驗(yàn)樗_實(shí)有許多類似的地方,雖然更多的不同,但是這個(gè)不同主要來(lái)自于功能的缺失,而非區(qū)別。https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

上面的正文是如第二節(jié)課中所言,沒(méi)有修改過(guò)的。Sprite是動(dòng)畫、游戲中經(jīng)常使用到的概念,從理解上來(lái)講更具象化,可能是一只貓、一只老鼠,或者一輛車、一棟房子,等等。Scratch編碼也主要圍繞Sprite這個(gè)核心展開(kāi)。

https://cdn.china-scratch.com/timg/190923/112G45492-30.jpg? 通過(guò)區(qū)域5的顯示,我們可以看到灰色背景區(qū)域存在一個(gè)名為Sprite1的貓,就是我們默認(rèn)看見(jiàn)的那只,當(dāng)然還可以存在Sprite2,……,SpriteN。上面白色區(qū)域,標(biāo)示著Sprite1的一些屬性(你看,叫對(duì)象就沒(méi)什么問(wèn)題了,對(duì)象也有屬性Attributes),這些屬性包括,名字(Sprite1),位置(X,Y,目前都是0,即正中心,這個(gè)設(shè)定很贊),顯示(Show)或者隱藏(Hide),大小(Size)100,方向(Direction)90度。
https://cdn.china-scratch.com/timg/190923/112G44194-31.jpg動(dòng)手小嘗試
添加一個(gè)Sprite!?https://cdn.china-scratch.com/timg/190923/112G52c2-32.jpg?

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

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

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

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

這樣,我們有了兩只貓,給它們改名,分別命名為Cat1和Cat2,同時(shí),對(duì)位置和角度做一些調(diào)整。

?
一個(gè)有意思的事情發(fā)生了,之前的那只貓Cat1依然在說(shuō)“Hello,World!”,而Cat2則毫無(wú)表示。分別點(diǎn)擊Sprite選取里兩只貓的圖標(biāo),可以看到,Cat1在代碼區(qū)域是有代碼的,而新加的Cat2則空空如也。兩點(diǎn):一、要讓某個(gè)Sprite或者對(duì)象有動(dòng)作,是需要編碼的;二、每個(gè)Sprite是需要(也可以說(shuō)成可以,呵呵)獨(dú)立編碼的。所以,我們完全可以做成一個(gè)這樣的場(chǎng)景,Cat1說(shuō)“Hello,Cat2!”,Cat2說(shuō)“Hello,Cat1!”。https://cdn.china-scratch.com/timg/190923/112H044T-35.jpghttps://cdn.china-scratch.com/timg/190923/112H041H-36.jpg有人說(shuō),我改了,為什么看不到效果呢?注意區(qū)域4左上角的那面綠色小旗和代碼區(qū)域里黃色背景的When?green flag?clicked代碼塊了嗎?前者可以理解為一個(gè)“開(kāi)始”鍵,按下后,在代碼里的相應(yīng)塊被觸發(fā),后面的代碼則順序執(zhí)行。這就是Scratch的一個(gè)通用的程序入口。理解起來(lái)簡(jiǎn)單,描述起來(lái)費(fèi)勁,所以,記住,大多數(shù)情況下,每個(gè)Sprite都需要這樣一個(gè)When?green flag?clicked塊來(lái)標(biāo)示出程序的開(kāi)始,而且,一個(gè)Sprite是可以有多個(gè)程序入口的,這個(gè)以后講到,自然明白了。https://cdn.china-scratch.com/timg/190923/112H13423-37.jpg

程序入口,就是程序開(kāi)始執(zhí)行的地方。不管什么編程語(yǔ)言,程序入口都是最重要的第一步,不同的語(yǔ)言對(duì)于程序入口會(huì)有不同的約定或者說(shuō)規(guī)則。

對(duì)于Scratch而言,程序入口可以有多種方式設(shè)定,正文中所述的When?green flag?clicked代碼塊是最常用的一種,還有一些其他的方式。同時(shí),每個(gè)Sprite都可以有一個(gè)或者多個(gè)程序入口,不僅不同Sprite的代碼相互獨(dú)立,同一Sprite下多個(gè)入口區(qū)分的代碼段也是相互獨(dú)立的。

可以想象一下,如果我們加入的貓不是兩只,而是許多只,同時(shí)這些貓都在屏幕上漫無(wú)目的亂跑,彼此之間獨(dú)立,沒(méi)有相互影響,是一種怎樣的景象?這種在其他語(yǔ)言實(shí)現(xiàn)起來(lái)很復(fù)雜的效果,恰恰是Scratch的優(yōu)勢(shì)所在。


相應(yīng)的,點(diǎn)擊綠色旗幟旁邊的紅色八邊形按鈕,程序結(jié)束,顯示為兩只貓都是毫無(wú)表示。2

MotionLooks??

Motion和Looks,顧名思義,動(dòng)作和外觀。這兩個(gè)類別分別承擔(dān)了Sprite的動(dòng)作和外觀,當(dāng)然,其他類別,例如Sound,Sensing等等,每一個(gè)都能說(shuō)與Sprite息息相關(guān),畢竟,Scratch的核心就是Sprite。這一節(jié)只介紹Motion和Looks,是因?yàn)樗鼈兏兇猓哺庇^。點(diǎn)開(kāi)每個(gè)類別里,都有一系列的代碼塊,代表不同的動(dòng)作,或者外觀。這里,我就不一一列舉說(shuō)明了,畢竟,寫一個(gè)《Language Reference》并不是我現(xiàn)在的目標(biāo)。但是,我還是建議大家每一個(gè)都試試,編程是一項(xiàng)實(shí)踐性很強(qiáng)的活動(dòng)(我想說(shuō)工作,呵呵+N),而在編程世界里真正的自由不是我們漫無(wú)目的的想干嘛就干嘛,而是我們了解并實(shí)踐了許多種基本的功能后,自由的組合,變成無(wú)限的可能。我也會(huì)在本節(jié)最后的小例子里面加入幾個(gè)功能塊作為展示和引玉。
3

Costume???

點(diǎn)擊代碼區(qū)上方Tab頁(yè)中的Costumes,可以看到一個(gè)完全不同的界面。就按照Costume本意,我們就叫它皮膚吧(免費(fèi)的,不需要點(diǎn)券或者鉆石購(gòu)買)。對(duì)于這只貓來(lái)說(shuō),系統(tǒng)默認(rèn)提供了兩種皮膚,一個(gè)是之前一直出現(xiàn)的cat-a,另一個(gè)就是cat-b,我們可以像畫圖一樣改變皮膚,也可以新建皮膚。當(dāng)然,Costume的功能可不僅僅是改個(gè)樣子,很多復(fù)雜一點(diǎn)的應(yīng)用中,都需要用到Costume這一設(shè)定。這里,就不過(guò)多解釋了。https://cdn.china-scratch.com/timg/190923/112H11T5-38.jpg?

簡(jiǎn)單的畫圖功能,可以充分發(fā)揮小朋友的想象力和繪畫能力。

4

一個(gè)簡(jiǎn)單的例子??

用一個(gè)例子把這一節(jié)的內(nèi)容串起來(lái),目標(biāo)很簡(jiǎn)單:兩只貓互相打招呼,并且不斷靠近。?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

給家長(zhǎng)的話

如前言所述,這個(gè)課程我第一類面向的對(duì)象就是家長(zhǎng)朋友。為什么叫親子編程課,我的想法是親子共同來(lái)“玩”Scratch,既增強(qiáng)親子關(guān)系,又能更好的幫助孩子啟蒙到入門。我本著這樣一個(gè)目的,將內(nèi)容寫到這里,如果站在一個(gè)零基礎(chǔ)開(kāi)始的家長(zhǎng)的角度來(lái)說(shuō),我認(rèn)為這樣一種介紹方式,應(yīng)該是可以了。但是,對(duì)于我們的真正目標(biāo)而言,需要再往前走一步,直接面對(duì)每一個(gè)孩子的是家長(zhǎng)自己,所以,我們需要加一部分內(nèi)容,作為家長(zhǎng)如何啟發(fā)自己子女動(dòng)腦動(dòng)手的建議,暫且稱之為“親子實(shí)踐建議”。

親子實(shí)踐建議

最開(kāi)始的時(shí)候,可以讓孩子自己選擇一個(gè)喜歡的Sprite,可以是貓、狗,甚至任何動(dòng)物也好,其他物件也好。

通過(guò)調(diào)整Sprite區(qū)域的屬性,例如size,x、y,direction等等,看看不同數(shù)值引起的變化,從而了解屬性的概念。

熟悉代碼區(qū)的操作,包括程序塊選擇,拖拉,修改白色圓角矩形中的參數(shù)。熟悉When?green flag?clicked代碼塊及程序啟動(dòng)、停止(綠旗按鈕開(kāi)始,紅色八邊形按鈕結(jié)束)。將Motion及Looks中代碼塊拖拽入代碼區(qū)中,看不同的代碼塊的效果。

切換至Costume頁(yè),看看不同外觀對(duì)Sprite影響,有興趣的可以修改并保存自己的Costume。

按照示例代碼,開(kāi)始我們第一個(gè)完整的例子。


PS:在這個(gè)例子中,我只使用了Motion和Looks。這樣做的原因是希望循序接近,孩子的理解力和專注力是有限的,重點(diǎn)應(yīng)該是如何在有限的專注時(shí)間段里盡可能培養(yǎng)孩子的興趣,潛移默化的灌輸基本的程序思維和邏輯思維,而不是選擇如何在短時(shí)間里灌輸多的知識(shí)。https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

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

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

四、Variables,Operators

這一節(jié),講Variables(變量),Operators(表達(dá)式)。這是一般程序語(yǔ)言參考中緊接著“Hello,World!”的內(nèi)容,我把它挪到了關(guān)于Sprite的基本概念之后。可是,我依然會(huì)困擾于如何向一個(gè)大概率不超過(guò)十歲的小朋友介紹變量的概念。如果說(shuō),Sprite,Motion,Looks在Scratch漂亮的界面下,是直觀的話,那么,Variables則是很不直觀的。而,Operators更是一個(gè)看起來(lái)很簡(jiǎn)單,其實(shí)有很多內(nèi)涵的概念。

對(duì)于這一節(jié),當(dāng)初我想了很久,應(yīng)該怎么去講。坦白說(shuō),按照一般的Scratch教法,基本可以一筆帶過(guò),因?yàn)樵趺从茫词剐∨笥岩惨豢淳兔靼住5恰肮虉?zhí)”告訴我,無(wú)論是變量還是表達(dá)式,對(duì)于一門程序語(yǔ)言來(lái)講都是很重要的基礎(chǔ),基本的概念點(diǎn)時(shí)時(shí)刻刻會(huì)用到,即使后面用Scratch做一些復(fù)雜的程序時(shí),我堅(jiān)持自己想做的是一個(gè)在Scratch載體上的程序思維的入門,所以,內(nèi)容會(huì)是以下呈現(xiàn)的樣子。

這一節(jié)內(nèi)容非常多,我覺(jué)得兩天的時(shí)間來(lái)學(xué)習(xí)是合適的。

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

1

變量?

對(duì)于看我寫了這么多廢話還在堅(jiān)持捧場(chǎng)的朋友們,我想這樣去解釋Variable變量:與我們數(shù)學(xué)里面學(xué)到的變量的概念并無(wú)任何區(qū)別,程序里的變量用來(lái)存儲(chǔ)會(huì)變化的值(可能是數(shù)字,字符,甚至其他形式)。好了,這就是解釋。對(duì)于小孩子,我還是建議用一個(gè)例子去取代解釋。這個(gè)例子是對(duì)上一節(jié)的例子做一些小小的修改:我們加入一個(gè)變量,叫steps。https://cdn.china-scratch.com/timg/190923/112H44255-46.jpg?

點(diǎn)擊Make a variable即可創(chuàng)建變量

然后會(huì)要求輸入變量名,以及一個(gè)對(duì)所有精靈(對(duì)象)有效,還是僅針對(duì)當(dāng)前精靈(對(duì)象)有效的選項(xiàng)。稍微懂一點(diǎn)程序的人,自然知道這是全局變量還是局部變量的意思,但是在這里,賣個(gè)關(guān)子,選擇默認(rèn)的,選項(xiàng)的區(qū)別,稍后直接看結(jié)果就可以了。?

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


這時(shí)候,我們能夠看到在結(jié)果展示區(qū)域,多了一個(gè)steps的顯示,并且數(shù)字為0。?

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

設(shè)置完變量之后,我們對(duì)上一節(jié)的代碼做修改:首先,在程序最開(kāi)始就把steps初始化為0,同時(shí),在Cat1和Cat2每說(shuō)一句話后,讓steps變量加1。代碼如下:?

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


對(duì)Cat2代碼也做類似的修改,但是要注意兩者在說(shuō)的話和移動(dòng)位置上的微小區(qū)別,當(dāng)然,這些區(qū)別都跟上一節(jié)一樣,這里就不再贅述了。代碼修改好后,我們可以直接點(diǎn)擊綠旗看結(jié)果:隨著兩只小貓邁開(kāi)腳步,steps的值變化了,但是問(wèn)題也來(lái)了,1、steps每次增加都是2,可是我們明明設(shè)置的是每次變化1啊;2、steps最后的值為10,可是貓只走了五步啊!https://cdn.china-scratch.com/timg/190923/112G43245-29.jpg

還記得我們?cè)谔砑幼兞縮teps時(shí)賣的關(guān)子嗎?那個(gè)關(guān)于“For all sprites”還是“For this sprite only”的選項(xiàng),就是這個(gè)選項(xiàng)在搗鬼。

https://cdn.china-scratch.com/timg/190923/112G45492-30.jpg? 幸運(yùn)的是,我們第一次觸碰到了編程中一個(gè)重要的核心概念——全局變量與局部變量,不幸的是,類似這樣的核心概念,后面還有很多很多,慢慢來(lái)。

什么樣的概念可以稱為編程的核心概念?我的理解是要超越具體語(yǔ)言本身的,更多體現(xiàn)編程思想的東西,對(duì)一個(gè)才開(kāi)始接觸Scratch的孩子來(lái)說(shuō),我知道這樣的說(shuō)法很晦澀,所以,只是提一句,不展開(kāi)。


關(guān)于“全局變量與局部變量”的概念(變量作用域)。任何編程語(yǔ)言都有變量,也都有全局變量和局部變量的概念,Scratch當(dāng)然不例外。只不過(guò),感謝Scratch有趣的皮囊,讓我們可以很直觀的感受到變量作用域的區(qū)別。言歸正傳,在我們這個(gè)例子里,“For all sprites”意思就是這個(gè)變量對(duì)所有的Sprite都可見(jiàn),而且不僅僅是可以“看見(jiàn)”,還是可以“修改”。這樣,就很好解釋例子中的現(xiàn)象了,Cat1每走一步都對(duì)steps+1,Cat2同樣,那不就是它們合起來(lái)走了十步嗎?它們走的又是那么的同步,看起來(lái)不就是steps每次都+2嗎?

計(jì)算機(jī)小知識(shí)

正文為什么叫“看起來(lái)”,稍稍擴(kuò)展一下,無(wú)論現(xiàn)代科技如何進(jìn)步,計(jì)算機(jī)的基本設(shè)計(jì)原理并沒(méi)有太多改變,程序的執(zhí)行從嚴(yán)格意義上來(lái)講,都是按照一定的順序執(zhí)行的,所以,如果我們把時(shí)間觀察粒度切的足夠小,一定是能夠看到先是執(zhí)行了Cat1中的代碼,或者先是執(zhí)行了Cat2中的代碼的,在這樣的粒度下,我們也應(yīng)該可以看到steps每一次都是在偶數(shù)停留1秒后,增加了1變?yōu)槠鏀?shù),又瞬間增加1變?yōu)榕紨?shù)。這種極其細(xì)微的變化,對(duì)多數(shù)程序來(lái)講,都是沒(méi)有影響的,但是對(duì)于高頻交易,影響就是巨大的,畢竟無(wú)論是證券交易,還是線上秒殺活動(dòng),瞬間的區(qū)別都會(huì)影響到錢的多少。


好了,概念說(shuō)完了,那么我們?nèi)绾螌?duì)兩只貓單獨(dú)計(jì)步呢?最理想的方法當(dāng)然是給每只貓?jiān)O(shè)定一個(gè)“For this sprite only”的steps變量,分別統(tǒng)計(jì)。這里,我們用一個(gè)取巧的辦法,為Cat2新增一個(gè)“For this sprite only”的變量steps2,并將Cat2代碼里的steps變量全部替換為steps2。這里,不再貼出截圖,我建議家長(zhǎng)能夠跟孩子一起動(dòng)手,看結(jié)果的不同。?https://cdn.china-scratch.com/timg/190923/112G44194-31.jpg取巧可以嗎當(dāng)然可以,程序是自由的。

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


細(xì)心的朋友一定注意到了一個(gè)地方,就是當(dāng)我們添加了steps2后,在代碼結(jié)果區(qū)顯示了一個(gè)Cat2:steps,顯而易見(jiàn),這是一個(gè)“For cat2 only”的變量。
啰啰嗦嗦,變量的基本大體介紹完。

2

表達(dá)式

進(jìn)入這一節(jié)的第二部分:Operators,表達(dá)式。

我突然意識(shí)到自己在編排上還是犯了一個(gè)巨大的錯(cuò)誤:把變量和表達(dá)式,這兩個(gè)如此重要的概念放到了一節(jié)之中。但是沒(méi)辦法,我給自己框定的就是十節(jié)內(nèi)容,其中還包括了兩節(jié)廢話。

從內(nèi)容的編排上來(lái)講,我之前也提過(guò),是在參照一般編程語(yǔ)言的邏輯基礎(chǔ)上結(jié)合Scratch的特點(diǎn)。如今開(kāi)始學(xué)習(xí)編程,Scratch自然是個(gè)不錯(cuò)的入門方式,但,Scratch就是Scratch,有有趣的皮囊,可以很方便的做一些動(dòng)畫,小游戲,可以培養(yǎng)編程的興趣。但如果只是為了興趣,可能最終一無(wú)所得,記得動(dòng)畫、游戲的樣子,卻不記得怎么實(shí)現(xiàn)。

所以,我想盡可能多講基礎(chǔ)知識(shí),這一節(jié)以及接下來(lái)的兩節(jié),我會(huì)更多的按照自己理解的編程語(yǔ)言的核心概念去編排、講解、舉例。在我學(xué)習(xí)和使用了幾十種形形色色的編程語(yǔ)言的經(jīng)歷中,唯有這三節(jié)里的內(nèi)容,是所有基礎(chǔ)的基礎(chǔ)。正如人類最初用簡(jiǎn)單的動(dòng)詞、副詞、量詞、介詞逐漸構(gòu)建了如今豐富多彩的語(yǔ)言世界一樣,神奇的程序世界也是從這三節(jié)開(kāi)始的。


我一直覺(jué)得“表達(dá)式”這個(gè)翻譯甚至比Operators更加貼切,內(nèi)涵更豐富,以至于我很難用一句話去更好的解釋其完整的意思。這里,只在當(dāng)前的應(yīng)用環(huán)境下,做一個(gè)解釋:表達(dá)式,就是對(duì)變量(或者常量,顧名思義,值不變)進(jìn)行某種或者某幾種組合運(yùn)算。如何理解?就以Scratch為例,目前的版本中,對(duì)表達(dá)式用了綠色的框表示,在綠色的框內(nèi),是個(gè)式子,有變量有常量,有運(yùn)算,有判斷,但是跳出綠色的框,對(duì)一段程序而言,就變成了一個(gè)結(jié)果。如果這種理解不直觀的話,那么想象一下Excel表格,可能里面的單元格寫著公式(表達(dá)式),但是就表格看來(lái),公式并不顯示出來(lái),顯示的只是公式的運(yùn)算結(jié)果。換句話說(shuō),表達(dá)式也是最小的程序形式,簡(jiǎn)單而言,1+1,就是程序,當(dāng)然在有些對(duì)格式要求嚴(yán)格的語(yǔ)言里面,會(huì)報(bào)語(yǔ)法錯(cuò)誤,但是不少靈活的語(yǔ)言里面,就會(huì)直接以“2”作為程序的結(jié)果輸出,比如Python。表達(dá)式有種類之分,從大類來(lái)講,是兩類:算術(shù)表達(dá)式和邏輯表達(dá)式。算術(shù)表達(dá)式算術(shù)運(yùn)算,結(jié)果為數(shù)字邏輯表達(dá)式邏輯運(yùn)算,結(jié)果為真假在Scratch中,兩者的區(qū)別一目了然:前者是圓角矩形,后者則是六邊形(可以看到,字符的運(yùn)算也用圓角矩形來(lái)表示,本質(zhì)上,字符運(yùn)算也是算術(shù)運(yùn)算,計(jì)算機(jī)把字符轉(zhuǎn)換成數(shù)字進(jìn)行運(yùn)算后,再轉(zhuǎn)換回字符而已)。
關(guān)于算術(shù)表達(dá)式,相信不需要如何解釋,需要解釋的是邏輯表達(dá)式。我們知道,整個(gè)現(xiàn)代計(jì)算機(jī)的基礎(chǔ)是二進(jìn)制,而邏輯運(yùn)算的結(jié)果也只有兩個(gè):真、假。邏輯運(yùn)算則有:與、或、非及其組合。實(shí)際上,任何算術(shù)運(yùn)算都可以轉(zhuǎn)換為邏輯運(yùn)算,當(dāng)然,這個(gè)已經(jīng)是大學(xué)二年級(jí)課程《數(shù)字電路》中的內(nèi)容了,這里,不展開(kāi),只是簡(jiǎn)單解釋一下與、或、非運(yùn)算。

與(and):輸入是兩個(gè)及以上的邏輯判斷,當(dāng)所有邏輯判斷都為“真”時(shí),與運(yùn)算結(jié)果為“真”,只要有一個(gè)邏輯判斷為“假”時(shí),與運(yùn)算結(jié)果就為“假”。

或(or):跟與運(yùn)算的區(qū)別在于,只要有一個(gè)邏輯判斷為“真”,或運(yùn)算結(jié)果就為“真”,但是請(qǐng)注意,與運(yùn)算和或運(yùn)算并非相互為反運(yùn)算,因?yàn)楫?dāng)所有邏輯判斷都為“真”時(shí),與運(yùn)算和或運(yùn)算的結(jié)果都是“真”。

非(not):把“真”的變成“假”的,“假”的說(shuō)成“真”的。


關(guān)于Operators(表達(dá)式)的基本概念到此講完。遺憾的是,因?yàn)榧夹g(shù)原因,接下來(lái),我只能用程序給出算術(shù)表達(dá)式的例子,而無(wú)法給出邏輯表達(dá)式的例子,當(dāng)然這會(huì)在下一節(jié)補(bǔ)上,因?yàn)橄乱还?jié),我們會(huì)進(jìn)入一個(gè)非常重要的基礎(chǔ)程序結(jié)構(gòu):條件分支。
例子很簡(jiǎn)單,這次出場(chǎng)三只貓,Cat1和Cat2隨機(jī)報(bào)一個(gè)10以內(nèi)的數(shù),Cat3把兩個(gè)數(shù)乘起來(lái),并報(bào)答案。三只貓對(duì)應(yīng)的代碼如圖。

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

簡(jiǎn)單解釋一下程序,主要是兩個(gè)表達(dá)式:

1、pick random:意思就是產(chǎn)生一個(gè)隨機(jī)數(shù),例子中產(chǎn)生的是1到10的隨機(jī)數(shù)。

2、join:字符串拼接,字符串拼接是可以不斷嵌套使用的,這個(gè)例子中,假設(shè)x為2,y為5,那么,四個(gè)join的結(jié)果就是“2X5=10”。這種字符串拼接術(shù),無(wú)論在任何程序語(yǔ)言中,都是最常用的技巧之一。

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

給家長(zhǎng)的話

這一節(jié)有不少的概念,而且非常重要。變量與常量(不變的值就是常量,Scratch里沒(méi)有常量的設(shè)置,那么我們可以認(rèn)為具體的數(shù)字就是一個(gè)常量,比如上面的think “” for 2 seconds,這個(gè)2就是一個(gè)常量)、全局變量與局部變量表達(dá)式、算術(shù)表達(dá)式、邏輯表達(dá)式邏輯“真”與邏輯“假”邏輯運(yùn)算(與、或、非),雖然我把這些內(nèi)容壓縮進(jìn)了一節(jié),但是我希望家長(zhǎng)可以花兩天(每天半小時(shí))的時(shí)間幫助孩子去理解與消化。


參照我給的例子,我會(huì)給出如下實(shí)踐建議

實(shí)踐建議

  • 增加變量,看到程序運(yùn)行中變量的變化;

  • 提出問(wèn)題,為什么變量的變化跟我們想象的不一樣;

  • 新增加一個(gè)“For this sprite only”變量,通過(guò)前后區(qū)別,讓孩子初步明白全局變量和局部變量的區(qū)別;

  • 鼓勵(lì)孩子自己做簡(jiǎn)單的例子,能夠用到全局變量和局部變量;

  • 解釋表達(dá)式的概念,可以按照Scratch編排的方式,簡(jiǎn)單的解釋一下綠色圓角矩形程序塊(算術(shù)表達(dá)式)的概念,這里面有兩個(gè)比較難解釋的運(yùn)算,一是pick number,二是join。上面的內(nèi)容已經(jīng)做過(guò)解釋。

  • 通過(guò)邏輯訓(xùn)練來(lái)幫助孩子理解基本的邏輯和邏輯預(yù)算,邏輯訓(xùn)練分為兩部分,一部分是邏輯真假判斷,可以提出幾個(gè)問(wèn)題,例如,今天下雨了;現(xiàn)在是早上;30比50小(真),等等這些問(wèn)題,讓孩子判斷真假。第二部分是邏輯運(yùn)算,首先是非運(yùn)算,非建議直接用數(shù)字比較來(lái),比如,30>=50(假)的非運(yùn)算是30<50(真);其次是與運(yùn)算和或運(yùn)算,比如要表示40是否在一個(gè)數(shù)字區(qū)間范圍內(nèi),可以用40>30 and 40<50(真)、30>40 or 30 <20(假)這樣的表達(dá)式,可以直接幫助孩子無(wú)縫對(duì)接Scratch中的表達(dá)式。

  • 最后,是讓孩子實(shí)現(xiàn)我最后給出的一個(gè)三只貓做計(jì)算題的例子,強(qiáng)烈建議先給孩子描述任務(wù),讓孩子自己嘗試去實(shí)現(xiàn),遇到問(wèn)題再找參考,直至完成。編程是一項(xiàng)實(shí)踐性非常強(qiáng)的工作,眼高手低(看程序都明白,寫程序一句不會(huì))是最容易發(fā)生的事情,只有讓孩子多動(dòng)手,才會(huì)打下更好的基礎(chǔ)。?

五、Conditional Branch條件分支

Events事件

按照Scratch對(duì)代碼積木的分類,我們這節(jié)涉及到Control和Events,但是如果按照一般程序語(yǔ)言的習(xí)慣,Scratch的Control模塊至少包含了兩塊重要的內(nèi)容。但是從邏輯關(guān)系來(lái)講,這一節(jié)要說(shuō)的兩部分內(nèi)容關(guān)聯(lián)度略高一點(diǎn),所以我把Control模塊一切為二,其中一部分跟Events模塊一起,構(gòu)成這一節(jié)的內(nèi)容,剩余的一塊組成下一節(jié)的內(nèi)容。

Scratch團(tuán)隊(duì)?wèi)?yīng)該也是認(rèn)為Control和Events關(guān)聯(lián)度很大,所以積木塊都用了相近的顏色。事實(shí)上也是如此。

如果說(shuō)前面兩節(jié)的內(nèi)容更多的是在講編程語(yǔ)言的基本元素,及在Scratch中的具體形態(tài),那么這一節(jié)和下一節(jié)其實(shí)是在講編程語(yǔ)言的基本骨架。骨架+元素構(gòu)成基本同時(shí)完整的可被執(zhí)行的代碼段。

至于這些代碼段如何組裝,構(gòu)造復(fù)雜的程序,這就是一步步不斷進(jìn)階的過(guò)程了。

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

1

?Conditional Branch條件分支

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

upload/article/images/2020-12-18/c4145b2568dc2aef5c933702cd5e2d1b.jpg首先做一些基本的概念解釋,Conditional Branch,這個(gè)詞可以拆成Conditional條件和Branch分支兩個(gè)意思。Conditional條件,簡(jiǎn)而言之,就是承接上一節(jié)的邏輯判斷,判斷一個(gè)邏輯表達(dá)式是“真”還是“假”。
Branch分支,是基于條件判斷的后續(xù)分叉,好比一條岔路口,上面的條件給出了我們要選擇哪條路,這里的分叉則指明不同道路的方向。幾乎所有的編程語(yǔ)言,條件分支都會(huì)用類似if-else的結(jié)構(gòu),Scratch也不例外。在Control類里,有兩個(gè)積木塊,實(shí)現(xiàn)了這樣的功能結(jié)構(gòu)。?

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

這個(gè)意思非常的簡(jiǎn)潔明確,右邊代表如果條件A成立就怎樣怎樣,而左邊則代表如果條件A成立就這樣,否則就那樣。“

注意到兩個(gè)程序塊里面的六邊形了嗎?跟上一節(jié)中邏輯表達(dá)式一模一樣的六邊形,意義也很直觀,我們把一個(gè)邏輯表達(dá)式填入if程序塊的六邊形中,程序自己去對(duì)邏輯表達(dá)式進(jìn)行計(jì)算并判斷“真”與“假”,然后再按照編寫好的分支繼續(xù)下去。

”順便解釋一下為什么上一節(jié)對(duì)于邏輯表達(dá)式我沒(méi)有舉例子,因?yàn)檫壿嫳磉_(dá)式天然就是要跟條件判斷和分支(這里為什么把條件分支拆開(kāi),寫成條件判斷和分支,因?yàn)闂l件分支是個(gè)更小的概念,條件判斷和分支的形式有更多種,至少下一節(jié)中也會(huì)涉及到不同的形式)結(jié)合使用的,一個(gè)例子也必須講了條件分支后,才有更實(shí)際的意義。好,例子開(kāi)始。上一節(jié),我們的例子是,兩只貓報(bào)數(shù),第三只貓做乘法報(bào)結(jié)果。這次我們修改一下,還是兩只貓報(bào)數(shù),但是第三只貓不再是做乘法,而是作為裁判,比較兩只貓報(bào)的數(shù)字的大小,并宣布結(jié)果。在這個(gè)例子中,Cat1與Cat2的代碼跟上一節(jié)的例子中一模一樣,這里就不再貼出來(lái)了,只給出不一樣的Cat3的代碼的截圖。?https://cdn.china-scratch.com/timg/190923/112I22391-65.jpg?

不知道是不是錯(cuò)覺(jué),當(dāng)程序已這種形式構(gòu)架后,一下子覺(jué)得美感提升不止十倍。這種因?yàn)橛辛顺绦蚪Y(jié)構(gòu)的支撐,血肉都變得生動(dòng)的感覺(jué),讓我癡迷了幾十年。

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

需要對(duì)代碼做一些解釋,由于Scratch只給出了兩種條件分支的結(jié)構(gòu),而數(shù)字大小的比較結(jié)果則有三種:1贏、2贏、3打平,用兩種積木去實(shí)現(xiàn)三條岔路,美感多少打了折扣,這也是Scratch的不足之處,對(duì)于復(fù)雜的邏輯結(jié)構(gòu)雖然能夠?qū)崿F(xiàn),但是也極其復(fù)雜。

我們來(lái)分析這個(gè)邏輯結(jié)構(gòu)的實(shí)現(xiàn),首先,三種結(jié)果一定是排他的,一次只會(huì)有一種結(jié)果,對(duì)于Cat1來(lái)講,要么贏,要么輸,要么打平,對(duì)Cat2而言也是。理論上弄一個(gè)三岔路,問(wèn)題就輕松解決,但是在沒(méi)有的情況下,我們只能分成兩步:第一步,先判斷Cat1有沒(méi)有贏,所以會(huì)有第一個(gè)if-else積木,里面的邏輯表達(dá)式是x>y,如果為“真”,那么很簡(jiǎn)單,直接宣布結(jié)果。如果為“假”呢?為“假”的時(shí)候可能會(huì)有兩種情況,要么xy或者x=y,但是由于x>y在之前已經(jīng)被我們判斷過(guò)了,如果x>y為“真”的話,程序是不可能再來(lái)判斷x

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

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

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

2

?Events事件

理解完了條件分支這個(gè)重要部分,我們花很短的時(shí)間過(guò)一下Events。在程序世界里,Events非常重要,而且豐富多彩。什么是Events,簡(jiǎn)單說(shuō),就是某個(gè)事件發(fā)生了,那么什么是事件?事件是一個(gè)廣義的邏輯表達(dá)式。例如,“吃飯”事件,我們問(wèn)Cat1:“你吃過(guò)了嗎?”,這是一個(gè)事件邏輯表達(dá)式,Cat1回答:“吃過(guò)了!”,代表前一個(gè)邏輯表達(dá)式運(yùn)算結(jié)果為“真”,“吃飯事件”發(fā)生了。然后呢?然后就進(jìn)入“吃飯事件”發(fā)生后的分支。Scratch中,最簡(jiǎn)單最常用的就是When?green flag?clicked事件,也是我們程序一開(kāi)始就接觸到的一個(gè)積木塊。完整的意義這里可以再解釋一下:通常情況下,我們每一個(gè)Sprite對(duì)象的代碼都寫在When?green flag?clicked之后,可以理解為這些代碼存在于這個(gè)事件的分支之內(nèi),當(dāng)我們點(diǎn)擊了程序結(jié)果展示區(qū)域的綠旗后,這些代碼就被執(zhí)行,而如果沒(méi)有點(diǎn)擊,這些代碼就不會(huì)得到執(zhí)行。這里,一個(gè)事件就是一個(gè)開(kāi)關(guān),事件發(fā)生的邏輯判斷為“真”,則開(kāi)關(guān)打開(kāi),分支內(nèi)的程序被執(zhí)行,如果事件沒(méi)發(fā)生,那么你可以當(dāng)作這些代碼不存在,如果事件永遠(yuǎn)沒(méi)發(fā)生,那么代碼就如同永遠(yuǎn)不存在。不僅僅在Events類別里面存在事件程序塊,其他類別里面也有,我把各個(gè)類別里的代碼塊羅列截圖。我們也可以仔細(xì)看他們的相同與區(qū)別。?

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

可以很明顯的看到,事件類的程序塊有三種顏色,分別來(lái)自Scratch的Events、Motion和Sensing類。他們相同嗎?在我看來(lái),至少類似,因?yàn)樗鼈兌际窃谂袛嗄骋惶囟ㄊ录欠癜l(fā)生?那么它們有區(qū)別嗎?在Scratch看來(lái),它們的意義不同,功能不同,黃色的來(lái)自Events類的積木塊,我們看到頂上是個(gè)圓弧,代表著它必須是一段代碼的第一個(gè)程序塊,是代碼的開(kāi)始,我們之前也按照程序世界的默認(rèn),叫它程序入口,對(duì)應(yīng)的事件發(fā)生,程序塊后的代碼便開(kāi)始執(zhí)行;藍(lán)色的積木塊,我們看到它不僅有事件判斷“if on edge”,而且直接給出了分支執(zhí)行“bounce”,這其實(shí)就是一個(gè)條件分支,意思是如果一個(gè)Sprite碰到邊界,就反彈。這個(gè)積木塊被放在了Motion類別里,因?yàn)槭鞘录觿?dòng)作的結(jié)構(gòu);青色的積木塊,我們看到都是六邊形,也就是說(shuō)是純粹的邏輯表達(dá)式,只是在判斷里面描述的事件是否發(fā)生,它必須使用在條件判斷及分支的程序結(jié)構(gòu)中。在后面,我會(huì)專門用半節(jié)來(lái)講Sensing的部分。這些積木塊,我們現(xiàn)在不需要記住,因?yàn)樵诤罄m(xù)的例子里,我們會(huì)逐漸用到,用的時(shí)候,直觀的看結(jié)果,反推功能,這是在我看來(lái)更快的學(xué)習(xí)方法。一個(gè)非常簡(jiǎn)單的例子,作為本節(jié)內(nèi)容的結(jié)束。?還是那三只貓,我們不再用When?green flag?clicked程序塊,而是改用When this sprite clicked程序塊,代碼也只有簡(jiǎn)單的一句自我介紹。另外兩只貓的代碼也一樣,只是名字改一改。這次,我們不需要再去點(diǎn)綠旗開(kāi)始了,點(diǎn)任何一只貓就好了,看看結(jié)果如何,并觀察一下程序運(yùn)行區(qū)上方綠旗和紅色八邊形的變化。

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

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

給家長(zhǎng)的話

實(shí)踐建議

  • 這一節(jié)其實(shí)就是講了條件分支,包括條件判斷、分支,并在此基礎(chǔ)上擴(kuò)展了Events事件的概念。

  • 對(duì)于這一節(jié),如何去教小朋友,我建議是因人而異。每一個(gè)小朋友的年齡、知識(shí)儲(chǔ)備、興趣點(diǎn)都不盡相同,對(duì)于重要的邏輯的理解,在短短的半小時(shí)內(nèi)能夠給出的反應(yīng)也不會(huì)相同。

  • 不必在開(kāi)始的時(shí)候就說(shuō)概念,就從我給出的數(shù)字比大小的例子開(kāi)始,讓小朋友自己嘗試去解釋,如果能夠解釋,那說(shuō)明本身理解了,這時(shí)候可以多講一些邏輯的概念;如果短時(shí)間內(nèi)解釋起來(lái)有困難,那不妨把程序一塊塊拆解來(lái)啟發(fā)式的解釋,Srcath對(duì)不同功能的程序塊顏色做了區(qū)分,這是個(gè)很好的功能,特別是在幫助小朋友理解上。

  • 正如同,學(xué)數(shù)學(xué)要先會(huì)數(shù)數(shù),學(xué)英語(yǔ)要先認(rèn)識(shí)字母一樣,學(xué)程序,也得先理解一些邏輯、條件分支以及其他一些概念,我相信一個(gè)大班或者小學(xué)低年級(jí)的孩子理解這些不是難事,需要的只是耐心。程序世界很大,孩子未來(lái)也很長(zhǎng),一點(diǎn)點(diǎn)來(lái),不去跟別人比,跟自己比就夠了。

  • 關(guān)于事件,我不建議教孩子太多,就用我的例子讓他們有個(gè)直觀感受就好了。我之所以要在這一節(jié)寫事件,一是從完整性來(lái)說(shuō),要有,二是以后其實(shí)會(huì)用到。但是在理解了條件分支后,事件并不難,至少在Scratch中不難,用到了就會(huì)了。


?

六、循環(huán)

終于到循環(huán)了。Scratch很有意思,編內(nèi)容,做例子也很好玩。但是碼字太痛苦了,整理格式太費(fèi)神了。好在,能夠自由發(fā)揮的介紹循環(huán),就都不是事情了。循環(huán)當(dāng)然很重要,更重要的是,把循環(huán)講完,程序世界的自由大門也就打開(kāi)大半了。

人類為什么要發(fā)明計(jì)算機(jī)、設(shè)計(jì)編程語(yǔ)言,最初的目的是因?yàn)橐M(jìn)行科學(xué)計(jì)算,因?yàn)榭茖W(xué)計(jì)算需要大量的復(fù)雜的,重復(fù)的運(yùn)算過(guò)程靠人做,耗時(shí)而且容易出錯(cuò)。于是靠程序來(lái)完成,雖然對(duì)于很多計(jì)算,程序也要耗費(fèi)大量的時(shí)間,但是:一、總比人力計(jì)算來(lái)的快;二、只要程序沒(méi)錯(cuò),結(jié)果就基本不錯(cuò);三、可以無(wú)上限的重復(fù)。這里的重復(fù)有兩重含義,一是程序?qū)懞昧耍赡軛l件變了,環(huán)境變了,需要重新計(jì)算,隨時(shí)可以;二是,程序內(nèi)部,本身也需要許多重復(fù),這個(gè)也能比較容易的實(shí)現(xiàn),而實(shí)現(xiàn)這個(gè),靠的就是這一節(jié)要講的:循環(huán)。上一節(jié)提到過(guò),在程序語(yǔ)言里,循環(huán)與條件分支共同構(gòu)成一個(gè)程序的骨架。所以,在Scratch中,設(shè)計(jì)者將循環(huán)與條件分支共同放入了Control類別中。那么什么是循環(huán):簡(jiǎn)單說(shuō),不簡(jiǎn)單的重復(fù)叫做循環(huán)。正是這種不簡(jiǎn)單的重復(fù),與條件分支一起構(gòu)成了五彩繽紛的程序世界。先看Scratch提供的循環(huán)相關(guān)的程序塊,主要是三個(gè)按字面意義,分別是永遠(yuǎn)循環(huán)(forever),循環(huán)N次(repeat),循環(huán)直到某一邏輯表達(dá)式為“真”結(jié)束(repeat until)。需要解釋一下的是,forever雖然叫永遠(yuǎn)循環(huán),但是指的是在程序里,一旦按下紅色八邊形停止按鈕,隨著程序的結(jié)束,循環(huán)自然也就結(jié)束了。簡(jiǎn)單的循環(huán),是很容易被理解的,我們通過(guò)三個(gè)簡(jiǎn)單例子分別來(lái)看三種不同循環(huán)的效果。第一個(gè)例子用forever。一個(gè)貓報(bào)數(shù)的例子。
很顯然,如果不按下紅色八邊形按鈕讓程序終止,貓會(huì)不斷的報(bào)數(shù)報(bào)下去。第二個(gè)例子,還記得我們?cè)谇皫坠?jié)里面用到兩只貓一邊打招呼一邊互相靠近的例子嗎?我們用repeat修改一下,讓程序在功能相同的前提下,看起來(lái)更好看一點(diǎn)。可以回想一下之前例子里面,我們的代碼有多冗長(zhǎng)。循環(huán)有效的減少的重復(fù)代碼的數(shù)量,讓程序結(jié)構(gòu)看起來(lái)更加美觀易懂。另一個(gè)與前面例子不同的修改是,在循環(huán)里,我用next costume程序塊替換了之前的switch costume to,這是一個(gè)典型的在循環(huán)結(jié)構(gòu)里會(huì)用到的思路:很多時(shí)候我們并不知道一些東西的具體數(shù)量,這里是貓的不同外觀,還可以是其他的,但是我們想都用到,而不是去指定用哪一個(gè),那么類似于next的功能就變得有意義。當(dāng)然,Scratch里面只提供了有限的幾種next,更復(fù)雜的編程語(yǔ)言則會(huì)有類似的設(shè)計(jì),但是可以提供更多變化可能。
第三個(gè)例子,我們想讓貓做一個(gè)累加法,比如像當(dāng)初的高斯一樣,去計(jì)算1加到10或者1加到100,我們很容易想到可以用repeat 10或者repeat 100這樣的結(jié)構(gòu)。這里,我們嘗試換種思路,用repeat until的結(jié)構(gòu)。幾乎我們點(diǎn)擊綠旗的瞬間,貓就報(bào)出了“5050”的答案。答案顯然是正確的(對(duì)于幼兒園的小朋友,可以把x>100改成x>10)。
需要解釋一下repeat until循環(huán)。可以看到這個(gè)循環(huán)里面有一個(gè)綠色六邊形的邏輯表達(dá)式,我們不妨稱之為條件循環(huán),每一次執(zhí)行循環(huán)體(在循環(huán)程序塊里面被包裹的程序我們叫做循環(huán)體)之前,程序都要對(duì)綠色六邊形的邏輯表達(dá)式進(jìn)行邏輯判斷,如果為“假”則執(zhí)行,如果為“真”呢?那么循環(huán)直接結(jié)束,循環(huán)體內(nèi)的代碼不被執(zhí)行。在這個(gè)例子里面,每一輪循環(huán)的時(shí)候,程序都要去比較一下x與100的大小,當(dāng)x<=100時(shí),循環(huán)不斷得到執(zhí)行,我們看到的就是s變量每一次都被加上x(chóng),x每一次都被加上1。當(dāng)最后一次x=101時(shí),條件判斷產(chǎn)生了“真”的結(jié)果,循環(huán)結(jié)束,貓直接報(bào)出答案(可以看到s最后加的數(shù)字是100,而不是101)。本節(jié)最后一個(gè)例子,我們要講循環(huán)的嵌套,什么叫循環(huán)的嵌套?循環(huán)里面加循環(huán),就叫嵌套(其實(shí),我們?cè)谏弦还?jié)介紹條件分支時(shí),已經(jīng)用到了嵌套,為了表示出“>、=、<”三種條件,我們?cè)谝粋€(gè)條件分支內(nèi)又加入了條件分支)。程序里,循環(huán)嵌套是非常常用的。一個(gè)簡(jiǎn)單又應(yīng)景的例子是,我們讓貓背誦乘法口訣如何?

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

解釋一下代碼,首先,一個(gè)乘法包含三個(gè)數(shù):乘數(shù)、被乘數(shù)、積。分別用變量x、y、product表示。一個(gè)最簡(jiǎn)單的想法是,我們用兩個(gè)循環(huán)嵌套,分別讓x、y從1變到9,計(jì)算積。可是,我們從小背的乘法口訣里面有1*8,但是卻沒(méi)有8*1這樣的吧?所以,我們得稍微復(fù)雜一點(diǎn)。在外層的循環(huán)里,讓x從1變到9沒(méi)問(wèn)題,所以,外面的循環(huán)我們?cè)O(shè)置的退出條件為x>9,而內(nèi)層循環(huán)里面呢?我們需要讓y從x變到9,退出條件是類似的y>9,但是注意到在內(nèi)層循環(huán)開(kāi)始之前我們需要set y to x,做一個(gè)初始化。
這里,就需要講一個(gè)順序概念,我們看到了循環(huán)嵌套,但是哪個(gè)循環(huán)先被執(zhí)行呢?從程序來(lái)看,不難發(fā)現(xiàn)是內(nèi)層的先被執(zhí)行。每一次內(nèi)層的被執(zhí)行完,退出后,回到外層的循環(huán)體,然后再重新進(jìn)入內(nèi)層,再退出,再重新開(kāi)始。所以,在這個(gè)程序里面,x被加了9次,y呢?被加了9+8+7+6+5+4+3+2+1次。所以最后的結(jié)果呢?如果細(xì)心一點(diǎn),我們會(huì)發(fā)現(xiàn)當(dāng)貓把乘法口訣背完以后,x是10,y也是10。因?yàn)檫@是兩個(gè)循環(huán)都結(jié)束的條件(>9),但是在程序最后用綠色橢圓圈住來(lái)的代碼,我把x、y都設(shè)回了9,為什么?對(duì)小孩子來(lái)說(shuō),看到x是10,y是10,但是積(product)卻是81,大概率會(huì)產(chǎn)生誤導(dǎo)。所以我加了兩句對(duì)程序沒(méi)有任何影響的語(yǔ)句。我想,這也是一種簡(jiǎn)單的user friendly吧,而對(duì)于程序來(lái)講,功能完整準(zhǔn)確,user friendly都應(yīng)該是追求的目標(biāo)。

給家長(zhǎng)的話

實(shí)踐建議

  • 這一節(jié),對(duì)于家長(zhǎng)如何與小朋友共同嘗試,我沒(méi)有特別的建議,按照例子走就好了。循環(huán)當(dāng)然是很重要的概念,循環(huán)也非常難,但是基礎(chǔ)的內(nèi)容,在Scratch里,其實(shí)就是這些,更重要的是小朋友在自己動(dòng)手的嘗試中理解了這些概念,并會(huì)應(yīng)用。

  • 這節(jié)結(jié)束,Scratch,或者說(shuō)一個(gè)編程語(yǔ)言的最基礎(chǔ)的概念,就告一段落了。編程是一個(gè)實(shí)踐性非常強(qiáng)的學(xué)科。從小到大學(xué)了這么多語(yǔ)言,也參加了大大小小的考試或者比賽,從沒(méi)有任何一次會(huì)來(lái)問(wèn)循環(huán)的概念是什么,只會(huì)有兩種形式,一種是給出一段代碼,讓你寫出運(yùn)行結(jié)果,一種是給出一個(gè)問(wèn)題,讓你寫出代碼。只有不斷積累的實(shí)踐,才能讓我們更加知道計(jì)算機(jī)是怎么想的,也才能更容易的讓計(jì)算機(jī)實(shí)現(xiàn)我們想要的。

  • 后面四節(jié),按照我的定義,才算是

    聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過(guò)郵件及時(shí)和我們聯(lián)系刪除

預(yù)約試聽(tīng)課

已有385人預(yù)約都是免費(fèi)的,你也試試吧...

主站蜘蛛池模板: 玛纳斯县| 大名县| 遂川县| 永州市| 萍乡市| 莱芜市| 桐庐县| 鸡东县| 晴隆县| 景泰县| 阳泉市| 隆子县| 花垣县| 富川| 天等县| 雷州市| 综艺| 炉霍县| 蒲江县| 江华| 大兴区| 清河县| 平阳县| 甘洛县| 德保县| 伊春市| 甘南县| 西乌| 定日县| 乌拉特后旗| 嫩江县| 大丰市| 千阳县| 兴安盟| 乐山市| 甘泉县| 会昌县| 美姑县| 宁国市| 柯坪县| 绩溪县|