資訊內(nèi)容
Scratch全國少兒編程競賽獲獎(jiǎng)作品《穿越時(shí)空的大戰(zhàn)》解析下篇
Scratch全國少兒編程競賽
獲獎(jiǎng)作品解析《穿越時(shí)空的大戰(zhàn)》
本文介紹的作品是全國青少年創(chuàng)意編程與智能設(shè)計(jì)大賽創(chuàng)意編程比賽一等獎(jiǎng)獲得者齊嘉懿同學(xué)的參賽作品。
作品說明
游戲主人公在名偵探柯南的幫助下,體驗(yàn)了最新的科技發(fā)明——AI機(jī)器人和時(shí)光機(jī)。乘坐時(shí)光機(jī)回到過去之后,在AI監(jiān)測系統(tǒng)的幫助下,還原出了事實(shí)的真相,并成功帶領(lǐng)自家花園里的植物利用高科技裝備戰(zhàn)勝僵尸,保衛(wèi)家園的故事。
游戲中運(yùn)用到了變量、循環(huán)嵌套、克隆體、列表、字符串連接等功能,并用到了多種算法,包括遍歷算法、排序算法、求和、求平均值和最值等算法。
另外,游戲中還有很多原創(chuàng)的角色,如太陽花,AI防御網(wǎng)等。

