HarmonyOS应用开发实战:猫猫大作战-merge-detect 合并检测算法

📅 发布时间:2026/7/30 3:02:56
HarmonyOS应用开发实战:猫猫大作战-merge-detect 合并检测算法 前言在「猫猫大作战」中每次猫咪着陆或新猫出现后需要检测是否有三只以上同级猫咪相邻。合并检测是游戏逻辑的核心环节。一、合并检测privatedetectMerges():void{consttoMerge:{x:number;y:number}[][];// 遍历棋盘所有位置for(lety0;yGameConfig.BOARD_HEIGHT;y){for(letx0;xGameConfig.BOARD_WIDTH;x){constcatthis.board[y][x];if(!cat||cat.falling)continue;// 查找同级邻居constneighborsthis.findSameLevelNeighbors(x,y,cat.level);if(neighbors.length2){toMerge.push({x,y},...neighbors.slice(0,2));}}}this.processMergeBatch(toMerge);}二、邻居查找privatefindSameLevelNeighbors(x:number,y:number,level:CatLevel):{x:number;y:number}[]{constdirections[[-1,0],[1,0],// 左右[0,-1],[0,1],// 上下];constneighbors:{x:number;y:number}[][];for(const[dx,dy]ofdirections){constnxxdx;constnyydy;// 边界检查if(nx0||nx5||ny0||ny8)continue;constcatthis.board[ny][nx];if(cat!cat.fallingcat.levellevel){neighbors.push({x:nx,y:ny});}}returnneighbors;}三、批量合并privateprocessMergeBatch(cats:{x:number;y:number}[]):void{// 去重constuniquenewSet(cats.map(c${c.x},${c.y}));if(unique.size3)return;// 取前三个consttoRemoveArray.from(unique).slice(0,3).map(k{const[x,y]k.split(,).map(Number);return{x,y};});// 执行合并constfirsttoRemove[0];constcatthis.board[first.y][first.x];if(!cat)return;// 移除this.removeCats(toRemove);// 升级constnewLevelMath.min(cat.level1,CatLevel.LEGENDARY)asCatLevel;this.createCatAt(first.x,first.y,newLevel);// 递归this.tryMergeAt(first.x,first.y);}四、检测时机时机触发说明猫咪着陆后立即检测新停落的猫合并升级后递归检测新生成的猫新猫投放后检测新猫位置防止重叠五、最佳实践全盘扫描 vs 局部检测着陆猫只检测局部批量合并全盘扫描去重处理同一个猫可能被多次检测到递归链合并后立即检测新位置性能控制MAX_CHAIN防止无限递归总结合并检测扫描棋盘查找同级相邻猫咪触发合并升级。核心要点四方向邻居检测、 批量合并去重、 递归链式响应。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源GameEngine 源码第 124 篇forEch-update第 126 篇level-up第 130 篇merge-chain