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)聽鍵盤事件
- 2048的核心部分就是移動(dòng)合并的算法,因?yàn)槭且粋€(gè)4X4的矩陣,所以只要實(shí)現(xiàn)左移的算法,其他方向的移動(dòng)只需要將矩陣旋轉(zhuǎn),移動(dòng)合并,再旋轉(zhuǎn)回來,渲染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ù)來記錄是否已經(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)
因?yàn)樯弦疲乱?,左移,右移?shí)際上是相同的,寫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%了,只要再完善一下,加入分值,重新開始等功能就可以了。
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)2048小游戲功能思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Vue實(shí)現(xiàn)記住賬號(hào)密碼功能的操作過程
這篇文章主要介紹了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ū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06使用vue-router在Vue頁(yè)面之間傳遞數(shù)據(jù)的方法
這篇文章主要介紹了使用vue-router在Vue頁(yè)面之間傳遞數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07vue下history模式刷新后404錯(cuò)誤解決方法
這篇文章主要介紹了vue下history模式刷新后404錯(cuò)誤解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08