羊了個(gè)羊,但是低配版
大家好,我是魚皮。
前幾天朋友圈突然被一個(gè)小游戲 “羊了個(gè)羊” 刷屏了,出于好奇我也打算小玩一把試試,結(jié)果沒(méi)想到上頭了。。。
游戲的玩法非常簡(jiǎn)單,類似 “消消樂(lè)”,從一堆方塊中找到相同圖案的 3 個(gè)方塊并消除即可。
但沒(méi)想到,就是這個(gè)操作無(wú)比簡(jiǎn)單的小游戲,難住了大家,很多同學(xué)無(wú)論如何都過(guò)不了第二關(guān)!(當(dāng)然,也包括我 ????)
不過(guò)作為一名程序員,我玩了幾次就發(fā)現(xiàn)不對(duì)勁了。。。
方塊的生成是完全隨機(jī)的,而且越玩到后面的層數(shù)方塊的范圍就越小、可選的方塊就越少。在這兩個(gè)條件下,這個(gè)游戲真的有沒(méi)有解很難說(shuō),真就變成了一個(gè)運(yùn)氣游戲(據(jù)說(shuō)通關(guān)率不足 0.1 %)。
不過(guò)作者很良心,給了大家逆天改命的機(jī)會(huì),看廣告可以使用道具和復(fù)活。
唉,不過(guò)明知道通關(guān)的概率微乎其微,我還是沒(méi)忍住,又玩了幾十把,因?yàn)榭傆X得自己可能是那個(gè) “天之驕子”。這個(gè)游戲之所以能爆火,除了營(yíng)銷套路之外,最主要的還是拿捏了用戶的心理吧。
但是,玩游戲的過(guò)程中,我也沒(méi)閑著,我在思考這個(gè)游戲是怎么開發(fā)出來(lái)的、可能用了什么算法之類的。
當(dāng)我被游戲虐的心累了之后,我決定自己做一個(gè)能通關(guān)的 “羊了個(gè)羊”,就叫它 “魚了個(gè)魚” 吧!
熬夜肝了幾個(gè)小時(shí),游戲的雛形就做出來(lái)了,這兩天又打磨了一下,才正式上線,并且把所有代碼完全開源了!
進(jìn)入主頁(yè),可以選擇多種不同的難度:
還可以自定義難度,比如設(shè)置槽位的數(shù)量,設(shè)置每層的塊數(shù)等等:
玩法和羊了個(gè)羊類似,不過(guò)這里我加了 4 種道具,每種道具都可以無(wú)限使用(不用看廣告哈哈):
因?yàn)闀r(shí)間有限,一人全役,做的不是很精致,但是完全足夠滿足一下通關(guān)的欲望了哈哈。
最后再簡(jiǎn)單說(shuō)一下這個(gè)游戲的實(shí)現(xiàn)原理吧,主要有 4 個(gè)點(diǎn):
- 游戲全局參數(shù):做游戲的同學(xué)都知道,游戲中會(huì)涉及很多參數(shù),比如槽位數(shù)量、層數(shù)等等。我們要將這些參數(shù)抽取成統(tǒng)一的全局變量,供其他變量使用。從而做到修改一處,游戲自動(dòng)適配。還可以提供頁(yè)面來(lái)讓用戶自定義這些參數(shù),提高游戲的可玩性。
- 網(wǎng)格:為了讓塊的分布相對(duì)規(guī)整、并且為計(jì)算坐標(biāo)提供方便,我將整個(gè)游戲畫布分為 24 x 24 的虛擬網(wǎng)格,類似一個(gè)棋盤。一個(gè)塊占用 3 x 3 的格子。
- 隨機(jī)生成塊:包括隨機(jī)生成方塊的圖案和坐標(biāo)。首先我根據(jù)全局參數(shù)計(jì)算出了總塊數(shù),然后用 shuffle 函數(shù)打亂存儲(chǔ)所有動(dòng)物圖案的數(shù)組,再依次將數(shù)組中的圖案填充到方塊中。生成坐標(biāo)的原理是隨機(jī)選取坐標(biāo)范圍內(nèi)的點(diǎn),坐標(biāo)范圍可以隨著層級(jí)的增加而遞減,即生成的圖案越來(lái)越擠,達(dá)到難度逐層加大的效果。
- 塊的覆蓋關(guān)系:怎么做到點(diǎn)擊上層的塊后,才能點(diǎn)下層的塊呢?首先要給每個(gè)塊指定一個(gè)層級(jí)屬性。然后有兩種思路,第 1 種是先逐層生成,然后每個(gè)格子里層級(jí)最高的塊依次判斷其周圍格子有沒(méi)有塊層級(jí)大于它;第 2 種是在隨機(jī)生成塊的時(shí)候就給相互重疊的塊綁定層級(jí)關(guān)系(即誰(shuí)覆蓋了我?我覆蓋了誰(shuí)?)。這里我選擇了第 2 種方法,感覺效率會(huì)高一些。
當(dāng)然,以上只是我的實(shí)現(xiàn)方式,未必是最好的,但是完全能夠滿足游戲的功能訴求了。