扫雷计数地雷不起作用

时间:2017-11-02 02:45:34

标签: java minesweeper

所以,如果选择的地点没有地雷,我就计算附近地雷的数量,这就是我想出的:

public static int numNearbyMines( boolean [][]mines, int row, int col) {    

    int nearbyMines = 0;

    if (mines[row - 1][col] == true) {  nearbyMines += 1; }
    if (mines[row - 1][col - 1] == true) {  nearbyMines += 1; }
    if (mines[row -  1][col + 1] == true) {  nearbyMines += 1; }
    if (mines[row][col + 1] == true) {  nearbyMines += 1; }
    if (mines[row][col - 1] == true) {  nearbyMines += 1; }
    if (mines[row + 1][col] == true) {  nearbyMines += 1; }
    if (mines[row + 1][col - 1] == true) {  nearbyMines += 1; }
    if (mines[row + 1][col + 1] == true) {  nearbyMines += 1; }
    return nearbyMines;
}

然而,我意识到这种方法不起作用,因为如果我选择了一个角落之类的地方,它将在数组之外“读取”,因此无法正常工作。我如何改变这一点,即使我选择了一个角落,它也只会在数组内部读取?

2 个答案:

答案 0 :(得分:2)

我对此类问题的解决方案是创建一个安全读取数组的函数。 例如:

boolean readMines(int x, int y) {
    if(x >= 0 && x < mines.length && y >= 0 && y < mines[0].length) {
        return mines[x][y];
    }
    return false;
}

这将检查以确保在阅读之前阅读您提供的索引是安全的,并假设在无法读取的地方没有地雷。它应该适合您的需要。

答案 1 :(得分:0)

如果地址(如[row-1] [col])是有效的(在边界内),您可以添加一个检查。此检查最好通过以下方法完成:

boolean isValid(int x, int y) {
    if(x >= 0 && x < mines.length && y >= 0 && y < mines[0].length) {
        return true;
    }
    return false;
}