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 相关文章推荐
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
May 22 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
瀑布流布局代码一例
Apr 11 Javascript
JavaScript实现删除,移动和复制文件的方法
Aug 05 Javascript
AngularJS Module方法详解
Dec 08 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
Apr 17 Javascript
Node.js事件的正确使用方法
Apr 05 Javascript
vue el-table实现行内编辑功能
Dec 11 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中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
php实现映射操作实例详解
2019/10/02 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
python创建列表并给列表赋初始值的方法
2015/07/28 Python
python psutil库安装教程
2018/03/19 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
企业管理毕业生求职信范文
2014/03/07 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang