我是會(huì)做游戲也會(huì)教你做游戲的小螞蟻,歡迎關(guān)注我,每天學(xué)點(diǎn)兒做游戲的知識(shí)。
嗨!大家好,我是小螞蟻。今天我們繼續(xù)學(xué)習(xí)如何做一個(gè)俄羅斯方塊游戲。
整個(gè)系列教程計(jì)劃按照這個(gè)流程圖開展,這也是我制作整個(gè)游戲的過(guò)程,今天我們就來(lái)看一下“隨機(jī)生成形狀”這個(gè)模塊。
創(chuàng)建形狀
想要實(shí)現(xiàn)隨機(jī)的生成形狀,首先必須要知道在俄羅斯方塊中一共有多少種形狀(也就是我們上一節(jié)中留下的第二個(gè)問(wèn)題)。
如圖,就是俄羅斯方塊中所有的 7 個(gè)形狀了,試著觀察一下這七個(gè)形狀有一個(gè)共同點(diǎn)。那就是每個(gè)形狀都是由 4 個(gè)小方塊組成,這是一個(gè)很重要的特征,這就意味著你只需要 4 個(gè)小方塊,就可以通過(guò)調(diào)整擺放位置,構(gòu)建出游戲中的所有形狀了。
對(duì)于游戲中的形狀來(lái)說(shuō),除了需要知道都有哪些之外,我們還需要另外一些信息,就是每一個(gè)形狀有多少“狀態(tài)”可以變換。
如圖,是 7 種形狀的變換,形狀 1 3 分別有 4 個(gè)狀態(tài),形狀 4 6 分別有 2 個(gè)狀態(tài),形狀 7 只有 1 個(gè)狀態(tài)。
這里我們把形狀的每一個(gè)不同的旋轉(zhuǎn)位置叫做一個(gè)“狀態(tài)”,以第 1 個(gè)形狀為例,它一共有 4 個(gè)狀態(tài),第 1 個(gè)狀態(tài)是“T”型,第 2 個(gè)狀態(tài)就是第 1 個(gè)狀態(tài)以順時(shí)針旋轉(zhuǎn) 90 度,第 3 個(gè)狀態(tài)是第 2 個(gè)狀態(tài)以順時(shí)針旋轉(zhuǎn) 90 度,第 4 個(gè)狀態(tài)是第 3 個(gè)狀態(tài)以順時(shí)針旋轉(zhuǎn) 90 度。第 4 個(gè)狀態(tài)再以順時(shí)針旋轉(zhuǎn) 90 度,就回到了第 1 個(gè)狀態(tài)。整個(gè)狀態(tài)切換是一個(gè)首尾相接的循環(huán)過(guò)程,每一個(gè)狀態(tài)都是以上一個(gè)狀態(tài)為基礎(chǔ),順時(shí)針旋轉(zhuǎn) 90 度。
你可以繼續(xù)觀察一下剩余的其他形狀,看看每一個(gè)形狀的狀態(tài)是否都滿足上述的條件。
在確定了形狀之后,我們?nèi)绾卧谟螒蛑邪阉鼈儤?gòu)建出來(lái)呢?答案其實(shí)很簡(jiǎn)單,直接拼出來(lái)就好了。
以第 1 個(gè)形狀為例,假設(shè)每一個(gè)小方塊的大小都是 50×50,以形狀的中心為坐標(biāo)軸的中心,那么很容易就可以計(jì)算出 4 塊小方塊的具體位置。
在得到了 4 個(gè)小方塊的位置之后,我們可以在微信小游戲制作工具中將 4 個(gè)小正方形(50×50)打包到一個(gè)容器中,然后分別為它們?cè)O(shè)置到對(duì)應(yīng)的位置上,這樣一個(gè)形狀就創(chuàng)建好了。
這里注意一下,當(dāng)我們將 4 個(gè)小方塊打包成容器“形狀1”之后,這個(gè)容器整體是一個(gè)矩形,中點(diǎn)位于矩形的中心,這個(gè)中心也表示容器“形狀1”的位置。例如,將“形狀1”容器設(shè)置到(0,0)的位置,實(shí)際上是容器的中心點(diǎn)位于 (0,0) 的位置(這個(gè)在后續(xù)計(jì)算中需要用到,這里先了解一下)。
剩余其它的幾個(gè)形狀也如此,可以先在紙上畫一下,計(jì)算出每個(gè)小方塊的位置,然后再在制作工具中創(chuàng)建出對(duì)應(yīng)的形狀。
隨機(jī)
形狀創(chuàng)建好了,接著我們來(lái)看一下如何進(jìn)行隨機(jī)。目前對(duì)于俄羅斯方塊的隨機(jī)有很多種方式,這里我們只說(shuō)一下其中的兩種,一種是最古老的隨機(jī),另一種是用的比較多的叫做“Bag7”的隨機(jī)。
最古老的隨機(jī)其實(shí)就是每次生成的方塊都是從 1 7 個(gè)形狀中隨機(jī)的生成一個(gè)。由于每次生成都是隨機(jī)的,所以有可能出現(xiàn)連續(xù)多次生成同一種形狀,或者連續(xù)很多次都不生成某一種形狀的情況,這些情況會(huì)導(dǎo)致游戲難度的增加。
這種隨機(jī)很簡(jiǎn)單,我們只需要從 1 7 中,生成一個(gè)隨機(jī)數(shù),然后根據(jù)這個(gè)隨機(jī)數(shù)生成指定的形狀即可。
后來(lái),為了降低游戲的難度,普遍采用了叫做“Bag7”的隨機(jī)方法。就是生成一個(gè)由 1 7 的 7 個(gè)數(shù)字隨機(jī)排序組成的包(列表或者數(shù)組),然后按照這個(gè)包中的排序生成形狀,生成 7 個(gè)形狀后,就再創(chuàng)建一個(gè)這樣的包,然后再繼續(xù)。
這種算法保證了同一個(gè)形狀最多只能連續(xù)出現(xiàn) 2 次(前一個(gè)包的最后一個(gè)數(shù),跟后一個(gè)包的第一個(gè)數(shù)相同)。同一個(gè)形狀最多只能間隔 12 次不出現(xiàn)(前一個(gè)包的第一個(gè)數(shù),跟后一個(gè)包的最后一個(gè)數(shù)相同)。
接著,我們來(lái)看一下“Bag7”隨機(jī)算法的實(shí)現(xiàn)。首先,我們創(chuàng)建一個(gè)叫做“Bag7”的列表,這個(gè)列表中包含了 1 7 的 7 個(gè)數(shù)字。
接著來(lái)看一下積木邏輯。
微信小游戲制作工具為我們提供了一個(gè)“將列表隨機(jī)打亂”的積木塊,我們可以直接利用它來(lái)得到打亂了順序的列表(Bag7)。每當(dāng)生成一個(gè)形狀后,就將變量“Bag7索引”增加 1,直到這個(gè)列表中的所有項(xiàng)遍歷完畢,然后再繼續(xù)生成下一個(gè)新的“Bag7″。
好了,今天的內(nèi)容就到這里了,稍微總結(jié)一下:我們了解了俄羅斯方塊中的 7 個(gè)形狀,以及每個(gè)形狀所包含的不同狀態(tài),最后了解了兩種不同的隨機(jī)算法。
是不是有種“哇哦 ”的感覺(jué)?這么簡(jiǎn)單的一個(gè)俄羅斯方塊游戲竟然能夠包含這么多的東西。所以說(shuō)即使是一個(gè)小游戲,只要你用心研究,里面也包含著很多可以學(xué)到的東西。更何況,我們的這個(gè)小游戲才剛剛開始而已。