這篇文章將為大家詳細(xì)講解有關(guān)微信小程序如何實(shí)現(xiàn)貪吃蛇,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元保山做網(wǎng)站,已為上家服務(wù),為保山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
頁面布局
就是這個(gè)樣子的,游戲界面跟之前的OC版是差不多的,以筆者的水平,只能設(shè)計(jì)成這樣了,畢竟不是專業(yè)的,話說這蛇怎么長(zhǎng)的像個(gè)J(和)B(諧)啊:joy:
先來看看用來添加組件的wxml文件
內(nèi)容是相當(dāng)簡(jiǎn)單滴,上面一個(gè)view,里面放一個(gè)畫布,下面一個(gè)view,里面放5個(gè)按鈕
再來看看wxss布局
內(nèi)容不多,其實(shí)筆者對(duì)CSS也不是很了解,很多年前學(xué)習(xí)過,然而早隨著:hankey:排出去了,也許還有更優(yōu)的布局方式,不過湊合著用吧
功能實(shí)現(xiàn)
布局還是很簡(jiǎn)單的,雖然不熟,但是多嘗試幾下還是可以弄出來的,接下來功能邏輯的實(shí)現(xiàn)才是重點(diǎn),編程語言當(dāng)然是js了。
話說筆者當(dāng)年學(xué)js的時(shí)候,可是寫了滿滿一本的筆記,然而......算了,過去的就讓他過去吧,往事不提也罷。
思路其實(shí)與OC版的一樣
蛇:創(chuàng)建一個(gè)點(diǎn)坐標(biāo)數(shù)組,然后以坐標(biāo)點(diǎn)為中心在畫布上畫矩形
食物:隨機(jī)一個(gè)坐標(biāo)點(diǎn),該點(diǎn)不能在蛇身上,否則重新隨機(jī)
蛇的移動(dòng):把蛇尾的坐標(biāo)移到蛇頭前面就行了
吃到食物:每次蛇移動(dòng)完畢后,如果蛇頭的坐標(biāo)與食物的坐標(biāo)一樣,則蛇增長(zhǎng)
蛇的增長(zhǎng):在蛇尾后面加一個(gè)點(diǎn)坐標(biāo)即可
游戲結(jié)束:蛇頭越界或撞到自己身體即游戲結(jié)束
創(chuàng)建蛇
//創(chuàng)建蛇,初始為5節(jié),nodeWH為矩形的邊長(zhǎng) function createSnake(){ nodes.splice(0, nodes.length) //清空數(shù)組 for (var i = 4; i >= 0; i--) { var node = new Node(nodeWH * (i + 0.5), nodeWH * 0.5) nodes.push(node); } }
創(chuàng)建食物
function createFood(){ //矩形的邊長(zhǎng)為10,畫布寬度為250,高度為350,所以x只能取5-245,y只能取5-345 var x = parseInt(Math.random() * 24) * nodeWH + nodeWH * 0.5 var y = parseInt(Math.random() * 34) * nodeWH + nodeWH * 0.5 //如果食物的坐標(biāo)在蛇身上,則重新創(chuàng)建 for (var i = 0; i < nodes.length; i++) { var node = nodes[i] if (node.x == x && node.y == y) { createFood() return } } //Node為自定義的類,有兩個(gè)屬性x和y,表示坐標(biāo) food = new Node(x,y) }
蛇的移動(dòng)
蛇的移動(dòng)是有方向的,所以用一個(gè)變量direction來記錄蛇的移動(dòng)方向,游戲開始時(shí),默認(rèn)是向右移動(dòng)。
上面有說到蛇的移動(dòng)就是把蛇尾的坐標(biāo)移到蛇頭前面,但是這個(gè)前面并不是固定的,而是根據(jù)方向來判斷的,如果向右移動(dòng)則右邊為前方,以此類推
吃到食物與蛇增長(zhǎng)
每次移動(dòng)完畢后,判斷蛇頭的坐標(biāo)是否與食物的坐標(biāo)相等就OK了,吃到食物后蛇的長(zhǎng)度會(huì)增加,并且要?jiǎng)?chuàng)建一個(gè)新的食物
function isEatedFood(){ var head = nodes[0] if (head.x == food.x && head.y == food.y) { score++ nodes.push(lastPoint) createFood() } }
上面的代碼中,lastPoint就是蛇每次移動(dòng)前,蛇尾的坐標(biāo),如果移動(dòng)后吃到食物,那么直接在移動(dòng)前的蛇尾處加上一節(jié)即可
游戲結(jié)束
每次移動(dòng)后,都要判斷蛇頭是否超過畫布,或者撞到自己的身體
function isDestroy(){ var head = nodes[0] //判斷是否撞到自己身體 for (var i = 1; i < nodes.length; i++) { var node = nodes[i] if (head.x == node.x && head.y == node.y) { gameOver() } } //判斷水平方向是否越界 if (head.x < 5 || head.x > 245) { gameOver() } //判斷垂直方向是否越界 if (head.y < 5 || head.y > 345) { gameOver() } }
界面繪制
每次移動(dòng)都要繪制,所以需要一個(gè)定時(shí)器,筆者用的setInterval
function move(){ lastPoint = nodes[nodes.length - 1] var node = nodes[0] var newNode = {x: node.x, y: node.y} switch (direction) { case 'up': newNode.y -= nodeWH; break; case 'left': newNode.x -= nodeWH; break; case 'right': newNode.x += nodeWH; break; case 'down': newNode.y += nodeWH; break; } nodes.pop() nodes.unshift(newNode) moveEnd() } function startGame() { if (isGameOver) { direction = 'right' createSnake() createFood() score = 0 isGameOver = false } timer = setInterval(move,300) }
網(wǎng)上說setInterval的性能并不怎么好,建議用requestAnimationFrame,但是很遺憾,筆者不會(huì)用,準(zhǔn)確的說是不知道怎么暫停
var animateId = 0 function move(){ . . . animateId = requestAnimationFrame(move) } function startGame(){ . . . animateId = requestAnimationFrame(move) }
使用上面的方法可以實(shí)現(xiàn)蛇的移動(dòng)與界面重繪,然而每次執(zhí)行animateId都會(huì)被賦予新的值,所以使用cancelAnimationFrame(animateId)無法暫停。
關(guān)于“微信小程序如何實(shí)現(xiàn)貪吃蛇”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。