vue实现2048小游戏功能思路详解


Posted in Javascript onMay 09, 2018

试玩地址

项目地址

使用方法:

git clone
npm i
npm run dev

实现思路如下:

  1. 用vue-cli搭建项目,对这个项目可能有点笨重,但是也懒的再搭一个
  2. 4X4的方格用一个二维数组存放,绑定好后只关心这个二维数组,其他事交给vue
  3. 监听键盘事件
  4. 2048的核心部分就是移动合并的算法,因为是一个4X4的矩阵,所以只要实现左移的算法,其他方向的移动只需要将矩阵旋转,移动合并,再旋转回来,渲染dom即可
  5. 绑定不同数值的样式
  6. 分值计算,以及用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

按单行数据举例,

  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%了,只要再完善一下,加入分值,重新开始等功能就可以了。

总结

以上所述是小编给大家介绍的vue实现2048小游戏功能思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一个多次搜索+多次传值的解决方案
Jan 20 Javascript
jQuery 打造动态渐变按钮 详细图文教程
Apr 25 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
浅谈jquery回调函数callback的使用
Jan 30 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
js继承实现方法详解
Dec 16 Javascript
微信小程序 登录实例详解
Jan 16 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
vue使用Google地图的实现示例代码
Dec 19 Javascript
深入理解 JS 垃圾回收
Jun 03 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 #Javascript
vue中的provide/inject的学习使用
May 09 #Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 #Javascript
自定义vue组件发布到npm的方法
May 09 #Javascript
React Navigation 使用中遇到的问题小结
May 08 #Javascript
官方推荐react-navigation的具体使用详解
May 08 #Javascript
JavaScript callback回调函数用法实例分析
May 08 #Javascript
You might like
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python使用thrift教程的方法示例
2019/03/21 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python FFT合成波形的实例
2019/12/04 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
JAVA程序员面试题
2012/10/03 面试题
车队司机个人自我鉴定
2014/04/17 职场文书
入党积极分子评语
2014/05/04 职场文书
学生安全承诺书
2014/05/22 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
史上最牛的辞职信
2015/02/28 职场文书
奖励申请报告范文
2015/05/15 职场文书
演讲比赛通讯稿
2015/07/18 职场文书