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

Java扫雷开发疑难:无法正确统计触碰'B'的方块数量

问题分析与修复方案

你遇到的问题主要来自代码里的几个关键逻辑错误,我帮你逐一拆解并修复:

核心问题点

  1. 字符串比较错误:Java里用==比较字符串是对比对象引用,而非内容,必须用equals()方法才能正确判断是否等于"B"。
  2. Try/Catch的致命误用:你把整个双重循环塞进了try块,只要一次数组越界(比如x-1<0)就会触发异常并跳出整个循环——这就是为什么数组元素顺序会影响结果的根本原因!
  3. 包含自身坐标的无效检查:你的xCords和yCords包含了当前格子的坐标,既浪费性能,还可能引入逻辑干扰。
  4. 提前修改棋盘值:在循环内部就更新board[x][y] = n,会导致统计过程中提前覆盖目标格子的值,无法得到正确的总数。

修复后的代码

public static int numTouching(int x, int y) {
    int n = 0;
    // 跳过炸弹本身,不需要统计
    if ("B".equals(board[x][y])) {
        return 0;
    }

    // 遍历所有8个相邻方向(排除自身)
    for (int dx = -1; dx <= 1; dx++) {
        for (int dy = -1; dy <= 1; dy++) {
            // 跳过当前格子,只检查相邻的8个位置
            if (dx == 0 && dy == 0) {
                continue;
            }
            int xPos = x + dx;
            int yPos = y + dy;
            // 先检查坐标是否在棋盘范围内,彻底避免越界问题
            if (xPos >= 0 && xPos < board.length && yPos >= 0 && yPos < board[xPos].length) {
                if ("B".equals(board[xPos][yPos])) {
                    n++;
                }
            }
        }
    }

    // 统计完成后再统一赋值,确保结果正确
    board[x][y] = String.valueOf(n);
    return n;
}

修复细节说明

  • 替换字符串比较方式:用"B".equals(board[x][y])既保证了内容对比的正确性,还能避免空指针异常。
  • 移除try/catch,改用边界检查:直接判断坐标是否在棋盘合法范围内,不会因为单次越界中断整个循环,所有相邻位置都会被检查到。
  • 排除自身坐标:通过dx == 0 && dy == 0跳过当前格子,避免无效的自我检查。
  • 延迟赋值操作:把棋盘更新放在循环结束后,确保统计的是所有相邻炸弹的总数,而非中途的临时值。
  • 优化遍历逻辑:用dx/dy的循环代替固定数组,逻辑更清晰,彻底解决数组顺序影响结果的问题。

预期测试效果

针对你给出的3x3初始棋盘:

0   0   0   
0   B   0   
0   0   0   

调用修复后的numTouching后,会得到标准扫雷的正确结果:

1   1   1   
1   B   1   
1   1   1   

此时numTouching(0,1)会返回1,numTouching(1,0)也会返回1,完全符合预期。

内容的提问来源于stack exchange,提问作者Wisely

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:30:37