-2

我正在尝试为一个项目制作 MineSweeper,但我被困在某个部分。下面的explode 方法工作正常,但似乎我无法在方法中调用该方法。在不发布所有代码的情况下,我想看看是否有人知道这是否是 Java 中已知的非法事物和/或如何绕过它。

public void explode(int row, int col) {
    if(board[row][col].mCount==0 && !board[row][col].isMine()) {
        for (int r = row - 1; r <= row + 1; r++) {
            for (int c = col - 1; c <= col + 1; c++)                        
            if ((r >= 0 && r < user.userRow) && (c >= 0 && c < user.userCol)) {
                board[r][c].setExposed(true);
                if(board[r][c].mCount == 0) {
                    explode(r,c); // <======= PROBLEM LINE
                }
            }
        }
    }
}

它没有给我一个编译错误,但是当我运行游戏时它会抛出一个错误。

4

1 回答 1

0

我想我明白发生了什么。你有你的邻居循环和我认为是正确的,除非你不排除“当前”索引。也就是说,在内部循环中,whenr == rowc == col方法以相同的索引调用自身。

另一件事是后续调用将“循环回”并检查先前的索引。例如,如果您正在检查row == 6, col == 7,则继续row == 6 + 1, col == 7 + 1检查将检查row == 7 - 1, col == 8 - 1。这可以通过检查网格位置是否已经显示来解决。

public void explode(int row, int col) {
    if (board[row][col].mCount==0 && !board[row][col].isMine()) {
        for (int r = row - 1; r <= row + 1; r++) {
            for (int c = col - 1; c <= col + 1; c++) {

                if (c == col && r == row) { // make sure it's
                    continue;               // not the current index
                }

                if ((r >= 0 && r < user.userRow)
                        && (c >= 0 && c < user.userCol)
                        && (!board[r][c].isExposed())) { // check if
                                                         // already shown
                    board[r][c].setExposed(true);

                    if(board[r][c].mCount == 0) {
                        explode(r,c);
                    }
                }
            }
        }
    }
}

您可能可以进行重构,以便逻辑更清晰,但无论如何我认为这是异常的原因。

顺便说一句,你在这里有这种语法,其中 for 循环不是一个块:

for(/* ... ... ... */)
if(/* ... ... ... */) {

}

这可能是你可以做的事情。当您有一些可能使程序崩溃的代码时,您应该尽可能保持语法清晰和常规。

于 2014-01-26T01:58:01.920 回答