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

扫雷游戏空白方块递归清除方法报错求助:数组下标越界异常

修复扫雷游戏的空白方块递归清除问题

你的扫雷游戏递归清除空白块的逻辑存在几个关键问题,导致了索引越界和功能不完整,我来一步步帮你解决:

问题分析

1. 边界判断逻辑完全错误

你的边界检查条件写反了逻辑关系,还误用了比较范围:

if (row < 0 && row > flipGrid.length && col < 0 && col > flipGrid[0].length)
  • 应该用||(或)而不是&&(与):只要索引越界其中一项成立,就应该停止递归
  • 数组的最大有效索引是长度-1,所以要判断row >= flipGrid.length和col >= flipGrid[0].length,而不是row > flipGrid.length
  • 这个错误直接导致索引越界时代码还继续执行,触发ArrayIndexOutOfBoundsException

2. 递归调用参数写错

在左方向的递归调用里,你错误地多减了一次索引:

clearTiles(newRow, newCol - 1);

这里newCol已经是col -1,再减1会直接让索引变成col-2,大概率触发越界,应该传newCol。

3. Direction变量的设计不合理

用全局的direction来避免来回跳转是个误区:

  • 递归过程中direction是共享状态,会被后续递归调用覆盖,导致很多方向的空白块无法被遍历
  • 这种方式只能沿着单一方向递归,没办法扩散到所有连通的空白区域

4. 缺少已访问标记

没有标记已经处理过的块,会导致重复递归同一个块,甚至陷入死循环(你用direction试图避免,但逻辑不成立)


修复后的代码

我重新设计了递归逻辑,用flipGrid本身作为已访问标记(flipGrid[row][col] = true代表已清除),同时修正了所有错误:

public void clearTiles(int row, int col) {
    // 边界检查:索引越界/已清除过,直接返回
    if (row < 0 || row >= flipGrid.length || col < 0 || col >= flipGrid[0].length || flipGrid[row][col]) {
        return;
    }

    // 非空白块(有数字的块)直接返回,只处理空白区域
    if (finalGrid[row][col] != 0) {
        return;
    }

    // 标记当前块为已清除
    flipGrid[row][col] = true;

    // 递归遍历上下左右四个方向,已访问标记会阻止重复处理
    clearTiles(row - 1, col); // 上
    clearTiles(row + 1, col); // 下
    clearTiles(row, col + 1); // 右
    clearTiles(row, col - 1); // 左
}

逻辑说明

  1. 边界与已访问检查:每次递归先判断索引是否合法,或者当前块是否已经被清除,符合任一条件就直接返回,彻底避免越界和重复处理
  2. 空白块过滤:只处理finalGrid[row][col]为0的空白块,非空白的数字块直接跳过
  3. 先标记再递归:先把当前块标记为已清除,再递归四个方向,确保后续递归不会重复处理同一个块
  4. 无方向限制:因为有了已访问标记,不用担心来回跳转的问题,四个方向可以自由递归,确保所有连通的空白块都被一次性清除

这样修改后,点击空白块时就能自动清除所有连通的空白区域,也不会再出现索引越界的异常了。如果还有其他细节问题,比如数字块的显示逻辑,随时可以补充代码细节哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:19