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

在上一篇文章中,我們完成了名偵探柯南發(fā)出的能量收集的任務(wù),開(kāi)啟了時(shí)光機(jī),接下來(lái)我們就要穿越時(shí)空回到過(guò)去,參與一場(chǎng)僵尸反入侵的戰(zhàn)斗,保衛(wèi)媽媽的臥室。大戰(zhàn)即將開(kāi)始,你準(zhǔn)備好了嗎,快點(diǎn)乘上時(shí)光機(jī)吧!

點(diǎn)擊“乘坐時(shí)光機(jī)”按鈕之后,游戲立即切換到時(shí)光機(jī)的場(chǎng)景,我們的游戲主角乘坐時(shí)光機(jī)正在穿越時(shí)空。咦,這段臺(tái)詞怎么這么熟悉?

時(shí)光機(jī)著陸之后,入侵者立刻來(lái)襲。唉?這不就是植物大戰(zhàn)僵尸嗎!哈哈,相信同學(xué)們一定都玩過(guò)這個(gè)游戲,這里原來(lái)就是簡(jiǎn)化版的植物大戰(zhàn)僵尸呀。大家都會(huì)玩這個(gè)游戲,但是可不一定知道如何用Scratch來(lái)制作出這個(gè)游戲。那接下來(lái),果凍老師就和大家一起看看這個(gè)游戲是如何實(shí)現(xiàn)的吧。
當(dāng)背景換成草坪植物大戰(zhàn)僵尸的游戲背景是一片草坪,所以僵尸呀、土豆呀、太陽(yáng)呀都會(huì)響應(yīng)背景換成草坪這個(gè)事件。

不用老師介紹,大家肯定知道這些都是植物大戰(zhàn)僵尸游戲中的角色。首先我們來(lái)看游戲中最重要的角色:僵尸。它們一個(gè)接一個(gè)的從屏幕右側(cè)出現(xiàn)并向左移動(dòng),最終的目的就是進(jìn)入并搞亂媽媽的房間。

游戲開(kāi)始后,每隔3秒克隆一個(gè)普通僵尸,一共克隆出10個(gè)。
僵尸一波一波的很可怕,我們必須抓緊時(shí)間消滅它們,在僵尸行走的過(guò)程中,我們有兩種方法可以消滅它們,第一種方法就是使用堅(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ī)的,所以僵尸的速度有快有慢,行走的過(guò)程中如果被堅(jiān)果砸到,那么僵尸數(shù)量這個(gè)變量的值就會(huì)減1,代表這個(gè)僵尸被消滅掉了。
如果僵尸走到屏幕最左邊了還沒(méi)有碰到堅(jiān)果,那么清除車就會(huì)出動(dòng)推走僵尸,這是消滅僵尸的另一種方法,但是每一行只有一個(gè)清除車,出動(dòng)一次就會(huì)少一個(gè)。

我們知道了使用堅(jiān)果可以消滅僵尸,那堅(jiān)果是如何產(chǎn)生的呢?這就涉及到了其中的這幾個(gè)角色:

太陽(yáng)花每隔一段時(shí)間會(huì)產(chǎn)生小太陽(yáng),收集小太陽(yáng)到陽(yáng)光銀行(SunBank)中,通過(guò)陽(yáng)光銀行可以購(gòu)買堅(jiān)果卡片,點(diǎn)擊堅(jiān)果卡片就會(huì)變成堅(jiān)果。這是正常產(chǎn)生堅(jiān)果的邏輯,但是由于我們參加的并不是游戲制作比賽,所以簡(jiǎn)化版的游戲中收集太陽(yáng)花和購(gòu)買堅(jiān)果卡片都是電腦自動(dòng)運(yùn)行的。
那需要我們寫代碼實(shí)現(xiàn)的就是產(chǎn)生小太陽(yáng)和卡片變堅(jiān)果的這兩個(gè)過(guò)程了。
首先來(lái)看產(chǎn)生小太陽(yáng)的代碼。

游戲開(kāi)始后,每隔1至2秒就會(huì)產(chǎn)生一朵小太陽(yáng),并且這朵小太陽(yáng)從太陽(yáng)花的位置向上飛到陽(yáng)光銀行的位置。

