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 相关文章推荐
Prototype1.5 rc2版指南最后一篇之Position
Jan 10 Javascript
document.compatMode介绍
May 21 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
Mar 03 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
Jul 27 Javascript
BOM之navigator对象和用户代理检测
Feb 10 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
JavaScript实现移动端轮播效果
Jun 06 Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 Javascript
js replace替换字符串同时替换多个方法
Nov 27 Javascript
JS实现打砖块游戏
Feb 14 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 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中的float类型使用说明
2010/07/27 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
python抓取网页内容示例分享
2014/02/24 Python
在Python下尝试多线程编程
2015/04/28 Python
python select.select模块通信全过程解析
2017/09/20 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
Python实现最常见加密方式详解
2019/07/13 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
python实现udp传输图片功能
2020/03/20 Python
班主任工作经验交流材料
2014/05/13 职场文书
单位授权委托书范文
2014/08/02 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
导游词之上海豫园
2019/10/24 职场文书