vue實現(xiàn)2048小游戲功能思路詳解
使用方法:
git clone npm i npm run dev
實現(xiàn)思路如下:
- 用vue-cli搭建項目,對這個項目可能有點(diǎn)笨重,但是也懶的再搭一個
- 4X4的方格用一個二維數(shù)組存放,綁定好后只關(guān)心這個二維數(shù)組,其他事交給vue
- 監(jiān)聽鍵盤事件
- 2048的核心部分就是移動合并的算法,因為是一個4X4的矩陣,所以只要實現(xiàn)左移的算法,其他方向的移動只需要將矩陣旋轉(zhuǎn),移動合并,再旋轉(zhuǎn)回來,渲染dom即可
- 綁定不同數(shù)值的樣式
- 分值計算,以及用localstorage存放最高分
關(guān)鍵實現(xiàn)
DOM
<div class="box"> <div class="row" v-for="row in list"> <div class="col" :class="'n-'+col" v-for="col in row">{col}}</div> </div> </div>
主要的游戲部分的DOM,很簡單,用一個二維數(shù)組渲染,并動態(tài)綁定樣式
左移
主要由以下幾種情況:
- 2 2 2 2 => 4 4 0 0
- 4 2 2 2 => 4 4 2 0
- 0 4 2 2=> 4 4 0 0
- 2 2 4 2 => 4 4 2 0
按單行數(shù)據(jù)舉例,
- 遍歷單行數(shù)組,若存在數(shù)據(jù),記為cell,尋找cell往左可移到的最遠(yuǎn)空位置farthest
- 判斷farthest的左邊是否存在,不存在則直接移到到farthest
- 若存在,則判斷farthest - 1的值和cell是否相同
- 相同=> 合并
- 不相同=>移到farthest位置
- 移動完后,清空cell
- 下一輪
因為一輪移動中,一個數(shù)只能合并一次,所以每個格子要有merged參數(shù)來記錄是否已經(jīng)合并過。
主要代碼:
_list.forEach(item => { let farthest = this.farthestPosition(list, item) let next = list[farthest - 1] if (next && next === item.value && !_list[farthest - 1].merged) { //合并 list[farthest - 1] = next * 2 list[item.x] = undefined item = { x: farthest - 1, merged: true, value: next * 2 } this.score += next * 2 } else { if (farthest != item.x) { list[farthest] = item.value list[item.x] = undefined item.x = farthest } } })
矩陣旋轉(zhuǎn)
因為上移,下移,左移,右移實際上是相同的,寫4遍也可以,但是容易出錯,所以我直接旋轉(zhuǎn)將矩陣旋轉(zhuǎn),再進(jìn)行移動。
以上移為例,只要將矩陣逆時針旋轉(zhuǎn)一次,上移就變成了左移,移動合并成之后,只要再將矩陣逆時針旋轉(zhuǎn)4-1次,矩陣就和單純上移一樣了。
逆時針旋轉(zhuǎn)算法:
rotate(arr, n) { n = n % 4 if (n === 0) return arr let tmp = Array.from(Array(this.size)).map(() => Array(this.size).fill(undefined)) for (let i = 0; i < this.size; i++) { for (let j = 0; j < this.size; j++) { tmp[this.size - 1 - i][j] = arr[j][i] } } if (n > 1) tmp = this.rotate(tmp, n - 1) return tmp },
到這時候已經(jīng)完成了80%了,只要再完善一下,加入分值,重新開始等功能就可以了。
總結(jié)
以上所述是小編給大家介紹的vue實現(xiàn)2048小游戲功能思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
詳解VUE自定義組件中用.sync修飾符與v-model的區(qū)別
這篇文章主要介紹了詳解VUE自定義組件中用.sync修飾符與v-model的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06使用vue-router在Vue頁面之間傳遞數(shù)據(jù)的方法
這篇文章主要介紹了使用vue-router在Vue頁面之間傳遞數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07