当前位置: 首页 > article >正文

vue实现2048小游戏

演示

直接上demo

游戏规则

参考:2048 (游戏) - 维基百科

  • 《2048》在4×4的网格上进行。玩家可以使用上、下、左、右四个方向键移动所有方块。但在部分情形下,某些方向不可移动。
  • 游戏开始时,网格上会出现两个数值为2或4的方块。
  • 每次移动后,另一个数值为2或4的新方块会随机出现在空方格上。
  • 方块会沿着指定的方向滑动,直到被其它方块或网格边缘阻挡。
  • 如果两个相同数值的方块碰撞,它们将合并成一个方块,其数值等于两个方块的数值之和。
  • 如果三个数值相同的方块碰撞,则只会合并靠近终点方向的两个方块,距起点最近的方块的数值不变。
  • 若一行或一列中的方块数值均相同,则沿着该行或该列滑动会合并前两个和后两个方块。
  • 在同一移动过程中,新生成的方块不能再与其他方块合并。
  • 数值较高的方块会发出柔和的光芒;但随着得分增加,光芒会不断变暗。
  • 方块数值都是2的幂,最大为131072。
  • 界面右上方的记分牌会记录玩家的分数。玩家的初始分数为零,每当两个方块合并时,分数会增加,得分取决于合并后方块的数值。

游戏玩法就是上下左右操作,相应地滑动、合并、创建新块

完善游戏还有一些附加功能,比如计分、撤回、重新开始、游戏结束等,demo暂不考虑这些

分析

游戏数据是一个4*4的矩阵

对于一个左划操作:

  • 滑动:将矩阵的每一行向左移动
  • 合并:如果相邻的两个方块的值相同,合并成一个方块,只合并一次

对于其它方向的操作,可以通过矩阵的转置、反转来归为左划操作。完成数据处理后再转换回来即可

代码实现

完整demo见第一节的演示👆

  • “行”的移动处理:
// 移动,例如:[2,null,2,2] -> [2,2,2,null]
function moveToLeft(row) {
  let count = 0
  // 遍历数组,将有效值依次从头(count)开始赋值到原数组上
  row.forEach((cell, colIdx) => {
    if (!cell) return
    row[colIdx] = null
    row[count++] = cell
  })
}
  • “行”的合并处理:
// 合并,例如:[2,2,2,null] -> [4,2,null,null], [2,2,2,2] -> [4,4,null,null]
function mergeToLeft(row) {
  let count = 0
  // 遍历数组,连续两个相同有效值合并。将合并值或原值依次从头(count)开始赋值到原数组上
  for (let i = 0; i < row.length; i++) {
    const cell = row[i]
    if (!cell) continue
    row[i] = null
    // 合并
    if (cell === row[i + 1]) {
      row[i + 1] = null
      const newCell = cell * 2
      row[count++] = newCell
      i++
    } else {
      row[count++] = cell
    }
  }
}

其实完全可以一次遍历完成移动与合并,但可能会更复杂,难以理解

JUST FOR FUN

最后,这是个人开发部署的一个在线2048游戏


http://www.kler.cn/a/451619.html

相关文章:

  • 三维动画的常用“视觉特效”有哪些?
  • 【时间之外】IT人求职和创业应知【74】-运维机器人
  • vue3 如何使用 mounted
  • 简单了解函数递归
  • 国自然面上项目分享|基于人工智能和病理组学的早癌筛查算法研究|基金申请·24-12-24
  • 图像处理-Ch6-彩色图像处理
  • DP83848以太网移植流程,可以TCP通信
  • element-puls封装表单验证
  • python中使用selenium执行组合快捷键ctrl+v不生效问题
  • C++ 的大括号的用法合集
  • Hive与HBase的区别有哪些
  • 商城小程序开发有哪些流程?传统商家如何抓住小程序的流量!
  • 【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
  • 项目练习:element-ui的valid表单验证功能用法
  • 常见API
  • 【Rust自学】6.2. Option枚举
  • Log4j1.27配置日志输出级别不起效
  • 《C++设计模式》工厂模式
  • 抖音视频下载去水印工具推荐
  • DATAHUB FRONTEND 开发测试:
  • WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
  • “开启智能新时代”——机器连接与边缘计算
  • 微信小程序:解决顶部被遮挡的问题
  • Python8-写一些小作业
  • QT的错误记录:同文件的的两个QThread子类信号槽关联
  • MySQL for update skip locked 与 for update nowait