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 相关文章推荐
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
js点击事件链接的问题解决
Apr 25 Javascript
jquery实现下拉框多选方法介绍
Jan 03 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 Javascript
js canvas实现红包照片效果
Aug 21 Javascript
微信小程序实现签到功能
Oct 31 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
JS操作json对象key、value的常用方法分析
Oct 29 Javascript
javascript实现贪吃蛇小游戏
Jul 28 Javascript
vue中实现点击变成全屏的多种方法
Sep 27 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原理的opcodes(操作码)
2010/10/26 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
php导入导出excel实例
2013/10/25 PHP
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
Python pymongo模块用法示例
2018/03/31 Python
如何通过Python实现标签云算法
2019/07/02 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
精彩的推荐信范文
2013/11/26 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
小升初自荐信范文
2015/03/05 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
创业计划书之养殖业
2019/10/11 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript