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 相关文章推荐
Code: write(s,d) 输出连续字符串
Aug 19 Javascript
jQuery Ajax文件上传(php)
Jun 16 Javascript
JS实现时间格式化的方式汇总
Oct 16 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
SuperSlide2实现图片滚动特效
Jun 20 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
浅谈Express异步进化史
Sep 09 Javascript
关于layui表单中按钮自动提交的解决方法
Sep 09 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
Nov 19 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 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
海贼王:最美的悬赏令!
2020/03/02 日漫
php5数字型字符串加解密代码
2008/04/24 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
javascript tips提示框组件实现代码
2010/11/19 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
Python中单例模式总结
2018/02/20 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
pycharm修改file type方式
2019/11/19 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Python绘制组合图的示例
2020/09/18 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
文明村镇申报材料
2014/05/06 职场文书
建筑安全标语
2014/06/07 职场文书
自我推荐信格式模板
2015/03/24 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL