国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

vue實現2048小游戲功能思路詳解

2024-05-06 15:34:29
字體:
來源:轉載
供稿:網友

試玩地址

項目地址

使用方法:

git clonenpm inpm run dev

實現思路如下:

    用vue-cli搭建項目,對這個項目可能有點笨重,但是也懶的再搭一個 4X4的方格用一個二維數組存放,綁定好后只關心這個二維數組,其他事交給vue 監聽鍵盤事件 2048的核心部分就是移動合并的算法,因為是一個4X4的矩陣,所以只要實現左移的算法,其他方向的移動只需要將矩陣旋轉,移動合并,再旋轉回來,渲染dom即可 綁定不同數值的樣式 分值計算,以及用localstorage存放最高分

關鍵實現

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,很簡單,用一個二維數組渲染,并動態綁定樣式

左移

主要由以下幾種情況:

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

按單行數據舉例,

    遍歷單行數組,若存在數據,記為cell,尋找cell往左可移到的最遠空位置farthest 判斷farthest的左邊是否存在,不存在則直接移到到farthest 若存在,則判斷farthest - 1的值和cell是否相同 相同=> 合并 不相同=>移到farthest位置 移動完后,清空cell 下一輪

因為一輪移動中,一個數只能合并一次,所以每個格子要有merged參數來記錄是否已經合并過。

主要代碼:

_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      }    }  })

矩陣旋轉

因為上移,下移,左移,右移實際上是相同的,寫4遍也可以,但是容易出錯,所以我直接旋轉將矩陣旋轉,再進行移動。

以上移為例,只要將矩陣逆時針旋轉一次,上移就變成了左移,移動合并成之后,只要再將矩陣逆時針旋轉4-1次,矩陣就和單純上移一樣了。

逆時針旋轉算法:

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  },            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 高碑店市| 北票市| 四川省| 闵行区| 南开区| 黄石市| 大港区| 莱芜市| 湄潭县| 沁水县| 郯城县| 开化县| 雷山县| 虎林市| 饶河县| 大理市| 武宣县| 宕昌县| 石门县| 会泽县| 田林县| 阳城县| 霞浦县| 大城县| 镇康县| 时尚| 富宁县| 衡水市| 喀喇沁旗| 乌审旗| 社会| 西宁市| 乌兰浩特市| 华亭县| 中方县| 长宁县| 樟树市| 通化县| 台湾省| 平舆县| 六安市|