微信小程序貪吃蛇釋義

最終結果:


.js文件部分:

/*——————初始化部分——————*/

var nodeWH = 10 //初始化矩形的大小為10*10

var direction = 'right' //初始化蛇的運動方向,即開始游戲蛇的移動方向

var timer = null //初始化一個定時器,賦值為空

var nodes = []//初始化一個結點數組,用于存放蛇

var food = null//定義一個全局變量來初始化食物

var context = wx.createContext()//通過調用createContext()函數創建并返回繪圖上下文

var lastPoint = null//定義一個全局變量,存放最后的一點

var isGameOver = false//定義一個全局變量,用到判定游戲的結束與否

var that//通過定義一個變量,到后面起到指定作用

var score = 0//初始化分數,定義一個全局變量

//定義一個函數獲取單位結點的x,y軸坐標

function Node(x, y) {

? this.x = x;

? this.y = y;

}

/*——————創建蛇部分——————*/

function createSnake() {

? //使用splice() 方法直接對數組進行修改

? nodes.splice(0, nodes.length)

? //初始化蛇身長度為3,用for來進行棧的自增

? for (var i = 3; i >= 0; i--) {

? ? //滿足循環體的條件,下一個單位結點就往前推移

? ? var node = new Node(nodeWH * (i + 0.5), nodeWH * 0.5)

? ? //將每個新的單位結點入棧

? ? nodes.push(node);

? }

}

/*——————創建食物部分——————*/

function createFood() {

? //食物刷新的生成的坐標

? var x = parseInt(Math.random() * 24) * nodeWH + nodeWH * 0.5

? var y = parseInt(Math.random() * 24) * nodeWH + nodeWH * 0.5

? //如果食物的坐標在蛇身上,則重新創建

? for (var i = 0; i < nodes.length; i++) {

? ? //定義一個變量來存放每個節點

? ? var node = nodes[i]

? ? //判斷每個結點的坐標是否和蛇身的節點坐標重疊,若是重疊,重新刷新坐標

? ? if (node.x == x && node.y == y) {

? ? ? createFood()

? ? ? return

? ? }

? }

? //若是坐標不重疊,直接創建食物坐標

? food = new Node(x, y)

}

/*——————繪制食物和蛇部分——————*/

function draw() {

? //對蛇的繪制

? for (var i = 0; i < nodes.length; i++) {

? ? var node = nodes[i]

? ? if (i == 0) {

? ? ? context.setFillStyle('#531a74')

? ? } else {

? ? ? context.setFillStyle('#c7e139')

? ? }

? ? context.beginPath()

? ? context.rect(node.x, node.y, nodeWH, nodeWH)

? ? context.closePath()

? ? context.fill()

? }

? //對食物的繪制

? context.setFillStyle('#30ff00')

? context.beginPath()

? context.rect(food.x, food.y, nodeWH, nodeWH)

? context.closePath()

? context.fill()

? wx.drawCanvas({

? ? canvasId: 'snakeCanvas',

? ? actions: context.getActions()

? })

}

/*——————開始游戲部分——————*/

function startGame() {

? //調用方向、創建蛇和食物等變量或函數來啟動游戲

? if (isGameOver) {

? ? direction = 'right'

? ? createSnake()

? ? createFood()

? ? score = 0

? ? isGameOver = false

? }

? //控制蛇移動的速度,即畫布刷新

? timer = setInterval(move, 200)

}

/*——————判斷蛇是否吃到食物以及得分部分——————*/

function isEatedFood() {

? //定義一個變量來存放蛇頭結點

? var head = nodes[0]

? //進行判斷,若蛇頭結點和食物的坐標重復即為吃到食物

? if (head.x == food.x && head.y == food.y) {

? ? //吃到吃食物后,分數增加

? ? score++

? ? //吃到食物后,將食物入棧,即增加蛇的長度

? ? nodes.push(lastPoint)

? ? //調用創建食物函數,再次刷新食物

? ? createFood()

? }

}

/*——————蛇的移動部分——————*/

