用 JavaScript 实现 2048:移动与合并的核心逻辑

举报
yd_212706433 发表于 2026/10/22 13:54:18 2026/10/22
【摘要】 用一个行合并函数实现 2048 的核心规则,并复用到四个移动方向,说明随机生成、得分与结束判定中的易错点。

2048 可以用一个 4×4 二维数组表示棋盘,0 代表空格。界面用 CSS Grid 绘制,键盘事件负责触发移动,核心算法只处理数组,便于独立验证。

1. 先实现一行向左移动

规则是:去掉空格,相邻同值合并一次,再在右侧补零。每次合并把新数字加入本轮得分。

function slideLeft(row) {
  const values = row.filter(n => n !== 0);
  const result = [];
  let score = 0;
  for (let i = 0; i < values.length; i++) {
    if (i + 1 < values.length && values[i] === values[i + 1]) {
      const merged = values[i] * 2;
      result.push(merged);
      score += merged;
      i++; // 跳过已参与合并的数字
    } else {
      result.push(values[i]);
    }
  }
  while (result.length < row.length) result.push(0);
  return { row: result, score };
}

例如 [2, 0, 2, 4] 得到 [4, 4, 0, 0],本轮加 4 分;[2, 2, 2, 2] 得到 [4, 4, 0, 0],不能继续合并成 8。跳过已合并元素,可以保证每个方块每轮只合并一次。

2. 复用到四个方向

左移直接处理各行;右移先反转一行,处理后再反转。上移按从上到下的顺序取出各列;下移反转列后处理,再按原位置写回。这样四个方向共用同一套合并逻辑。

3. 更新棋盘与结束判定

每次移动先保存旧棋盘,再比较新旧数组。只有棋盘发生变化,才在随机空格生成一个新数字:通常 90% 为 2、10% 为 4。初始化时生成两个数字,避免无效按键也增加方块。

出现 2048 时提示获胜;没有空格,且任意横向、纵向相邻数字都不相等时,判定无法继续移动。渲染与计算分开后,还可以加入分数显示、重新开始和 localStorage 存档。

实现时重点检查三种情况:连续相同数字、带空格的合并,以及无效移动。先保证规则正确,再添加动画,调试会轻松很多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。