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 相关文章推荐
基于jquery的气泡提示效果
May 31 Javascript
自己整理的一个javascript日期处理函数
Oct 16 Javascript
javascript中创建对象的几种方法总结
Nov 01 Javascript
javascript为下拉列表动态添加数据项
May 23 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
Jan 21 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
JS多物体实现缓冲运动效果示例
Dec 20 Javascript
angularjs $http实现form表单提交示例
Jun 09 Javascript
JavaScript高级函数应用之分时函数实例分析
Aug 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
php简单压缩css样式示例
2016/09/22 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
Python Series从0开始索引的方法
2018/11/06 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python解包用法详解
2021/02/17 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
《燕子》教学反思
2014/02/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
自荐信格式范文
2015/03/04 职场文书
化验室安全管理制度
2015/08/06 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
redis 解决库存并发问题实现数量控制
2022/04/08 Redis
python的html标准库
2022/04/29 Python