最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實現(xiàn)2048小游戲功能思路詳解

 更新時間:2018年05月09日 11:02:45   作者:dry0106  
這篇文章主要介紹了vue實現(xiàn)2048小游戲功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

試玩地址

項目地址

使用方法:

git clone
npm i
npm run dev

實現(xiàn)思路如下:

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

關鍵實現(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ù)舉例,

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

因為一輪移動中,一個數(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),再進行移動。

以上移為例,只要將矩陣逆時針旋轉(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小游戲功能思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

最新評論

沧州市| 东港市| 施秉县| 茶陵县| 八宿县| 河津市| 齐齐哈尔市| 西和县| 榆树市| 尼勒克县| 保亭| 贡觉县| 会同县| 商城县| 呼和浩特市| 略阳县| 兴义市| 上饶县| 大丰市| 乌什县| 连江县| 庆阳市| 得荣县| 大庆市| 陆河县| 石柱| 灵璧县| 古交市| 开封市| 剑河县| 阜平县| 庐江县| 友谊县| 禹州市| 陆丰市| 千阳县| 武胜县| 宣汉县| 梁山县| 南召县| 黑河市|