Java扫雷程序二维数组炸弹周边元素值修改失败求助
扫雷提示数计算问题修复
我帮你排查了代码里的几个关键问题,咱们一步步拆解并修复:
问题1:循环边界错误
你原来的循环条件是x < field.length - 1和y < field[0].length - 1,这直接导致最后一行和最后一列的元素完全不会被遍历到。比如你测试的2x2数组,x只能取0,y只能取0,而炸弹在(0,1)的位置,根本不会进入判断逻辑,自然不会修改周围的单元格。
问题2:未处理数组边界越界
当炸弹位于数组边缘(比如x=0或者x是最后一行索引)时,直接访问x-1或x+1会触发ArrayIndexOutOfBoundsException,而且这些位置本身就不存在,必须先判断是否在合法范围内。
问题3:重复的逻辑代码
你最后一个if判断重复写了field[x-1][y-1],应该是处理field[x][y+1]这个方向的单元格,这会导致某个方向的提示数被错误累加两次。
修复后的代码
我把代码重构了一下,用嵌套循环遍历8个方向,既避免重复代码,又统一处理边界检查:
public static void setHint(int[][] field) { // 遍历数组中的每一个单元格 for (int x = 0; x < field.length; x++) { for (int y = 0; y < field[x].length; y++) { // 找到炸弹(值为-1)的位置 if (field[x][y] == -1) { // 遍历炸弹周围的8个方向:dx和dy分别取-1、0、1,排除自身位置 for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { if (dx == 0 && dy == 0) { continue; // 跳过炸弹自身 } // 计算邻居单元格的坐标 int neighborX = x + dx; int neighborY = y + dy; // 检查邻居坐标是否在数组合法范围内,且该单元格不是炸弹 if (neighborX >= 0 && neighborX < field.length && neighborY >= 0 && neighborY < field[neighborX].length && field[neighborX][neighborY] != -1) { field[neighborX][neighborY] += 1; } } } } } } }
测试验证
用你提供的测试数组{ { 0, -1 }, { 0, 0 } }运行这个方法后,结果会变成{ {1, -1}, {1, 1} },完全符合你的预期。
内容的提问来源于stack exchange,提问作者Nathan Blasdell
相关产品推荐
相关产品推荐