小太陽(yáng)通過(guò)滑行語(yǔ)句飛向陽(yáng)光銀行,然后增加了sun變量的值,最后消失。
卡片變堅(jiān)果的代碼就稍稍有點(diǎn)復(fù)雜了,代碼中需要完成鼠標(biāo)點(diǎn)擊的判斷以及土豆?jié)L動(dòng)撞擊消滅僵尸的效果。
游戲開(kāi)始后,每間隔3秒鐘會(huì)自動(dòng)克隆出一張堅(jiān)果卡片:

堅(jiān)果卡片會(huì)沿著頂部的卡片框一直向右滑動(dòng),直到移動(dòng)到右邊框或者碰到其它的卡片才停止下來(lái)。

在重復(fù)執(zhí)行的語(yǔ)句里面有一條等待的語(yǔ)句,這條等待語(yǔ)句的條件是角色X坐標(biāo)>60(移動(dòng)到方框的最右邊)或者碰到灰色(碰到其它卡片)不成立,也就是說(shuō)如果條件不成立,就會(huì)一直運(yùn)行重復(fù)執(zhí)行語(yǔ)句,卡片會(huì)一直向右移動(dòng)。而當(dāng)?shù)却Z(yǔ)句的條件成立時(shí),代碼就會(huì)運(yùn)行到等待語(yǔ)句這里停止不再執(zhí)行重復(fù)語(yǔ)句,也就是說(shuō)卡片會(huì)停下不再移動(dòng)了。
如果我們繼續(xù)用鼠標(biāo)點(diǎn)擊堅(jiān)果卡片的話,就會(huì)觸發(fā)克隆堅(jiān)果的命令:

克隆的代碼很簡(jiǎn)單,僅僅將堅(jiān)果顯示出來(lái)。

而真正的處理邏輯代碼是寫在wall-nut這個(gè)廣播中的。

wall-nut廣播是點(diǎn)擊堅(jiān)果卡片后發(fā)出的,鼠標(biāo)松開(kāi)后,首先堅(jiān)果初始化顯示第一個(gè)造型,并且在點(diǎn)擊鼠標(biāo)前一直跟隨著鼠標(biāo)的位置移動(dòng)。在重復(fù)執(zhí)行語(yǔ)句中拖入移到鼠標(biāo)指針語(yǔ)句就可以實(shí)現(xiàn)角色跟隨鼠標(biāo)的效果。
當(dāng)我們?cè)俅吸c(diǎn)擊鼠標(biāo)后,堅(jiān)果通過(guò)移到XY語(yǔ)句在鼠標(biāo)指針的位置處放下,但是這里沒(méi)有完全按照鼠標(biāo)指針的位置放置,堅(jiān)果的X坐標(biāo)通過(guò)了一個(gè)四舍五入和乘除的運(yùn)算語(yǔ)句稍稍前移了一下,這樣堅(jiān)果的初始位置會(huì)更加的合理。
接下來(lái),在代碼中嵌套了兩個(gè)如果那么語(yǔ)句,第一個(gè)如果那么語(yǔ)句判斷堅(jiān)果的位置不能放在舞臺(tái)的邊緣,第二個(gè)如果那么語(yǔ)句判斷堅(jiān)果的位置必須是在紅線的左邊,如果這兩個(gè)條件不滿足的話,就不會(huì)執(zhí)行它們里面的語(yǔ)句。
它們里面放置了一個(gè)重復(fù)執(zhí)行語(yǔ)句,這個(gè)重復(fù)執(zhí)行語(yǔ)句的作用就是讓堅(jiān)果不停的向右滾動(dòng),直到舞臺(tái)右側(cè)。向右移動(dòng)通過(guò)移動(dòng)5步語(yǔ)句實(shí)現(xiàn),滾動(dòng)的效果通過(guò)不斷切換下一個(gè)造型實(shí)現(xiàn),要注意的是,如果堅(jiān)果變到了最后一個(gè)造型的話,我們需要手動(dòng)再將它切換到第一個(gè)造型,這樣堅(jiān)果的滾動(dòng)效果才會(huì)是循環(huán)不停的。在舞臺(tái)的最右側(cè)有一個(gè)黃色的豎線角色,重復(fù)執(zhí)行語(yǔ)句的條件就是判斷堅(jiān)果是否碰到了這條黃色豎線,如果碰到了就結(jié)束重復(fù)執(zhí)行語(yǔ)句,繼續(xù)執(zhí)行后面的隱藏語(yǔ)句,將堅(jiān)果隱藏掉。
堅(jiān)果滾動(dòng)過(guò)程中碰到僵尸的代碼邏輯我們?cè)诮┦巧幸呀?jīng)介紹過(guò)了。
好了,以上就是產(chǎn)生太陽(yáng)、收集堅(jiān)果卡片、使用堅(jiān)果消滅僵尸的整個(gè)過(guò)程,經(jīng)過(guò)老師的介紹,游戲的過(guò)程是不是就很清晰了?相信同學(xué)們對(duì)代碼都已經(jīng)搞明白了,如果還有不懂的地方可以再返回去多看看幾遍。

