如何揭示扫雷中空单元的8个周围单元格

时间:2015-09-29 06:26:23

标签: java arrays minesweeper

我有一个mineSweeper的递归方法,但我想写一个循环,当单元格为空时,应该通过递归显示空单周围的8个单元格,我该怎么做?

这是我的揭示方法:

void reveal(int x,int y,char[][] mineField,boolean[][] isVisible){
    System.out.println(x + "  " + y);
    if(x<0 || x>=mineField.length   ||   y<0 || y>mineField[0].length){

        return;
    }

    if(mineField[x][y] == '*'){ 
        isGameOver = true; // there is a bomb, stop game.
        return;
    }
    if(mineField[x][y] == '1'||mineField[x][y] == '2'){ // how do I make it any number (1-8) instead of 1 or 2
        isVisible[x][y] = true;
        return;
    }

    if(mineField[x][y] == '.'){
        isVisible[x][y] = true;

                reveal(i,j, mineField, isVisible); // how do I write a method here to reveal the 8 surrounding cells?

    }
}

这是我的打印方法:

void printMineMap(char[][] mineField,boolean[][] isVisible){
    for(int i=0; i<mineField.length; i++){
        for(int j=0; j<mineField[0].length; j++){
            if(isVisible[i][j]=true)
                System.out.println(" "+mineField[i][j]+" ");
            else if(isVisible[i][j]=false)
                System.out.println("[ ]");
        }
        System.out.println("  ");
    }
}

1 个答案:

答案 0 :(得分:1)

您可以循环遍历所有字段,在x和y方向上的坐标差异最多为1到当前字段。

for (int i = x-1; i <= x+1; i++) {
    for (int j = y-1; j <= y+1; j++) {
        reveal(i,j, mineField, isVisible);
    }
}

但是,您不希望显示已经可见的字段以避免无限递归。因此,在显示方法的开头添加它,但在检查x和y是否在范围内之后:

if (isVisible[x][y]) {
    return;
}