溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

微信小程序如何實(shí)現(xiàn)貪吃蛇

發(fā)布時間:2021-09-03 10:52:39 來源:億速云 閱讀:376 作者:小新 欄目:移動開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)微信小程序如何實(shí)現(xiàn)貪吃蛇,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

進(jìn)入正題

頁面布局

微信小程序如何實(shí)現(xiàn)貪吃蛇

就是這個樣子的,游戲界面跟之前的OC版是差不多的,以筆者的水平,只能設(shè)計成這樣了,畢竟不是專業(yè)的,話說這蛇怎么長的像個J(和)B(諧)啊:joy:

先來看看用來添加組件的wxml文件

<view class="backView">
  <canvas canvas-id="snakeCanvas" class="canvas"/>
</view>
<view class="controlView">
    <button class="btnClass" bindtap="changeDirection" id="up">up</button>
    <view style="display:flex; height:33.33%">
        <button class="btnClass" bindtap="changeDirection" id="left">left</button>
        <button class="btnClass" bindtap="startGame" >{{btnTitle}}</button>
        <button class="btnClass" bindtap="changeDirection" id="right">right</button>
    </view>
    <button class="btnClass" bindtap="changeDirection" id="down">down</button>
</view>

內(nèi)容是相當(dāng)簡單滴,上面一個view,里面放一個畫布,下面一個view,里面放5個按鈕

再來看看wxss布局

微信小程序如何實(shí)現(xiàn)貪吃蛇

內(nèi)容不多,其實(shí)筆者對CSS也不是很了解,很多年前學(xué)習(xí)過,然而早隨著:hankey:排出去了,也許還有更優(yōu)的布局方式,不過湊合著用吧

功能實(shí)現(xiàn)

布局還是很簡單的,雖然不熟,但是多嘗試幾下還是可以弄出來的,接下來功能邏輯的實(shí)現(xiàn)才是重點(diǎn),編程語言當(dāng)然是js了。

話說筆者當(dāng)年學(xué)js的時候,可是寫了滿滿一本的筆記,然而......算了,過去的就讓他過去吧,往事不提也罷。

思路其實(shí)與OC版的一樣

蛇:創(chuàng)建一個點(diǎn)坐標(biāo)數(shù)組,然后以坐標(biāo)點(diǎn)為中心在畫布上畫矩形

食物:隨機(jī)一個坐標(biāo)點(diǎn),該點(diǎn)不能在蛇身上,否則重新隨機(jī)

蛇的移動:把蛇尾的坐標(biāo)移到蛇頭前面就行了

吃到食物:每次蛇移動完畢后,如果蛇頭的坐標(biāo)與食物的坐標(biāo)一樣,則蛇增長

蛇的增長:在蛇尾后面加一個點(diǎn)坐標(biāo)即可

游戲結(jié)束:蛇頭越界或撞到自己身體即游戲結(jié)束

創(chuàng)建蛇

//創(chuàng)建蛇,初始為5節(jié),nodeWH為矩形的邊長
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(){
  //矩形的邊長為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為自定義的類,有兩個屬性x和y,表示坐標(biāo)
  food = new Node(x,y)
}

蛇的移動

蛇的移動是有方向的,所以用一個變量direction來記錄蛇的移動方向,游戲開始時,默認(rèn)是向右移動。

上面有說到蛇的移動就是把蛇尾的坐標(biāo)移到蛇頭前面,但是這個前面并不是固定的,而是根據(jù)方向來判斷的,如果向右移動則右邊為前方,以此類推

吃到食物與蛇增長

每次移動完畢后,判斷蛇頭的坐標(biāo)是否與食物的坐標(biāo)相等就OK了,吃到食物后蛇的長度會增加,并且要創(chuàng)建一個新的食物

function isEatedFood(){
  var head = nodes[0]
  if (head.x == food.x && head.y == food.y) {
    score++
    nodes.push(lastPoint)
    createFood()
  }
}

上面的代碼中,lastPoint就是蛇每次移動前,蛇尾的坐標(biāo),如果移動后吃到食物,那么直接在移動前的蛇尾處加上一節(jié)即可

游戲結(jié)束

每次移動后,都要判斷蛇頭是否超過畫布,或者撞到自己的身體

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()
  }
}

界面繪制

每次移動都要繪制,所以需要一個定時器,筆者用的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,但是很遺憾,筆者不會用,準(zhǔn)確的說是不知道怎么暫停

var animateId = 0
function move(){
    .
    .
    .
    animateId = requestAnimationFrame(move)
}
function startGame(){
    .
    .
    .
    animateId = requestAnimationFrame(move)
}

使用上面的方法可以實(shí)現(xiàn)蛇的移動與界面重繪,然而每次執(zhí)行animateId都會被賦予新的值,所以使用cancelAnimationFrame(animateId)無法暫停。

關(guān)于“微信小程序如何實(shí)現(xiàn)貪吃蛇”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI