Java扫雷开发疑难:无法正确统计触碰'B'的方块数量
问题分析与修复方案
你遇到的问题主要来自代码里的几个关键逻辑错误,我帮你逐一拆解并修复:
核心问题点
- 字符串比较错误:Java里用
==比较字符串是对比对象引用,而非内容,必须用equals()方法才能正确判断是否等于"B"。 - Try/Catch的致命误用:你把整个双重循环塞进了try块,只要一次数组越界(比如x-1<0)就会触发异常并跳出整个循环——这就是为什么数组元素顺序会影响结果的根本原因!
- 包含自身坐标的无效检查:你的xCords和yCords包含了当前格子的坐标,既浪费性能,还可能引入逻辑干扰。
- 提前修改棋盘值:在循环内部就更新
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
相关产品推荐
相关产品推荐

