You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化战舰游戏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:06:04