我正在尝试为一个项目制作MineSweeper而且我被困在某个部分。下面的爆炸方法工作正常,但似乎我不能在方法中调用方法。如果没有发布所有代码,我想知道是否有人知道这是否是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
}
}
}
}
}
它没有给我一个编译错误,但是当我运行游戏时它会抛出一个错误。
答案 0 :(得分:0)
我想我知道发生了什么。你有你的邻居循环和那些我认为是正确的,除非你不排除“当前”索引。也就是说,在内部循环中,当r == row
和c == 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(/* ... ... ... */) {
}
这可能是你无法做到的事情。当你有一些可能导致程序崩溃的代码时,你应该尽可能保持语法清晰和传统。