vue實(shí)現(xiàn)2048小游戲功能思路詳解
使用方法:
git clone npm i npm run dev
實(shí)現(xiàn)思路如下:
- 用vue-cli搭建項(xiàng)目,對(duì)這個(gè)項(xiàng)目可能有點(diǎn)笨重,但是也懶的再搭一個(gè)
- 4X4的方格用一個(gè)二維數(shù)組存放,綁定好后只關(guān)心這個(gè)二維數(shù)組,其他事交給vue
- 監(jiān)聽(tīng)鍵盤(pán)事件
- 2048的核心部分就是移動(dòng)合并的算法,因?yàn)槭且粋€(gè)4X4的矩陣,所以只要實(shí)現(xiàn)左移的算法,其他方向的移動(dòng)只需要將矩陣旋轉(zhuǎn),移動(dòng)合并,再旋轉(zhuǎn)回來(lái),渲染dom即可
- 綁定不同數(shù)值的樣式
- 分值計(jì)算,以及用localstorage存放最高分
關(guān)鍵實(shí)現(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,很簡(jiǎn)單,用一個(gè)二維數(shù)組渲染,并動(dòng)態(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位置
- 移動(dòng)完后,清空cell
- 下一輪
因?yàn)橐惠喴苿?dòng)中,一個(gè)數(shù)只能合并一次,所以每個(gè)格子要有merged參數(shù)來(lái)記錄是否已經(jīng)合并過(guò)。
主要代碼:
_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)
因?yàn)樯弦?,下移,左移,右移?shí)際上是相同的,寫(xiě)4遍也可以,但是容易出錯(cuò),所以我直接旋轉(zhuǎn)將矩陣旋轉(zhuǎn),再進(jìn)行移動(dòng)。
以上移為例,只要將矩陣逆時(shí)針旋轉(zhuǎn)一次,上移就變成了左移,移動(dòng)合并成之后,只要再將矩陣逆時(shí)針旋轉(zhuǎn)4-1次,矩陣就和單純上移一樣了。
逆時(shí)針旋轉(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
},
到這時(shí)候已經(jīng)完成了80%了,只要再完善一下,加入分值,重新開(kāi)始等功能就可以了。
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)2048小游戲功能思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Vue實(shí)現(xiàn)記住賬號(hào)密碼功能的操作過(guò)程
這篇文章主要介紹了Vue實(shí)現(xiàn)記住賬號(hào)密碼功能,用戶登錄時(shí)若勾選“記住我”功能選項(xiàng),則將登錄名和密碼(加密后)存入本地緩存,下次登錄頁(yè)面加載時(shí)自動(dòng)獲取保存好的賬號(hào)和密碼(需解密),回顯到登錄輸入框中,下面分享我實(shí)現(xiàn)的具體步驟,需要的朋友可以參考下2022-07-07
詳解VUE自定義組件中用.sync修飾符與v-model的區(qū)別
這篇文章主要介紹了詳解VUE自定義組件中用.sync修飾符與v-model的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
使用vue-router在Vue頁(yè)面之間傳遞數(shù)據(jù)的方法
這篇文章主要介紹了使用vue-router在Vue頁(yè)面之間傳遞數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vue下history模式刷新后404錯(cuò)誤解決方法
這篇文章主要介紹了vue下history模式刷新后404錯(cuò)誤解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