游戲中一共會(huì)出現(xiàn)20個(gè)僵尸,當(dāng)我們把這些僵尸都消滅完后,游戲的難度會(huì)提升,接著出現(xiàn)好多的僵尸坦克,這些坦克的速度可比僵尸快多了,堅(jiān)果對(duì)于坦克來(lái)說(shuō)無(wú)疑是雞蛋碰石頭,毫無(wú)作用,所以我們推出威力巨大的椰子大炮,發(fā)射椰子炮彈來(lái)消滅坦克。
坦克來(lái)啦

以上就是坦克大戰(zhàn)所涉及到的角色,其中僵尸坦克角色與上面僵尸的代碼非常類似,而椰子炮-炮架子角色的代碼則非常簡(jiǎn)單,就不在這講解它們了。而剩下的兩個(gè)角色炮筒和炮彈老師則要說(shuō)一說(shuō)。
在堅(jiān)果卡片的代碼中,我們知道要讓一個(gè)角色隨著鼠標(biāo)移動(dòng)可以在重復(fù)執(zhí)行語(yǔ)句中加入一個(gè)移到鼠標(biāo)指針的語(yǔ)句。如果角色不是隨著鼠標(biāo)移動(dòng)而是要它固定在某個(gè)位置只是面向鼠標(biāo)指針的位置轉(zhuǎn)動(dòng)該怎么做呢?有同學(xué)想到了,就是把移到鼠標(biāo)指針語(yǔ)句換成面向鼠標(biāo)指針語(yǔ)句:

這樣,炮筒就會(huì)固定在舞臺(tái)區(qū)的左側(cè),并且隨著鼠標(biāo)指針的位置轉(zhuǎn)動(dòng),隨時(shí)準(zhǔn)備著朝向鼠標(biāo)的位置發(fā)射炮彈。

哇,坦克來(lái)的好快啊!我們必須趕緊消滅它們!

點(diǎn)擊鼠標(biāo)之后,代碼會(huì)克隆出一顆炮彈,然后這顆炮彈會(huì)從炮筒的位置向鼠標(biāo)指針的位置發(fā)射出去,如果炮彈在運(yùn)行的過(guò)程中碰到了坦克就會(huì)將坦克消滅掉,最后它觸碰到舞臺(tái)的邊緣后被刪除,這顆炮彈的使命就完成了。

二十幾輛僵尸坦克來(lái)勢(shì)洶洶,看似威猛,但是在我們的一頓操作之下也都被消滅掉了。
巨人僵尸出現(xiàn)可是,游戲并沒(méi)有結(jié)束,屏幕右側(cè)又走出來(lái)一個(gè)巨人僵尸,什么!居然還有終極Boss,這是要挑戰(zhàn)我們的手速嗎?可是,無(wú)論我們點(diǎn)擊鼠標(biāo)、鍵盤如何操作都沒(méi)有反應(yīng),只能眼睜睜的看著這個(gè)巨人僵尸走過(guò)來(lái)一顆一顆的吞噬掉我們的堅(jiān)果。

巨人僵尸一步步的向房間靠近,遇到堅(jiān)果(每個(gè)堅(jiān)果的右側(cè)都有一個(gè)藍(lán)色的小點(diǎn))就將它吃掉,我們只能在一旁看著悲劇發(fā)生,束手無(wú)策,這可怎么辦呀?
突然,游戲主角想到,在他乘坐時(shí)光機(jī)的時(shí)候,名偵探柯南同時(shí)為他帶來(lái)了一件巨型的防御武器,名字好像叫做AI防御網(wǎng),面對(duì)這個(gè)無(wú)法控制的巨人僵尸,是時(shí)候請(qǐng)出這個(gè)終極武器了!

