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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:47:45