function move() {

? //將身體長度存放在一起,作為一個整體處理

? lastPoint = nodes[nodes.length - 1]

? //定義一個變量存放蛇頭結點

? var node = nodes[0]

? //定義一個變量獲取移動后的坐標

? var newNode = { x: node.x, y: node.y }

? switch (direction) {

? ? //向上移動,即在Y軸方向上減去同等的單位大小,后面以此類推

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

? //利用unshift向數組的開頭添加一個或更多元素,并返回新的長度。

? nodes.unshift(newNode)

? moveEnd()

}

/*——————每次移動結束后部分——————*/

function moveEnd() {

? //判定是否吃到食物

? isEatedFood()

? //判定是否超過畫布或者撞到自身

? isDestroy()

? //繪制部分

? draw()

}

/*——————游戲結束彈框部分——————*/

function gameOver() {

? //游戲結束

? isGameOver = true

? //清空計時器,即清空畫布的刷新,貪吃蛇不再移動

? clearInterval(timer)

? //調用顯示彈框

? wx.showModal({

? ? //彈框標題

? ? title: 'Game Over',

? ? //彈框內容

? ? content: '總得分:' + score + ',不服再來?',

? ? confirmText: '不服',

? ? //接口調用成功回調的函數

? ? success: function (e) {

? ? ? //若用戶點擊確定按鈕,便回調startGame()函數,重新開始游戲

? ? ? if (e.confirm == true) {

? ? ? ? startGame()

? ? ? }

? ? ? //若用戶點擊取消按鈕,不再回調任何函數

? ? ? else {

? ? ? ? console.log('cancel')

? ? ? ? //等用戶點擊開始按鈕再開始游戲

? ? ? ? that.setData({

? ? ? ? ? btnTitle: '開始'

? ? ? ? })

? ? ? }

? ? }

? })

}

/*——————判斷蛇是否超過畫布或撞到自身部分——————*/

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 > 245) {

? ? gameOver()

? }

}

/*——————對于綁定數據的處理部分——————*/

Page({

? data: {

? ? //綁定開始游戲數據

? ? btnTitle: '開始'

? },

? //加載函數體內的函數

? onLoad: function () {

? ? that = this

? ? createSnake()

? ? createFood()

? ? draw()

? },

? //改變方向數據函數

? changeDirection: function (e) {

? ? //若data.btnTitle的值為“開始”,這返回此值,并進行相應的操作

? ? if ('開始' == this.data.btnTitle) return

? ? //定義一個變量,使其成為觸發事件的節點

? ? var title = e.target.id

? ? //若該節點事件為down這對應的事件為蛇向下移動

? ? if (title == 'down' || title == 'up') {

? ? ? if (direction == 'down' || direction == 'up') return

? ? } else if (direction == 'left' || direction == 'right') return

? ? direction = title;

? },

? //開始游戲的數據綁定函數

? startGame: function () {

? ? //定義一個變量來存放data.btnTitle的值

? ? var title = this.data.btnTitle

? ? //若data.btnTitle的值為“暫停”,則清除定時器,同時data.btnTitle的值顯示為“開始”

? ? if (title == '暫停') {

? ? ? clearInterval(timer)

? ? ? this.setData({

? ? ? ? btnTitle: '開始'

? ? ? })

? ? }

? ? //否則游戲呈進行狀態,data.btnTitle的值顯示為“暫停”

? ? else {

? ? ? startGame()

? ? ? this.setData({

? ? ? ? btnTitle: '暫停'

? ? ? })

? ? }

? },

? click:function(){

? ? wx.redirectTo({

? ? ? url: '../home/home',

? ? })

? }

})

.wxml部分:


.wxss部分:

page{

? height:100%;

? width: 100%;

? background-color: beige;

}

.canvas {

? width:250px;

? height:250px;

? border: 5px solid black;

? border-radius: 20rpx;

}

.backView {

? ? width: 100%;

? ? height: 55%;

? ? background-size: 100% 100%;

? ? display: flex;

? ? align-items: center;

? ? justify-content: center;

}

.controlView {

? ? width: 100%;

? ? background-size: 100% 100%;

}

.btnClass{

? ? background: transparent;

? ? background-color: gray;

? ? width:20%;

}

.btnClass_02{

? ? background: transparent;

? ? background-color: gray;

? ? width:40%;

? ? margin-top:20rpx;

}

.mid_control{

? display: flex;

? margin-top: 20rpx;

? margin-bottom: 20rpx;

}

text{

? font-family: "楷體";

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 關于于小程序筆者就不做介紹了,官方有詳細文檔,我們還是先來看張圖吧 就是這個樣子的,游戲界面跟之前的OC版是差不多...
    Programmer客棧閱讀 2,584評論 0 0
  • 《ijs》速成開發手冊3.0 官方用戶交流:iApp開發交流(1) 239547050iApp開發交流(2) 10...
    葉染柒丶閱讀 5,256評論 0 7
  • 早就說開始用簡書寫東西,一直也沒寫,今天是15年第一天,就從今天開始吧!
    diyi閱讀 128評論 0 1
  • 1. 我朋友的叔叔住在京城后海,他的鄰居王某和曾某,兩個人自小就是朋友,都在一條街上作小買賣。 曾某人長...
    謙與默閱讀 1,213評論 0 1
  • 不知道是不是患上上班焦慮癥,這個周末的晚上莫名的煩惱,給家里打了個電話還是煩惱,跟我媽說我想過年回家就不出來了,在...
    紫嫣雨2012閱讀 190評論 0 0