如何用原生 JS,快速寫一個(gè)貪吃蛇小游戲

前言
貪吃蛇算是小游戲里面比較好寫的,沒有什么難點(diǎn),基本上需要實(shí)現(xiàn)的功能,都能很順利的用代碼敲出來。

1、繪制游戲區(qū)域和游戲元素
仍然是用 16 * 16 的二維數(shù)組來繪制,對(duì)這個(gè)數(shù)組進(jìn)行遍歷。第一層遍歷的時(shí)候創(chuàng)建 tr,第二層遍歷的時(shí)候創(chuàng)建 td。然后添加一些 CSS 樣式,游戲區(qū)域就寫好了。
CSS&HTML:
游戲元素的話一共有 3 個(gè),蛇頭,身體和蘋果。就用 3 個(gè)構(gòu)造函數(shù)來生成坐標(biāo),以及給對(duì)應(yīng)坐標(biāo)的那個(gè)對(duì)象里面添加不同的屬性。用構(gòu)造函數(shù)寫既方便查找,也方便修改。然后寫個(gè)渲染函數(shù),格子里面對(duì)應(yīng)的不同的屬性,就渲染出不同的樣式。
2、移動(dòng)功能
移動(dòng)功能要分兩個(gè)步驟來寫。一個(gè)是蛇頭的移動(dòng),一個(gè)是身體的移動(dòng)。貪吃蛇的身體它不是一個(gè)整理,是不能寫成一塊的。蛇頭動(dòng)的時(shí)候,身體它得扭來扭去,這才像個(gè)蛇。
蛇頭移動(dòng)很簡單,上下左右鍵對(duì)應(yīng)著蛇頭 X 和 Y 兩個(gè)值的加減。X 和 Y 超出范圍,代碼就會(huì)報(bào)錯(cuò)。就可以直接用 try catch 來判斷邊界。報(bào)錯(cuò)了就說明出界了,直接走 catch 的游戲結(jié)束。

注意: 這個(gè)游戲唯一麻煩一點(diǎn)的地方來了,怎么讓蛇身體能扭起來。相通一個(gè)邏輯,這個(gè)問題就迎刃而解了。
蛇身體怎么移動(dòng),是身體里的每個(gè)元素都往前移動(dòng)一格嗎,顯然不是。仔細(xì)觀察你會(huì)發(fā)現(xiàn),蛇移動(dòng)時(shí),身體的中間部分其實(shí)是不動(dòng)的。動(dòng)的只有最前端和最末端的兩格。也就是說蛇移動(dòng)時(shí),其實(shí)就是把身體最末端的格子移動(dòng)到了身體最前端,其他的都不需要?jiǎng)印G懊媛暶鞯纳眢w元素?cái)?shù)組就是這個(gè)時(shí)候用的。把身體的最后一個(gè)元素移動(dòng)到頭部,同時(shí)數(shù)組里的最后一個(gè)元素也要移動(dòng)到最前面去。

3、寫鍵盤事件
寫鍵盤事件的時(shí)候要加一個(gè)判斷,讓這個(gè)蛇只能夠相對(duì)它自身左右移動(dòng)。不能掉頭,也不能向前沖,向前沖很容易就撞到墻了。
4、吃蘋果功能
吃蘋果功能分為 3 個(gè)步驟
1.判斷頭部和蘋果有沒有重合,重合的話,就讓這個(gè)蘋果消失,讓分?jǐn)?shù) +1。
2.生成隨機(jī)坐標(biāo)來渲染蘋果,判斷一下這個(gè)坐標(biāo)上是否與蛇身體重合了,重合的話就要重新生成坐標(biāo)。
3.生成一個(gè)新的身體實(shí)例,并且把這個(gè)新實(shí)例添加到身體數(shù)組中。
5、頭部碰到身體游戲失敗的功能
和吃蘋果的邏輯一樣,就判斷頭部和身體是不是重合的。
6、自動(dòng)移動(dòng)的功能
自動(dòng)移動(dòng)可以通過間歇函數(shù)來實(shí)現(xiàn),然后不能單純的在間歇函數(shù)的回調(diào)里面寫上下左右的某一個(gè),要判斷一下蛇當(dāng)前的移動(dòng)方向是什么。然后來一個(gè)分?jǐn)?shù)越高速度越快的功能。
7、暫停功能和判斷游戲勝利
這兩個(gè)比較簡單,就一起說了。暫停功能就是讓定時(shí)器停止,并且讓flag變量變?yōu)閒alse。這樣就不能再去控制蛇了。這個(gè)游戲一共有256個(gè)格子,勝利的條件就是身體有255個(gè)元素,因?yàn)橐獪p去一個(gè)頭部。
寫在最后
游戲到這里就寫完了,代碼雖然看起來多,但是并沒有什么難的地方,想到就能寫。唯一麻煩一點(diǎn)的就是那個(gè)身體的移動(dòng),相通了就很簡單了。































