《羊了個羊》可謂空前火爆,當(dāng)大家都在考慮如何加入羊隊時,我卻不能專心玩游戲,作為一個編程的從業(yè)者,看到這種小游戲往往思考的是:它是如何做出來的?經(jīng)過一番嘗試,初步完成了Scratch版《羊了個羊》的核心功能。
下面跟大家分享怎么用Scratch制作《羊了個羊》,受篇幅所限,本文主要聚焦卡片等核心功能的實現(xiàn),如有不當(dāng)之處,歡迎指正。由于《羊了個羊》游戲的卡片有很多,并且堆疊了多層,所以需要用到列表數(shù)據(jù)結(jié)構(gòu)來存儲卡片的相關(guān)信息(如圖1)。
1. 一個卡片角色添加多個造型,背景是帶卡槽的草地。
2. 背景功能和卡片克隆功能排序。
3. 點擊卡片,角色移動到卡槽。
4. 卡片在卡槽上占位。
5. 刪除三個相同的造型。
6. 判斷輸?shù)臈l件。
7. 處于下層的卡片。
8. 判斷勝利的條件。
卡片角色有多個造型。背景包含帶卡槽的草地、開局、勝利。添加角色卡片,分別把不同卡片的樣式添加到角色卡片造型里面去。本文用到了9個造型,背景3個造型包括:開場游戲中帶卡槽、獲勝,素材和背景音樂從原版游戲中截?。ㄈ鐖D2)。
建立變量排序、卡片總數(shù)、最后點擊。建立列表卡片造型、卡槽id、卡槽X、臨時卡槽id、重復(fù)1、重復(fù)2。
1. 點擊綠旗開始,把背景換成開場造型,將旋渦特效增加3重復(fù)20次,再將旋渦特效增加-3重復(fù)20次變回,換成“游戲中帶卡槽”的造型。多線程播放音樂《羊了個羊》,等待完畢重復(fù)執(zhí)行(如圖3)。
2. 排序之前我們來定義游戲卡片排序規(guī)則,橫行多少張卡片,豎列多少張卡片,卡片長度,卡片寬度。本程序橫9張卡片,豎6張卡片,卡片在程序中的步長也就是寬度為40,高度為45。通過橫豎卡片數(shù)量可以計算出第一層卡片數(shù)量為54張。通過對上述條件的計算我們就可以利用克隆功能把我們第一層的卡片排序出來。
3.首先隱藏掉角色,建立變量排序,建立列表卡片造型,角色卡片移動到舞臺左上角,建議坐標(biāo)XY方向盡量取值整數(shù)便于計算。變量排序設(shè)置為1。54次重復(fù)執(zhí)行變量排序加1,再把排序加入列表卡片造型,如果變量排序大于9就把變量排序設(shè)為1,這樣列表卡片造型執(zhí)行出來的效果就是有6個1-9,列表長度54,顯示自己。
4.將變量排序設(shè)置為1到列表卡片造型的項目數(shù)之間的隨機(jī)數(shù),換成列表卡片造型排序項的造型,克隆自己,刪除列表卡片造型的排序項,X方向增加40重復(fù)9次,再次回到原點,Y方向增加-45重復(fù)6次第一層的卡片就排序完成再隱藏自己。
5.當(dāng)作為克隆體啟動重復(fù)執(zhí)行碰到卡片2將亮度設(shè)為-50,表示被蓋住的下層卡片,否則設(shè)為0。代碼參考圖4。
1. 設(shè)置列表“卡槽X”“卡槽id”。列表“卡槽X”的作用是在背景卡槽位置上固定卡槽X方向值,根據(jù)游戲規(guī)則,卡槽最多容納7張卡片,卡片的寬度步長40。所以我們要添加7個方向值到列表卡槽X里面去。Y方向是固定值(如圖5)。
當(dāng)角色被點擊,將造型編號加入到列表卡槽id,移動到最前面,在0.3秒移動到X方向卡槽X的卡槽id項目數(shù)值項上。Y方向就在固定值上(如圖6)。
1.這一部分是游戲的難點,占位什么意思呢?比如當(dāng)我們點擊3張不同造型的卡片,這3次飛到卡槽是不一樣的卡片,第4次飛到卡槽的卡片和卡槽里面的第1張相同,那么第4次的卡片排位到第1張后面,這就叫占位。
2.利用如果否則的條件判斷,如果“列表卡槽id包含了造型編號”,那么在列表卡槽id第(卡槽列表中的第一個造型編號的編號+1)項前插入“造型編號”實現(xiàn)占位功能。
否則將造型編號加入列表卡槽id。
代碼參考圖6。
1. 這也是游戲的一個難點,難在實現(xiàn)這一功能的思路有點繞,用了兩個“如果否則”嵌套判斷。
新建三個列表,臨時卡槽id,重復(fù)1,重復(fù)2。對于點擊的卡片,如果沒有重復(fù)的就加入列表“臨時卡槽id”,重復(fù)1次的加入列表“重復(fù)1”,重復(fù)兩次的加入列表“重復(fù)2”,當(dāng)重復(fù)2次后就有了3張一樣的卡片,所以“重復(fù)2”里面就是重復(fù)3次的卡片。
2. 程序嵌套:如果列表“臨時卡槽”包含了造型編號,嵌套“如果列表重復(fù)1包含造型編號,將造型編號加入列表重復(fù)2,否則加入列表重復(fù)1”,如果兩個都沒有包含就將造型編號加入列表“臨時卡槽id”。
3. 廣播消息1到角色候補(bǔ)里面去,刪除此克隆體(如圖7)。
1. 復(fù)制角色卡片命名為“候補(bǔ)”,為什么是候補(bǔ)呢?其實角色卡片克隆體飛到卡槽時,卡片的這一個克隆體已經(jīng)刪除,我們要用新角色“候補(bǔ)”來顯示,這也是編程中常用的一個技巧,你看見的只是本體在同一個位置上另外一個長得一樣的克隆體而已。
繪制角色“結(jié)束”(也就是提示游戲輸了的提示語),自定義函數(shù)積木刷新,新建變量“編號”“臨時排序”“最后點擊”“總卡片數(shù)”(如圖8)。
2. 功能實現(xiàn):當(dāng)點擊綠旗,隱藏角色候補(bǔ),將變量“編號”和“臨時排序”都設(shè)為1。移動到X方向(列表卡槽X的第變量值臨時排序項),Y方向固定值,克隆自己,將變量編號,臨時排序增加1重復(fù)7次(如圖9)。
3. 當(dāng)接收到角色卡片發(fā)出的“消息1”時,如果列表重復(fù)2項目數(shù)大于0那么執(zhí)行刷新(其實就是把有三個相同的卡片刪除重新排序顯示),否則里面嵌套判斷如果變量編號小于列表卡槽id加1的項目數(shù),執(zhí)行顯示,否則隱藏,回到第一個判斷否則換成列表卡槽id的第變量編號項造型(如圖10)。
4. 自定義函數(shù)積木“刷新”:將變量最后點擊設(shè)為列表重復(fù)2的第一項,刪除列表重復(fù)1,重復(fù)2,臨時卡槽id中第一個最后點擊的編號項。重復(fù)3次刪除列表卡槽id的第列表卡槽id變量最后點擊的值的編號項。將變量總卡片數(shù)增加-3(如圖11)。
5. 角色結(jié)束:點擊綠旗隱藏,接收到背景發(fā)出消息失敗,移動到最前面顯示輸了(如圖12)。
1.復(fù)制角色卡片命名為“卡片2”。
2.自定義函數(shù)積木“制作卡片二層”。
3.當(dāng)綠旗被點擊,隱藏自己等待4秒,制作第二層卡片。
4.自定義函數(shù)積木“制作卡片二層”:方法也簡單,跟角色卡片原理一樣,只不過橫排卡片數(shù)量為5,豎排沒變化,方向XY取值到合理的位置生成二層。到這里我們就知道兩層卡片總卡片數(shù)為84了,大家跟著角色卡片思路來操作加強(qiáng)記憶和理解(如圖13)。
注意不要忘了列表卡槽X和克隆體被點擊的程序(如圖14)。
1. 判斷贏其實很簡單,只要總卡片數(shù)等于0就是贏了,這部分程序?qū)懺诒尘袄锩婢托辛耍ㄈ鐖D15)。
《羊了個羊》這個游戲使用Scratch制作還是比較復(fù)雜,因篇幅所限沒能詳細(xì)介紹所有代碼,而且目前代碼還有一個較大的Bug,你在游戲的過程中應(yīng)該很容易發(fā)現(xiàn)。當(dāng)然這個Bug是可以解決的,我們會提供兩種版本的源代碼供您比較學(xué)習(xí),請關(guān)注公眾號“壹零社”下載第45期的代碼。