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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
Javascript 陷阱 window全局对象
Nov 26 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
May 17 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
May 08 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 Javascript
js利用拖放实现添加删除
Aug 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
php 中文字符入库或显示乱码问题的解决方法
2010/04/12 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
微信小程序-API接口安全详解
2019/07/16 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
python实现计算倒数的方法
2015/07/11 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python 公共方法汇总解析
2019/09/16 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
买卖车协议书
2014/04/21 职场文书
火箭队口号
2014/06/18 职场文书
统招统分证明
2015/06/23 职场文书