在上一篇文章中,我們完成了名偵探柯南發(fā)出的能量收集的任務(wù),開啟了時(shí)光機(jī),接下來我們就要穿越時(shí)空回到過去,參與一場僵尸反入侵的戰(zhàn)斗,保衛(wèi)媽媽的臥室。大戰(zhàn)即將開始,你準(zhǔn)備好了嗎,快點(diǎn)乘上時(shí)光機(jī)吧!
點(diǎn)擊“乘坐時(shí)光機(jī)”按鈕之后,游戲立即切換到時(shí)光機(jī)的場景,我們的游戲主角乘坐時(shí)光機(jī)正在穿越時(shí)空。咦,這段臺(tái)詞怎么這么熟悉?
時(shí)光機(jī)著陸之后,入侵者立刻來襲。唉?這不就是植物大戰(zhàn)僵尸嗎!哈哈,相信同學(xué)們一定都玩過這個(gè)游戲,這里原來就是簡化版的植物大戰(zhàn)僵尸呀。大家都會(huì)玩這個(gè)游戲,但是可不一定知道如何用Scratch來制作出這個(gè)游戲。那接下來,果凍老師就和大家一起看看這個(gè)游戲是如何實(shí)現(xiàn)的吧。
當(dāng)背景換成草坪植物大戰(zhàn)僵尸的游戲背景是一片草坪,所以僵尸呀、土豆呀、太陽呀都會(huì)響應(yīng)背景換成草坪這個(gè)事件。
不用老師介紹,大家肯定知道這些都是植物大戰(zhàn)僵尸游戲中的角色。首先我們來看游戲中最重要的角色:僵尸。它們一個(gè)接一個(gè)的從屏幕右側(cè)出現(xiàn)并向左移動(dòng),最終的目的就是進(jìn)入并搞亂媽媽的房間。
游戲開始后,每隔3秒克隆一個(gè)普通僵尸,一共克隆出10個(gè)。
僵尸一波一波的很可怕,我們必須抓緊時(shí)間消滅它們,在僵尸行走的過程中,我們有兩種方法可以消滅它們,第一種方法就是使用堅(jiān)果:
代碼中設(shè)置了移到x:238,所以僵尸會(huì)固定的出現(xiàn)在屏幕的右側(cè),但是y坐標(biāo)設(shè)置為-121和107之間的隨機(jī)數(shù),所以僵尸在縱向上是隨機(jī)出現(xiàn)的,它會(huì)朝屏幕左側(cè)一直行走,每一次行走的步數(shù)也是在5步到10步之間隨機(jī)的,所以僵尸的速度有快有慢,行走的過程中如果被堅(jiān)果砸到,那么僵尸數(shù)量這個(gè)變量的值就會(huì)減1,代表這個(gè)僵尸被消滅掉了。
如果僵尸走到屏幕最左邊了還沒有碰到堅(jiān)果,那么清除車就會(huì)出動(dòng)推走僵尸,這是消滅僵尸的另一種方法,但是每一行只有一個(gè)清除車,出動(dòng)一次就會(huì)少一個(gè)。
我們知道了使用堅(jiān)果可以消滅僵尸,那堅(jiān)果是如何產(chǎn)生的呢?這就涉及到了其中的這幾個(gè)角色:
太陽花每隔一段時(shí)間會(huì)產(chǎn)生小太陽,收集小太陽到陽光銀行(SunBank)中,通過陽光銀行可以購買堅(jiān)果卡片,點(diǎn)擊堅(jiān)果卡片就會(huì)變成堅(jiān)果。這是正常產(chǎn)生堅(jiān)果的邏輯,但是由于我們參加的并不是游戲制作比賽,所以簡化版的游戲中收集太陽花和購買堅(jiān)果卡片都是電腦自動(dòng)運(yùn)行的。
那需要我們寫代碼實(shí)現(xiàn)的就是產(chǎn)生小太陽和卡片變堅(jiān)果的這兩個(gè)過程了。
首先來看產(chǎn)生小太陽的代碼。
游戲開始后,每隔1至2秒就會(huì)產(chǎn)生一朵小太陽,并且這朵小太陽從太陽花的位置向上飛到陽光銀行的位置。
小太陽通過滑行語句飛向陽光銀行,然后增加了sun變量的值,最后消失。
卡片變堅(jiān)果的代碼就稍稍有點(diǎn)復(fù)雜了,代碼中需要完成鼠標(biāo)點(diǎn)擊的判斷以及土豆?jié)L動(dòng)撞擊消滅僵尸的效果。
游戲開始后,每間隔3秒鐘會(huì)自動(dòng)克隆出一張堅(jiān)果卡片:
堅(jiān)果卡片會(huì)沿著頂部的卡片框一直向右滑動(dòng),直到移動(dòng)到右邊框或者碰到其它的卡片才停止下來。
在重復(fù)執(zhí)行的語句里面有一條等待的語句,這條等待語句的條件是角色X坐標(biāo)>60(移動(dòng)到方框的最右邊)或者碰到灰色(碰到其它卡片)不成立,也就是說如果條件不成立,就會(huì)一直運(yùn)行重復(fù)執(zhí)行語句,卡片會(huì)一直向右移動(dòng)。而當(dāng)?shù)却Z句的條件成立時(shí),代碼就會(huì)運(yùn)行到等待語句這里停止不再執(zhí)行重復(fù)語句,也就是說卡片會(huì)停下不再移動(dòng)了。
如果我們繼續(xù)用鼠標(biāo)點(diǎn)擊堅(jiān)果卡片的話,就會(huì)觸發(fā)克隆堅(jiān)果的命令:
克隆的代碼很簡單,僅僅將堅(jiān)果顯示出來。
而真正的處理邏輯代碼是寫在wall-nut這個(gè)廣播中的。
wall-nut廣播是點(diǎn)擊堅(jiān)果卡片后發(fā)出的,鼠標(biāo)松開后,首先堅(jiān)果初始化顯示第一個(gè)造型,并且在點(diǎn)擊鼠標(biāo)前一直跟隨著鼠標(biāo)的位置移動(dòng)。在重復(fù)執(zhí)行語句中拖入移到鼠標(biāo)指針語句就可以實(shí)現(xiàn)角色跟隨鼠標(biāo)的效果。
當(dāng)我們再次點(diǎn)擊鼠標(biāo)后,堅(jiān)果通過移到XY語句在鼠標(biāo)指針的位置處放下,但是這里沒有完全按照鼠標(biāo)指針的位置放置,堅(jiān)果的X坐標(biāo)通過了一個(gè)四舍五入和乘除的運(yùn)算語句稍稍前移了一下,這樣堅(jiān)果的初始位置會(huì)更加的合理。
接下來,在代碼中嵌套了兩個(gè)如果那么語句,第一個(gè)如果那么語句判斷堅(jiān)果的位置不能放在舞臺(tái)的邊緣,第二個(gè)如果那么語句判斷堅(jiān)果的位置必須是在紅線的左邊,如果這兩個(gè)條件不滿足的話,就不會(huì)執(zhí)行它們里面的語句。
它們里面放置了一個(gè)重復(fù)執(zhí)行語句,這個(gè)重復(fù)執(zhí)行語句的作用就是讓堅(jiān)果不停的向右滾動(dòng),直到舞臺(tái)右側(cè)。向右移動(dòng)通過移動(dòng)5步語句實(shí)現(xiàn),滾動(dòng)的效果通過不斷切換下一個(gè)造型實(shí)現(xiàn),要注意的是,如果堅(jiān)果變到了最后一個(gè)造型的話,我們需要手動(dòng)再將它切換到第一個(gè)造型,這樣堅(jiān)果的滾動(dòng)效果才會(huì)是循環(huán)不停的。在舞臺(tái)的最右側(cè)有一個(gè)黃色的豎線角色,重復(fù)執(zhí)行語句的條件就是判斷堅(jiān)果是否碰到了這條黃色豎線,如果碰到了就結(jié)束重復(fù)執(zhí)行語句,繼續(xù)執(zhí)行后面的隱藏語句,將堅(jiān)果隱藏掉。
堅(jiān)果滾動(dòng)過程中碰到僵尸的代碼邏輯我們在僵尸角色中已經(jīng)介紹過了。
好了,以上就是產(chǎn)生太陽、收集堅(jiān)果卡片、使用堅(jiān)果消滅僵尸的整個(gè)過程,經(jīng)過老師的介紹,游戲的過程是不是就很清晰了?相信同學(xué)們對代碼都已經(jīng)搞明白了,如果還有不懂的地方可以再返回去多看看幾遍。
游戲中一共會(huì)出現(xiàn)20個(gè)僵尸,當(dāng)我們把這些僵尸都消滅完后,游戲的難度會(huì)提升,接著出現(xiàn)好多的僵尸坦克,這些坦克的速度可比僵尸快多了,堅(jiān)果對于坦克來說無疑是雞蛋碰石頭,毫無作用,所以我們推出威力巨大的椰子大炮,發(fā)射椰子炮彈來消滅坦克。
坦克來啦
以上就是坦克大戰(zhàn)所涉及到的角色,其中僵尸坦克角色與上面僵尸的代碼非常類似,而椰子炮-炮架子角色的代碼則非常簡單,就不在這講解它們了。而剩下的兩個(gè)角色炮筒和炮彈老師則要說一說。
在堅(jiān)果卡片的代碼中,我們知道要讓一個(gè)角色隨著鼠標(biāo)移動(dòng)可以在重復(fù)執(zhí)行語句中加入一個(gè)移到鼠標(biāo)指針的語句。如果角色不是隨著鼠標(biāo)移動(dòng)而是要它固定在某個(gè)位置只是面向鼠標(biāo)指針的位置轉(zhuǎn)動(dòng)該怎么做呢?有同學(xué)想到了,就是把移到鼠標(biāo)指針語句換成面向鼠標(biāo)指針語句:
這樣,炮筒就會(huì)固定在舞臺(tái)區(qū)的左側(cè),并且隨著鼠標(biāo)指針的位置轉(zhuǎn)動(dòng),隨時(shí)準(zhǔn)備著朝向鼠標(biāo)的位置發(fā)射炮彈。
哇,坦克來的好快啊!我們必須趕緊消滅它們!
點(diǎn)擊鼠標(biāo)之后,代碼會(huì)克隆出一顆炮彈,然后這顆炮彈會(huì)從炮筒的位置向鼠標(biāo)指針的位置發(fā)射出去,如果炮彈在運(yùn)行的過程中碰到了坦克就會(huì)將坦克消滅掉,最后它觸碰到舞臺(tái)的邊緣后被刪除,這顆炮彈的使命就完成了。
二十幾輛僵尸坦克來勢洶洶,看似威猛,但是在我們的一頓操作之下也都被消滅掉了。
巨人僵尸出現(xiàn)可是,游戲并沒有結(jié)束,屏幕右側(cè)又走出來一個(gè)巨人僵尸,什么!居然還有終極Boss,這是要挑戰(zhàn)我們的手速嗎?可是,無論我們點(diǎn)擊鼠標(biāo)、鍵盤如何操作都沒有反應(yīng),只能眼睜睜的看著這個(gè)巨人僵尸走過來一顆一顆的吞噬掉我們的堅(jiān)果。
巨人僵尸一步步的向房間靠近,遇到堅(jiān)果(每個(gè)堅(jiān)果的右側(cè)都有一個(gè)藍(lán)色的小點(diǎn))就將它吃掉,我們只能在一旁看著悲劇發(fā)生,束手無策,這可怎么辦呀?
突然,游戲主角想到,在他乘坐時(shí)光機(jī)的時(shí)候,名偵探柯南同時(shí)為他帶來了一件巨型的防御武器,名字好像叫做AI防御網(wǎng),面對這個(gè)無法控制的巨人僵尸,是時(shí)候請出這個(gè)終極武器了!
這個(gè)防御網(wǎng)呢,實(shí)際上是一個(gè)五邊形多層網(wǎng)狀結(jié)構(gòu)圖案,是通過Scratch軟件的畫筆擴(kuò)展模塊繪制出來的,圖案的樣子是這樣:
它由五個(gè)五邊形組成了一個(gè)花瓣的圖案,然后由內(nèi)向外一層一層堆疊起來。那如何使用代碼來畫出這樣的圖案呢,下面我們就一步一步來實(shí)現(xiàn)它。
第一步,定義好邊數(shù)、層數(shù)、角度這三個(gè)變量的值。
邊數(shù)設(shè)置我們要畫的圖案是幾邊形,每一層幾個(gè)圖案,很明顯我們的圖案是五邊形,每一層都有五個(gè)。
層數(shù)設(shè)置圖案一共重復(fù)繪制幾次,這里重復(fù)6次,也就是說有6層。
角度設(shè)置畫筆在畫第一筆時(shí)所面向的方向。
在繪制的過程中還涉及到一個(gè)變量,叫做邊長,它設(shè)置五邊形每個(gè)邊的長度,并且每繪制一層這個(gè)邊長的值就會(huì)增大,這樣五邊形一層就比一層的大。
第二步,使用畫筆畫出一個(gè)五邊形。
代碼中,有一個(gè)重復(fù)執(zhí)行語句,它里面的移動(dòng)邊長步語句可以畫出一條線,畫完后畫筆向左旋轉(zhuǎn)360÷5=72度,這樣重復(fù)執(zhí)行5次,就完成了一個(gè)五邊形的繪制。
第三步,在這個(gè)重復(fù)執(zhí)行的外面再套一層重復(fù)執(zhí)行,每畫完一個(gè)五邊形畫筆同樣左轉(zhuǎn)72度。
這樣,五個(gè)五邊形就組成了一個(gè)類似花瓣的圖案。
第四步,在兩層重復(fù)執(zhí)行的外面再嵌套一層重復(fù)執(zhí)行,這次重復(fù)的次數(shù)是變量層數(shù)的值,也就是說我們要畫出6層的花瓣圖案。
每一層五邊形的顏色與邊長一樣也是變化的,這樣,強(qiáng)大的AI防御網(wǎng)最終就繪制完成了,代碼最后廣播巨人僵尸死去,可怕的終極Boss終于被我們收拾掉了,激烈的反入侵戰(zhàn)斗也停止了,我們完成了名偵探柯南賦予的任務(wù),成功的保衛(wèi)住了媽媽的房間!
在這篇文章中,我們學(xué)習(xí)了《穿越時(shí)空的大戰(zhàn)》這部作品的后半部分,這部分內(nèi)容雖然不像上半部分內(nèi)容那樣有各種各樣讓人驚訝的編程技術(shù)和效果,但是它為我們展示了一個(gè)完整的植物大戰(zhàn)僵尸游戲的開發(fā)過程,這個(gè)過程中使用了很多的判斷語句,很多的重復(fù)執(zhí)行語句,還有各種的廣播、變量這些角色連接的方式,通過這個(gè)過程充分展現(xiàn)了參賽者的邏輯思維能力。何時(shí)僵尸應(yīng)該上場,何時(shí)坦克應(yīng)該出現(xiàn),如何使用堅(jiān)果消滅僵尸,如何繪制防御網(wǎng)的圖案,同學(xué)們不要小看這些內(nèi)容,如果說上篇文章是編程特技的展示,那這篇文章才是編程基本功的體現(xiàn),這些基本功看似平淡無奇,卻不是一天兩天能練成的,千里之行始于足下,沒有扎實(shí)的基本功就無法走的更遠(yuǎn),要想獲得全國比賽的一等獎(jiǎng),努力學(xué)好這篇文章的內(nèi)容才是最應(yīng)該的,加油吧,同學(xué)們!
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時(shí)和我們聯(lián)系刪除

- 上一篇
scratch編程之貪吃蛇
導(dǎo)語:貪吃蛇是經(jīng)典的游戲之一,從掌上游戲機(jī)到前段時(shí)間流行的貪吃蛇大戰(zhàn),這款游戲熱度未減。在制作貪吃蛇游戲中,我們需要理解“克隆體”的特點(diǎn),學(xué)會(huì)如何合理有效地使用“克隆體”。 貪吃蛇的游戲除去開始動(dòng)畫、結(jié)束動(dòng)畫、分?jǐn)?shù)累計(jì)等環(huán)節(jié),最重要的是利用方向鍵控制蛇的移動(dòng)以及蛇身的變長的實(shí)現(xiàn)。分解一下
- 下一篇
少兒創(chuàng)意編程(特36)scratch繪圖等級(jí)考試40關(guān)
最近關(guān)于編程的各種等級(jí)考試層出不窮,有計(jì)算機(jī)學(xué)會(huì)的,有電子學(xué)會(huì)的,有工信部(藍(lán)橋杯)的,有青少年宮協(xié)會(huì)(中少童創(chuàng))的,有軟件行業(yè)協(xié)會(huì)(編程貓)的……好不熱鬧!在謝聲濤老師的三言學(xué)堂微信群里,也搞了個(gè)編程繪圖等級(jí)考試40關(guān),大家可以來挑戰(zhàn)一下!