如何优化战舰游戏CollisionChecker方法中的冗余if-else逻辑?
碰撞检测逻辑优化方案
核心优化思路:因为你已经提前完成了非对角线放置校验,所以输入的两个坐标必然属于水平放置(字母相同、数字不同)或垂直放置(数字相同、字母不同)两种情况,完全不需要多层if-else判断输入顺序,直接通过取上下界的方式确定循环范围即可。
优化后的实现代码如下:
static bool CollisionChecker(Grid[][] gridPlane, CoordinateLetter coordinateLetter1, CoordinateLetter coordinateLetter2, int coordinateNumber1, int coordinateNumber2) { // 水平放置:字母相同,遍历数字区间 if (coordinateLetter1 == coordinateLetter2) { int letterIndex = (int)coordinateLetter1; // 直接取数字的最小和最大值作为循环上下界,自动适配正倒序输入 int minNum = Math.Min(coordinateNumber1, coordinateNumber2); int maxNum = Math.Max(coordinateNumber1, coordinateNumber2); for (int num = minNum; num <= maxNum; num++) { // 注意:如果网格数字下标从0开始,这里替换为num-1即可 if (gridPlane[letterIndex][num].Content is ShipContent) { // 存在碰撞直接返回false return false; } } } // 垂直放置:数字相同,遍历字母区间 else { int numIndex = coordinateNumber1; // 直接取字母枚举值的最小和最大值作为循环上下界 int minLetter = Math.Min((int)coordinateLetter1, (int)coordinateLetter2); int maxLetter = Math.Max((int)coordinateLetter1, (int)coordinateLetter2); for (int letter = minLetter; letter <= maxLetter; letter++) { // 注意:如果网格数字下标从0开始,这里替换为numIndex-1即可 if (gridPlane[letter][numIndex].Content is ShipContent) { return false; } } } // 所有点位都无碰撞返回true return true; }
优化后优势:
- 砍掉了所有冗余的顺序判断分支,代码逻辑清晰,可维护性大幅提升
- 无需额外处理输入正倒序,
Math.Min和Math.Max天然适配两种输入场景 - 后续如果需要修改碰撞校验规则,只需要调整循环内的判断逻辑即可,无需改动外层分支
内容的提问来源于stack exchange,提问作者Cyrendex
相关产品推荐
相关产品推荐

