克隆體是少兒圖像化編程中一塊重要內容。運行克隆指令能產生一個與原角色相同的新角色,原角色稱為本體,新產生角色稱為克隆體。介紹克隆體編程的圖書和文章雖然很多,但是,大多數介紹不全面、不透徹,甚至也有很多謬誤摻雜其中。因此,總結克隆體編程的實踐,將其中規律性的內容進行歸納和提煉就顯得很有必要了。
一、克隆體編程的一般規律
克隆體可以繼承本體除腳本外的幾乎所有屬性,如當前位置、方向、造型、特效等。甚至本體的私有變量克隆體也會繼承下來,私有變量的值與產生克隆體時本體的值相同。「繼承」是面向對象編程技術中的一個重要概念。這種技術使得復用以前的代碼非常容易,能夠大大縮短開發周期,降低開發費用。繼承就是子類繼承父類的特徵和行為,使得子類對象(實例)具有父類的屬性和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。因此,實際上本體是父類實例,克隆體是子類實例。克隆體編程的一般步驟是如圖1所示[1]。首先是執行[克隆自己]指令,然後[當作為克隆體啟動時]事件就會自然發生。在[當作為克隆體啟動時]事件下可以編寫執行各種行為的腳本,例如移動X步,右轉X度等。克隆體的行為執行完後,運行[刪除此克隆體]指令,它就可以退場了。除了[刪除此克隆體]指令可以讓克隆體退場,點擊程序的停止按鈕也會使克隆體瞬間消失。換句話說,克隆體只能在程序運行期間存在,程序停止運行後克隆體會被自動刪除。值得一提的是,克隆體的數量不是無上限的,最多產生301個。這樣的安排也是為了避免小朋友利用克隆體編程時,不斷產生克隆體造成計算機資源被耗盡,最終死機。有了這個限制,就可以盡情嘗試編程的樂趣而沒有當機的後顧之憂了。
二、腳本對克隆體和本體的可見性
圖2中含有[克隆自己]指令的腳本運行後,角色首先將自己顯示出來,然後將大小設置為20-60之間,再移動到隨機位置,旋轉隨機角度。此時,執行[克隆自己]指令就會生成一個與本體大小、位置和旋轉角度完全相同的克隆體,此時克隆體與本體是重疊在一起的。[克隆自己]腳本後面[隱藏]指令只會對本體起作用,並不會使克隆體隱藏。換句話說,在[克隆自己]指令所在的同一個程序塊中,[克隆自己]後面的指令只會對本體起作用,並不對克隆體起作用。那麼,如果我們想指揮克隆體是不是只能通過在[當作為克隆體啟動時]這個事件下編寫腳本才能實現呢?要想知道正確的答案可以通過運行圖3腳本進行驗證。
圖3中腳本運行後,按下空格鍵前只有本體在舞臺上不斷地從一個位置隨機運動到另外一個位置,而克隆體並不運動,效果如圖4所示。按下空格鍵後,克隆體才與本體一樣,開始在舞臺上從一個位置向另一個隨機位置做滑行運動,效果如圖5所示。根據圖3中腳本,克隆體產生前,本體通過[說XXX]指令顯示了「我是克隆體」這句話。但是,程序實際運行時,生成的克隆體並沒有說「我是克隆體」這句話。這是因為克隆體無法繼承本體的內部指令。克隆體產生後,雖然後面腳本還有重複執行[在1秒內滑行到隨機位置]指令,但是該指令顯然只對本體有效,而對克隆體並不起作用。根據程序實際運行效果,克隆體也會響應[當按下空格鍵]事件下的腳本。綜合前面的分析,我們可以得出結論:克隆體不繼承本體的腳本,產生克隆體程序塊後面的腳本對克隆體是不可見的,但是其他程序塊的指令對克隆體和本體都是可見的。因此,克隆體產生後,如果通過其他程序塊的腳本再執行克隆自己指令,克隆體也可以再克隆自己,這種情況下克隆體的產生數量將按指數規律增加。
三、克隆體編程創新方向
Scratch編程愛好者一般都很青睞克隆指令,因為利用它能做出很多頗有創意的效果。其實,總結起來,克隆體編程的創新方向主要包括三個方面。
(1)通過改變克隆指令前本體的造型、位置、特效等屬性
這個方法是初學者最喜歡嘗試的。老師講授克隆體編程後,學生通常會將本體換成水果、氣球、恐龍等其他的角色,然後在這些新的角色上執行克隆自己指令,或者通過增加本體的類型和克隆體的數量,達到一種特別震撼的效果。這些嘗試難度不高,對激發學生的興趣和學習積極性是特別有好處的。
(2)通過[當作為克隆體啟動時]事件下的腳本設定克隆體啟動後的運動效果
在[當作為克隆體啟動時]事件下編寫腳本設定克隆體啟動後的運動效果,如果再配合本體的運動,能夠創造出很多有意思的程序效果。圖4程序腳本就是這個創新方向的典型案例。程序腳本運行後,本體從舞臺中心不斷產生克隆體,而克隆體會按照啟動時的方向持續移動一段距離,移動的同時增加自身的大小,然後刪除。當同時存在的克隆體較多時就形成了一種從舞臺中心沿徑向旋轉運動的效果,如圖7所示。
(3)通過設置克隆體與本體、滑鼠、鍵盤或其他角色之間互動
克隆體產生後,可以編寫腳本使克隆體能夠響應本體、滑鼠、鍵盤和其他角色等的交互,這樣就能夠使克隆體更加智能化,使程序更加有趣。有人利用這種原理製作了成排的外星人克隆體,並且這些克隆體能向飛船角色不斷靠近,與飛船發射的子彈克隆體進行交互[2]。貪吃蛇遊戲中,利用克隆體與本體的互動,實現了蛇頭碰到蛇身體就停止遊戲的效果[2]。筆者利用克隆體與滑鼠之間的交互,實現了排斥力場的效果,腳本如圖8所示。圖8 腳本運行後,在舞臺區首先產生200個克隆體。然後,滑鼠在舞臺上移動式,克隆體距離滑鼠距離小於50就會產生排斥力作用,使克隆體向滑鼠相反方向移動,效果如圖9所示。圖10抗擊新冠遊戲是也是使用了病毒克隆體和藥水克隆體之間的交互。
四、克隆體精準控制
很多時候,我們需要控制克隆體按一定的數學或者物理規律運動。要對克隆體進行如此精準地控制,就必須對克隆體進行編號。對克隆體進行編號的原理就是利用了克隆體能夠繼承本體私有變量的特點。在克隆體編程中,如果需要對克隆體精準控制,需要事先設置兩個變量,其中一個為適用於所有角色(公共變量),另外一個是僅適用於當前角色(私有變量);私有變量作為克隆體的編號,公共變量用於給編號賦值。給克隆體編號的方法有兩種:第一種方法是[克隆自己]指令執行之前,將本體編號設置為克隆體編號預期值,然後克隆體的編號也會和本體數值一樣,如圖11腳本所示;第二種方法是本體的編號不變,當每一個克隆體啟動時將公共變量設置為克隆體編號的預期值,然後將編號設置為公共變量值,如圖11腳本所示。圖11和圖12兩種方法運行後得到的程序效果是一樣的,如圖13所示。但是兩種方法完成克隆體編程後,本體的編號是不同的。如果編程中需要使用本體的編號,則應該認識到上述兩種方法完成克隆體編號後本體最終編號的不同。
給克隆體進行編號後,就可以根據編號精準控制克隆體了。本體生成不同若干大小不一的克隆體,根據克隆體編號調用他們,可以使他們按照大小進行排序[3](效果如圖14所示),演示各種排序算法[4](效果如圖15所示),動態組合出數學函數曲線[5](效果如圖16所示),還可以使克隆體按照正態分布運動,並模擬病毒傳播的過程[6] (效果如圖17所示)。
五、結論
(1)克隆體繼承本體的位置、方向、造型、特效,甚至私有變量等,但是不繼承本體的腳本。可以通過在[當作為克隆體啟動時]事件下編寫腳本使克隆體執行各種行為。克隆體數量的上限是301個。
(2)克隆體不繼承本體的腳本,產生克隆體程序塊後面的腳本對克隆體是不可見的,但是其他程序塊的指令對克隆體和本體都是可見的。
(3)克隆體編程可以通過改變執行克隆指令前本體的造型、位置、特效等屬性;在[當作為克隆體啟動時]事件下腳本設定克隆體啟動後的運動效果;使克隆體與本體、滑鼠、鍵盤或其他角色互動三個方面進行創新。
(4)為了精準控制克隆體,必須對克隆體編號。克隆體編號可以在克隆指令前通過改變本體的編號實現,也可以在克隆體啟動時給克隆體編號。兩種方法的區別在於克隆體編號完成後本體的編號不同。
參考文獻
[1]湯老師教你學Scratch編程.五顏六色的泡泡-無編號克隆[EB/OL].[2020-12-18].
https://mp.weixin.qq.com/s/qKSVN8hr9YxYSL7SIXZMfQ
[2]Derek Breen.達人迷·Scratch趣味編程16例[M].北京:人民郵電出版社,2017:231,277-286.
[3]湯老師教你學Scratch編程.小螃蟹排排隊-生成和操作克隆體[EB/OL].[2019-11-13].
https://mp.weixin.qq.com/s/Hl4HZxGWfuIV9ieq0rKvgg
[4]湯老師教你學Scratch編程. Scratch不能實現冒泡法和選擇法排序?[EB/OL].[2019-12-03].
https://mp.weixin.qq.com/s/D58z6v8QYlqlF_Wi1Y4i6w
[5] 6湯老師教你學Scratch編程.數學之美-動態變化正弦曲線[EB/OL].[2019-12-03].
https://mp.weixin.qq.com/s/7MHsLThfU94CUUdR76saiw
[6]湯老師教你學Scratch編程.編程告訴你新型冠狀病毒肺炎怎麼傳播[EB/OL].[2020-02-13].
https://mp.weixin.qq.com/s/d-uUpBtaT23YQcJp65azNw