文章配图:merge-chain 循环合并链

页面预览

前言

在「猫猫大作战」中,当三只同级猫咪合并为一只高级猫后,新猫可能与周围的同级猫再次触发合并——这就是循环合并链。递归合并是本游戏的核心爽感来源之一,一次投放可能触发 3-5 次连锁合并。

一、递归合并实现

private tryMergeAt(x: number, y: number): boolean {
  const cat = this.board[y][x];
  if (!cat || cat.falling) return false;

  const neighbors = this.findSameLevelNeighbors(x, y, cat.level);
  if (neighbors.length < 2) return false;

  // 1. 移除三只同级猫
  const catsToRemove = [{ x, y }, ...neighbors.slice(0, 2)];
  this.removeCats(catsToRemove);

  // 2. 升级
  const newLevel = cat.level + 1;
  this.createCatAt(x, y, newLevel);

  // 3. 计分
  this.score += this.calculateMergeScore(cat.level, this.combo.multiplier);

  // 4. 递归检测
  if (this.tryMergeAt(x, y)) {
    console.info(`递归合并继续: (${x},${y}) 升级到 ${newLevel + 1}`);
  }

  return true;
}

二、链式合并示例

投放前:
  (2,3): Lv.1  (2,4): Lv.1  (2,5): Lv.1
  (2,6): Lv.2  (2,7): Lv.2

投放 Lv.1 到 (2,3) →
  合并 Lv.1×3 → Lv.2(新猫在 (2,4))
    ↓ 递归
  Lv.2 与 (2,6)(2,7) 合并 → Lv.3(新猫在 (2,5))
    ↓
  得分: 10 + 30 = 40(无连击)
  或: 10 + 60 = 70(2s 内连击 2x)

三、性能控制

private readonly MAX_CHAIN = 10;  // 防止无限递归

private tryMergeAtWithLimit(x: number, y: number, depth: number = 0): boolean {
  if (depth > this.MAX_CHAIN) {
    console.warn('合并链超限,强制终止');
    return false;
  }
  // ... 合并逻辑 ...
  return this.tryMergeAtWithLimit(x, y, depth + 1);
}
参数 说明
MAX_CHAIN 10 最大递归深度
触发条件 每次合并后检测新位置 级联
结束条件 无同级相邻猫或超限 终止

四、得分累积

// 链式合并的得分:每次合并独立计分(受连击倍率影响)
// Lv.1→Lv.2: 10 × combo
// Lv.2→Lv.3: 30 × combo
// Lv.3→Lv.4: 90 × combo
// ...

// 如果链式合并 4 次(1→5)且全程 5x 连击:
// (10+30+90+270) × 5 = 2000 分

五、最佳实践

  1. 递归深度限制:防止无限递归
  2. 每次合并独立计分:链中每次合并都受连击倍率影响
  3. 移除后再创建:先移除旧猫再创建新猫,避免干扰检测
  4. 动画分离:合并动画与逻辑分离,动画异步播放

总结

循环合并链通过递归实现级联合并,一次投放可能触发多次升级。核心要点:递归调用 tryMergeAtMAX_CHAIN 限制深度、 每次合并独立计分、 移除→创建→递归三步

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