HarmonyOS应用开发实战:猫猫大作战-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 分
五、最佳实践
- 递归深度限制:防止无限递归
- 每次合并独立计分:链中每次合并都受连击倍率影响
- 移除后再创建:先移除旧猫再创建新猫,避免干扰检测
- 动画分离:合并动画与逻辑分离,动画异步播放
总结
循环合并链通过递归实现级联合并,一次投放可能触发多次升级。核心要点:递归调用 tryMergeAt、 MAX_CHAIN 限制深度、 每次合并独立计分、 移除→创建→递归三步。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐


所有评论(0)