微信小程序-貪食蛇

很久很久以前,差不多大半年前吧紊浩,筆者發(fā)布了一篇關(guān)于OC版貪食蛇開發(fā)的文章蔫饰,時隔多月,微信小程序橫空出世榔幸,于是閑來無事的我又寫了一個小程序版

下面這段話請務必閱讀

筆者是做iOS的允乐,而小程序大部分都是前端的知識,筆者之前沒有做過類似開發(fā)削咆,所以代碼寫的相當爛牍疏,很多東西都是一邊查資料一邊寫的,請各位輕噴拨齐,阿門鳞陨!

進入正題

頁面布局

關(guān)于小程序筆者就不做介紹了,官方有詳細文檔瞻惋,我們還是先來看張圖吧

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

先來看看用來添加組件的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)容是相當簡單滴,上面一個view趟咆,里面放一個畫布添瓷,下面一個view,里面放5個按鈕

再來看看wxss布局

內(nèi)容不多值纱,其實筆者對CSS也不是很了解仰坦,很多年前學習過,然而早隨著??排出去了计雌,也許還有更優(yōu)的布局方式悄晃,不過湊合著用吧

功能實現(xiàn)

布局還是很簡單的,雖然不熟凿滤,但是多嘗試幾下還是可以弄出來的妈橄,接下來功能邏輯的實現(xiàn)才是重點,編程語言當然是js了翁脆。

話說筆者當年學js的時候眷蚓,可是寫了滿滿一本的筆記,然而......算了反番,過去的就讓他過去吧沙热,往事不提也罷。

思路其實與OC版的一樣

蛇:創(chuàng)建一個點坐標數(shù)組罢缸,然后以坐標點為中心在畫布上畫矩形
食物:隨機一個坐標點篙贸,該點不能在蛇身上,否則重新隨機
蛇的移動:把蛇尾的坐標移到蛇頭前面就行了
吃到食物:每次蛇移動完畢后枫疆,如果蛇頭的坐標與食物的坐標一樣爵川,則蛇增長
蛇的增長:在蛇尾后面加一個點坐標即可
游戲結(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

  //如果食物的坐標在蛇身上,則重新創(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颇蜡,表示坐標
  food = new Node(x,y)
}
蛇的移動

蛇的移動是有方向的,所以用一個變量direction來記錄蛇的移動方向,游戲開始時澡匪,默認是向右移動熔任。

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

吃到食物與蛇增長

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

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

上面的代碼中抢韭,lastPoint就是蛇每次移動前薪贫,蛇尾的坐標,如果移動后吃到食物刻恭,那么直接在移動前的蛇尾處加上一節(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骑科,但是很遺憾橡淑,筆者不會用,準確的說是不知道怎么暫停

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

使用上面的方法可以實現(xiàn)蛇的移動與界面重繪咆爽,然而每次執(zhí)行animateId都會被賦予新的值梁棠,所以使用cancelAnimationFrame(animateId)無法暫停,如果有懂前端開發(fā)的大神請指導下

差不多整個邏輯就是這樣的斗埂,喜歡研究的可以自己嘗試下符糊,需要源碼的請自行下載,不要問我怎么打開蜜笤,不要問我怎么打開濒蒋,不要問我怎么打開!0淹谩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓮顽,一起剝皮案震驚了整個濱河市县好,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖混,老刑警劉巖缕贡,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡晾咪,警方通過查閱死者的電腦和手機收擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谍倦,“玉大人塞赂,你說我怎么就攤上這事≈缰” “怎么了宴猾?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叼旋。 經(jīng)常有香客問我仇哆,道長,這世上最難降的妖魔是什么夫植? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任讹剔,我火速辦了婚禮,結(jié)果婚禮上详民,老公的妹妹穿的比我還像新娘辟拷。我一直安慰自己,他們只是感情好阐斜,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布衫冻。 她就那樣靜靜地躺著,像睡著了一般谒出。 火紅的嫁衣襯著肌膚如雪隅俘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天笤喳,我揣著相機與錄音为居,去河邊找鬼。 笑死杀狡,一個胖子當著我的面吹牛蒙畴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜象,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼膳凝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恭陡?” 一聲冷哼從身側(cè)響起蹬音,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎休玩,沒想到半個月后著淆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫狠,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年永部,在試婚紗的時候發(fā)現(xiàn)自己被綠了独泞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡苔埋,死狀恐怖懦砂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讲坎,我是刑警寧澤孕惜,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站晨炕,受9級特大地震影響衫画,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓮栗,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一削罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧费奸,春花似錦弥激、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缨历,卻和暖如春以蕴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辛孵。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工丛肮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魄缚。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓宝与,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冶匹。 傳聞我的和親對象是個殘疾皇子习劫,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于于小程序筆者就不做介紹了,官方有詳細文檔徙硅,我們還是先來看張圖吧 就是這個樣子的榜聂,游戲界面跟之前的OC版是差不多...
    Programmer客棧閱讀 2,541評論 0 0
  • 前言 閑著沒事干,想起多年前學java時嗓蘑,筆者擼過的俄羅斯方塊须肆,坦克大戰(zhàn),貪食蛇桩皿,現(xiàn)如今已拋棄java多年豌汇,投入i...
    codingZero閱讀 8,073評論 12 54
  • 前天犯賤登錄了騙子的蘋果ID, 結(jié)果自己的ipad被騙子遠程鎖定了, 如今變磚頭, 心情很down, 故參考網(wǎng)友的...
    imbaWales閱讀 1,306評論 3 11
  • 最近在做一個貪吃蛇的項目,這是我第一次用js來實現(xiàn)做一款游戲泄隔,雖然很low,但出現(xiàn)預想的效果時還是很開心的拒贱,雖然做...
    風之傷_3eed閱讀 285評論 0 0
  • 今天我發(fā)小結(jié)婚了逻澳,婚禮我沒有去, 因為他沒有邀請我 我仔細想了下他為什么不邀請我 我覺得問題還是在我身上 可能是因...
    毛衣毛閱讀 514評論 0 0