0

そのため、マインスイーパ ゲームでカスケード リビールを行うメソッドの大部分があります。私はソリューションのボードと現在のグリッドの 1 つを持っています。しかし、問題は、0 スペースに遭遇すると、再帰呼び出しでスタック オーバーフロー エラーが発生することです。

誰にもアイデアはありますか?

public static void revealCell(int row, int col, char[][] grid, char[][] answers) {
    System.out.println(row + " " + col);
    if(row < 0|| row > 4){
        System.out.println("bad");
        return;
    }
    if(col < 0|| col > 4){
        System.out.println("bad");
        return;
    }
    if(answers[row][col] == 'B'){
        grid[row][col] = answers[row][col];
        return;
    }
    if(answers[row][col] == '1'||answers[row][col] == '2'||answers[row][col] == '3'||answers[row][col] == '4'||answers[row][col] == '5'){
        grid[row][col] = answers[row][col];
        return;
    }

    if(answers[row][col] == '0'){
        System.out.println("go");
        grid[row][col] = answers[row][col];
        for(int i = row-1; i <= row +1; i++){
            for(int j = col-1; j<= col +1;j++){
                revealCell(i,j, grid, answers);
            }
        }
    }
}
4

2 に答える 2

0

ネストされたループが繰り返し を呼び出してrevealCell(row, col, ...)います。ループを再構築するか、単にif i!=row && j!=colガードを挿入してください。

この変更後も無限再帰が発生する可能性があります。マインスイーパ ゲームをコーディングしてからしばらく経ちましたが、同じセルを繰り返しチェックすることを避けるために、IIRC では 4 つの異なる再帰呼び出しを使用しました。行、減少する列)、右上の象限(増加する行、増加する列)などを検索しました。

于 2013-04-12T05:13:59.407 に答える
0

これは、ForsrevealCell()が同じ 0 セルに対して何度も何度も呼び出されるようにするためです。既にアクセスしたセルを追跡し、呼び出す前に確認できますrevealCell()

于 2013-04-12T05:11:25.103 に答える