這個(gè)防御網(wǎng)呢,實(shí)際上是一個(gè)五邊形多層網(wǎng)狀結(jié)構(gòu)圖案,是通過(guò)Scratch軟件的畫筆擴(kuò)展模塊繪制出來(lái)的,圖案的樣子是這樣:

它由五個(gè)五邊形組成了一個(gè)花瓣的圖案,然后由內(nèi)向外一層一層堆疊起來(lái)。那如何使用代碼來(lái)畫出這樣的圖案呢,下面我們就一步一步來(lái)實(shí)現(xiàn)它。
第一步,定義好邊數(shù)、層數(shù)、角度這三個(gè)變量的值。

邊數(shù)設(shè)置我們要畫的圖案是幾邊形,每一層幾個(gè)圖案,很明顯我們的圖案是五邊形,每一層都有五個(gè)。
層數(shù)設(shè)置圖案一共重復(fù)繪制幾次,這里重復(fù)6次,也就是說(shuō)有6層。
角度設(shè)置畫筆在畫第一筆時(shí)所面向的方向。
在繪制的過(guò)程中還涉及到一個(gè)變量,叫做邊長(zhǎng),它設(shè)置五邊形每個(gè)邊的長(zhǎng)度,并且每繪制一層這個(gè)邊長(zhǎng)的值就會(huì)增大,這樣五邊形一層就比一層的大。
第二步,使用畫筆畫出一個(gè)五邊形。

代碼中,有一個(gè)重復(fù)執(zhí)行語(yǔ)句,它里面的移動(dòng)邊長(zhǎng)步語(yǔ)句可以畫出一條線,畫完后畫筆向左旋轉(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ù)的值,也就是說(shuō)我們要畫出6層的花瓣圖案。

每一層五邊形的顏色與邊長(zhǎng)一樣也是變化的,這樣,強(qiáng)大的AI防御網(wǎng)最終就繪制完成了,代碼最后廣播巨人僵尸死去,可怕的終極Boss終于被我們收拾掉了,激烈的反入侵戰(zhàn)斗也停止了,我們完成了名偵探柯南賦予的任務(wù),成功的保衛(wèi)住了媽媽的房間!

在這篇文章中,我們學(xué)習(xí)了《穿越時(shí)空的大戰(zhàn)》這部作品的后半部分,這部分內(nèi)容雖然不像上半部分內(nèi)容那樣有各種各樣讓人驚訝的編程技術(shù)和效果,但是它為我們展示了一個(gè)完整的植物大戰(zhàn)僵尸游戲的開(kāi)發(fā)過(guò)程,這個(gè)過(guò)程中使用了很多的判斷語(yǔ)句,很多的重復(fù)執(zhí)行語(yǔ)句,還有各種的廣播、變量這些角色連接的方式,通過(guò)這個(gè)過(guò)程充分展現(xiàn)了參賽者的邏輯思維能力。何時(shí)僵尸應(yīng)該上場(chǎng),何時(shí)坦克應(yīng)該出現(xiàn),如何使用堅(jiān)果消滅僵尸,如何繪制防御網(wǎng)的圖案,同學(xué)們不要小看這些內(nèi)容,如果說(shuō)上篇文章是編程特技的展示,那這篇文章才是編程基本功的體現(xiàn),這些基本功看似平淡無(wú)奇,卻不是一天兩天能練成的,千里之行始于足下,沒(méi)有扎實(shí)的基本功就無(wú)法走的更遠(yuǎn),要想獲得全國(guó)比賽的一等獎(jiǎng),努力學(xué)好這篇文章的內(nèi)容才是最應(yīng)該的,加油吧,同學(xué)們!
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過(guò)郵件及時(shí)和我們聯(lián)系刪除
- 上一篇
scratch編程之貪吃蛇
導(dǎo)語(yǔ):貪吃蛇是經(jīng)典的游戲之一,從掌上游戲機(jī)到前段時(shí)間流行的貪吃蛇大戰(zhàn),這款游戲熱度未減。在制作貪吃蛇游戲中,我們需要理解“克隆體”的特點(diǎn),學(xué)會(huì)如何合理有效地使用“克隆體”。 貪吃蛇的游戲除去開(kāi)始動(dòng)畫、結(jié)束動(dòng)畫、分?jǐn)?shù)累計(jì)等環(huán)節(jié),最重要的是利用方向鍵控制蛇的移動(dòng)以及蛇身的變長(zhǎ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),大家可以來(lái)挑戰(zhàn)一下!
