前言在「猫猫大作战」中得分公式是整个游戏激励机制的核心。玩家合成的猫咪等级越高获得的分数越有爆发感。如果采用线性增长高级猫咪的合成动力不足如果增长太快低级猫咪就失去意义。最终我们选择了指数增长方案——3^(level-1) × 10再叠加连击倍率让每一组合成都充满期待。本文以GameEngine.tryMergeAt()中的得分计算为锚点讲解指数得分公式的设计思路、数学原理、连击倍率的叠加机制、以及这套公式在游戏平衡性上的考量。提示本系列不讲 ArkTS 基础语法与环境搭建假设你已跟完第 1–128 篇。本篇是阶段四第 129 篇。一、核心得分公式1.1 公式定义// 来源entry/src/main/ets/components/GameEngine.etsprivatecalculateMergeScore(catLevel:number,comboMultiplier:number):number{constbaseScoreCatConfig[catLevel].score;returnbaseScore*comboMultiplier;}CatConfig中预定义的各等级基础分exportconstCatConfig:RecordCatLevel,CatConfigItem{[CatLevel.SMALL]:{name:小猫,score:10,size:40,color:#FF9800},[CatLevel.MEDIUM]:{name:中猫,score:30,size:50,color:#F57C00},[CatLevel.LARGE]:{name:大猫,score:90,size:60,color:#E65100},[CatLevel.XLARGE]:{name:特大猫,score:270,size:70,color:#D84315},[CatLevel.SUPER]:{name:超级猫,score:810,size:80,color:#BF360C},[CatLevel.LEGENDARY]:{name:传奇猫,score:2430,size:90,color:#8E24AA},};1.2 背后的指数公式// 基础分 3^(level-1) × 10// 其中 level 从 1 开始SMALL 1constbaseScoreMath.pow(3,level-1)*10;等级level公式基础分倍率×2倍率×5倍率×8SMALL(1)13^0 × 1010205080MEDIUM(2)23^1 × 103060150240LARGE(3)33^2 × 1090180450720XLARGE(4)43^3 × 1027054013502160SUPER(5)53^4 × 10810162040506480LEGENDARY(6)63^5 × 10243048601215019440提示Math.pow(3, level - 1)的底数 3 对应「三只同级合成一只高级」的合并规则。每次合成投入 3 只猫咪产出 1 只高级猫得分恰好成指数增长形成「投入产出比」的正反馈。二、为什么选择指数增长2.1 线性 vs 指数对比// 线性增长方案已弃用constlinearScore40*level-30;// level 1 → 10, level 2 → 50, level 3 → 90, level 4 → 130...// 指数增长方案当前使用constexpScoreMath.pow(3,level-1)*10;// level 1 → 10, level 2 → 30, level 3 → 90, level 4 → 270...level线性 (40n-30)指数 (3^(n-1)×10)差距110101x250300.6x390901x41302702.1x51708104.8x6210243011.6x关键观察低等级阶段1-3两者差异不大给新手平滑的学习曲线中等级阶段4-5指数开始拉开差距给中级玩家成就感高等级阶段6指数爆发给核心玩家终极目标2.2 底数 3 的选择理由// 底数 2增长太慢Math.pow(2,level-1)*10;// 1→10, 2→20, 3→40, 4→80, 5→160... 传奇猫仅 160 分缺乏吸引力// 底数 3当前选择Math.pow(3,level-1)*10;// 1→10, 2→30, 3→90, 4→270, 5→810, 6→2430... 每 3 级 27 倍正反馈强// 底数 4增长太快Math.pow(4,level-1)*10;// 1→10, 2→40, 3→160, 4→640, 5→2560... 中猫合成奖励太高失衡底数 3 的三重意义三合一的规则匹配3 只同级合 1 只→底数为 3→奖励与投入成正比10 倍阈值玩家从合成传奇猫获得 2430 分 ≈ 243 次小猫合并成就感强分段增速低等级平缓高等级爆发形成「前期攒资源、后期冲高分」的策略节奏三、连击倍率系统3.1 连击机制// 来源GameEngine.ets — combo 状态管理interfaceComboInfo{count:number;// 连击次数multiplier:number;// 当前倍率lastMergeTime:number;// 上次合并时间戳ms}privateonMerge(x:number,y:number):void{constnowDate.now();constcomboWindow2000;// 2 秒内连续合并算连击if(now-this.combo.lastMergeTimecomboWindow){// 连击递增this.combo.count;this.combo.multiplierMath.min(this.combo.count,5);// 最大 5 倍}else{// 超时重置this.combo.count1;this.combo.multiplier1;}this.combo.lastMergeTimenow;// 计算本次合并得分constmergeScorethis.calculateMergeScore(cat.level,this.combo.multiplier);this.scoremergeScore;}3.2 倍率与得分累积// 连续合并示例// 时间轴t0ms → t500ms → t1000ms → t1500ms → t3000ms超时// 倍率 1x → 2x → 3x → 4x → 1x重置// 合并等级不同组合示例// 场景连续 3 次合成小猫每次间隔 2s// 第 1 次基础 10 分 × 1x 10 分// 第 2 次基础 10 分 × 2x 20 分// 第 3 次基础 10 分 × 3x 30 分// 总计60 分 无连击30 分 → 提升 2 倍// 场景连续 3 次合成大猫间隔 2s// 第 1 次基础 90 分 × 1x 90 分// 第 2 次基础 90 分 × 2x 180 分// 第 3 次基础 90 分 × 3x 270 分// 总计540 分 无连击270 分 → 提升 2 倍操作连击次数倍率小猫合并大猫合并传奇合并第 1 次合并11x10902430第 2 次连击22x201804860第 3 次连击33x302707290第 4 次连击44x403609720第 5 次连击55x最高5045012150提示连击倍率上限为 5 倍。这是经过测试后确定的平衡值——倍率太高会导致玩家只堆连击不看等级太低则连击系统缺乏吸引力。5 倍上限下一次 5 连击传奇合并可获得 12150 分占单局总分相当比例。四、递归合并中的得分累积4.1 链式合并得分当一次合并触发递归合并链时每次合并都单独计算得分// 来源GameEngine.ets — 递归合并链privatetryMergeAt(x:number,y:number):boolean{constcatthis.board[y][x];if(!cat||cat.falling)returnfalse;// 查找相邻同级猫咪constneighborsthis.findSameLevelNeighbors(x,y,cat.level);if(neighbors.length2)returnfalse;// 移除 3 只、创建高级猫this.removeCats([{x,y},...neighbors.slice(0,2)]);constnewLevelcat.level1;constnewCatthis.createCatAt(x,y,newLevel);// 得分计算本轮的连击倍率this.scorethis.calculateMergeScore(cat.level,this.combo.multiplier);// 递归检测新创建的猫是否能继续合并if(this.tryMergeAt(x,y)){// 递归链继续...}returntrue;}4.2 链式合并得分示例初始棋盘 (2,3): 小猫(Lv.1) (2,4): 小猫(Lv.1) (2,5): 小猫(Lv.1) (2,6): 中猫(Lv.2) (2,7): 中猫(Lv.2) 步骤 1投放在 (2,3) 处掉落一个小猫(Lv.1) → (2,3) (2,4) (2,5) 三只小猫相邻 → 合并为中猫(Lv.2) → 得分: 10 × 1x 10 步骤 2新中猫(Lv.2) 与 (2,6) (2,7) 的中猫相邻 → 递归合并 → 3 只中猫合并为大猫(Lv.3) → 得分: 30 × 1x 30 总得分: 10 30 40 分 如果步骤 1→2 在 2 秒内完成则步骤 2 享受 2x 倍率 60 分总分 70五、得分系统的 UI 展示5.1 实时得分显示// 来源entry/src/main/ets/pages/Index.etsbuild(){Column(){if(this.gameStateGameState.PLAYING){GameHUD({score:this.score,combo:this.combo,highScore:this.highScore})GameBoard({cats:this.cats,onColumnClick:(col)this.onColumnClick(col)})}}}5.2 合并动画时的浮动得分// 合并时弹出 XX 浮动文字BuilderScorePopup(score:number,multiplier:number){Text(${score}).fontSize(score100?24:18).fontWeight(FontWeight.Bold).fontColor(score500?#F39C12:#E74C3C).transition({type:TransitionType.Insert,opacity:0})}// 连击提示BuilderComboBadge(count:number){if(count3){Text(${count}x 连击!).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#E74C3C).shadow({radius:4,color:#FF6B6B,offsetY:2})}}六、得分公式验证6.1 单元测试// 得分计算验证functiontestScoreFormula(){// 小猫基础分assert.strictEqual(calculateMergeScore(CatLevel.SMALL,1),10);// 传奇猫基础分assert.strictEqual(calculateMergeScore(CatLevel.LEGENDARY,1),2430);// 5 倍连击assert.strictEqual(calculateMergeScore(CatLevel.SUPER,5),4050);}6.2 边界情况场景预期行为验证方法倍率为 0得分为 0实际倍率最小为 1倍率超过上限截断到 5xMath.min(count, 5)合并等级 0数组越界CatConfig 从 level 1 开始连击超时重置为 1xnow - last 2000判定递归合并每次合并独立算分链式回调累积七、游戏平衡性分析7.1 得分分布模型单局典型得分分布假设 3 分钟游戏时长 合并次数约 30-50 次 小猫合并占比60% → 约 300 分 中猫合并占比20% → 约 180 分 大猫合并占比12% → 约 324 分 特大猫合并占比5% → 约 405 分 超级猫合并占比2% → 约 486 分 传奇猫合并占比1% → 约 729 分 ────────────────────────── 预计单局平均总分约 2424 分7.2 刺激玩家策略不要贪快要贪连击等连续合并机会比快速投放收益大优先合成高等级一个传奇猫 (2430) 243 个小猫 (2430)但节省了大量操作控制节奏连击窗口 2 秒规划好再投放八、其他游戏得分方案参考方案公式特点典型游戏线性a × level b可预测、缺惊喜传统消除指数本游戏3^(n-1) × 10越高级越爽猫猫大作战斐波那契F(n) × k自然增长曲线合成类游戏对数log(n) × k等级越高增长越缓放置类游戏提示指数方案最适合「合并进化」类游戏——合成本身就是指数行为3 只变 1 只用指数得分匹配指数合成玩家直观感受「越合越赚」。九、性能考量// Math.pow 的性能在游戏循环中可接受// 但更好的做法是预计算级别分已经在 CatConfig 中预定义constprecomputedScores[0,10,30,90,270,810,2430];// 运行时直接查表避免每次调用 Math.powfunctiongetBaseScore(level:number):number{returnprecomputedScores[level]??0;}十、完整代码示例// GameEngine.ets 中的完整得分逻辑exportclassGameEngine{privatescore:number0;privatecombo:ComboInfo{count:0,multiplier:1,lastMergeTime:0};privatereadonlyCOMBO_WINDOW2000;// 2s 连击窗口privatereadonlyMAX_MULTIPLIER5;// 最高 5 倍privatecalculateMergeScore(catLevel:number,comboMultiplier:number):number{returnCatConfig[catLevel].score*comboMultiplier;}privateupdateCombo():void{constnowDate.now();if(now-this.combo.lastMergeTimethis.COMBO_WINDOW){this.combo.count;this.combo.multiplierMath.min(this.combo.count,this.MAX_MULTIPLIER);}else{this.combo.count1;this.combo.multiplier1;}this.combo.lastMergeTimenow;}tryMergeAt(x:number,y:number):boolean{// ... 合并逻辑 ...this.updateCombo();this.scorethis.calculateMergeScore(cat.level,this.combo.multiplier);// ... 递归合并 ...}getScore():number{returnthis.score;}getCombo():ComboInfo{return{...this.combo};}resetScore():void{this.score0;this.combo{count:0,multiplier:1,lastMergeTime:0};}}总结「猫猫大作战」的得分公式3^(level-1) × 10采用指数增长 连击倍率双重机制。指数增长与三合一规则匹配让高级合成收益远超低级连击倍率上限 5 倍激励玩家连续操作形成紧张的策略节奏。核心要点Math.pow(3, level-1)底数 3 对应三合一规则、 连击 2 秒窗口 倍率上限 5 防失衡、 递归链每次合并独立算分累积、 预计算查表优于运行时 Math.pow。下一篇将深入循环合并链——while merged 连锁反应实现级联消除。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源GameEngine.ets 完整源码Math.pow() MDN 文档游戏平衡性设计 — 知乎指数增长与游戏设计ArkTS setInterval 定时器开源鸿蒙跨平台社区HarmonyOS 开发者官方文档第 128 篇连击倍率实现第 130 篇循环合并链系列文章索引