视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用vue实现2048小游戏步骤详解
2020-11-27 19:47:58 责编:小采
文档


这次给大家带来使用vue实现2048小游戏步骤详解,使用vue实现2048小游戏的注意事项有哪些,下面就是实战案例,一起来看一下。

git clone
npm i
npm run dev

实现思路如下:

  1. 用vue-cli搭建项目,对这个项目可能有点笨重,但是也懒的再搭一个

  2. 4X4的方格用一个二维数组存放,绑定好后只关心这个二维数组,其他事交给vue

  3. 监听键盘事件

  4. 2048的核心部分就是移动合并的算法,因为是一个4X4的矩阵,所以只要实现左移的算法,其他方向的移动只需要将矩阵旋转,移动合并,再旋转回来,渲染dom即可

  5. 绑定不同数值的样式

  6. 分值计算,以及用localstorage存放最高分

关键实现

DOM

<p class="box">
 <p class="row" v-for="row in list">
 <p class="col" :class="'n-'+col" v-for="col in row">{col}}</p>
 </p>
</p>

主要的游戏部分的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

  • 按单行数据举例,

    1. 遍历单行数组,若存在数据,记为cell,寻找cell往左可移到的最远空位置farthest

    2. 判断farthest的左边是否存在,不存在则直接移到到farthest

    3. 若存在,则判断farthest - 1的值和cell是否相同

    4. 相同=> 合并

    5. 不相同=>移到farthest位置

    6. 移动完后,清空cell

    7. 下一轮

    因为一轮移动中,一个数只能合并一次,所以每个格子要有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
     },

    到这时候已经完成了80%了,只要再完善一下,加入分值,重新开始等功能就可以了。

    相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    VeeValidate在vue项目里表单校验使用案例代码分析

    JavaScript DOM元素增删改步骤详解

    下载本文
    显示全文
    专题