Java Minesweeper - 计算错误地方的非方形板

时间:2018-04-26 20:31:59

标签: java arrays

我正在用Java编写扫雷程序。如果我使用方形(nxn)板,它可以很好地工作,但如果我使用非方形板,比如10x15,我的计数器功能会产生一些奇怪的结果。见下图:

Minesweeper board

看起来计数对应于计数为0的地雷附近的方格。所以计数似乎是在翻译,我只是无法弄清楚为什么这可能正好发生。但显然有非方形板的链接,因为正如我所说,它适用于方板。这是相关的代码。 buttons只是2D按钮数组。 WIDTHHEIGHT是按钮数量方面的电路板宽度和高度。 isMine只是一个布尔,不言自明。有什么想法吗?

for (int x = 0; x < buttons[0].length; x++) {
  for (int y = 0; y < buttons.length; y++) {
     if(!buttons[y][x].isMine) {
        countSurrounding(y, x);
     }
  }
}

// returns 1 if there's a mine at y,x or 0 if there isn't
int mineAt(int y, int x) {
   if(y >= 0 && y < HEIGHT && x >= 0 && x < WIDTH && buttons[y][x].isMine) { //check for bounds
      return 1;
   } 
   else {
      return 0;
   }
}

void countSurrounding(int y, int x) {
    int mines = 0;
    mines += mineAt(y - 1, x - 1);  // NW
    mines += mineAt(y - 1, x);      // N
    mines += mineAt(y - 1, x + 1);  // NE
    mines += mineAt(y, x - 1);      // W
    mines += mineAt(y, x + 1);      // E
    mines += mineAt(y + 1, x - 1);  // SW
    mines += mineAt(y + 1, x);      // S
    mines += mineAt(y + 1, x + 1);  // SE
    buttons[y][x].neighbourCount = mines;
}

1 个答案:

答案 0 :(得分:0)

我发现您分享的代码没有任何问题。我在acii艺术中重新创建它:)它完美无缺。所以问题必须在你不怀疑的代码中:)

public class Main {


private int HEIGHT = 15;
private int WIDTH = 10;

private boolean[][] buttons = new boolean [HEIGHT][WIDTH];

public static void main(String[] args) {
    Main m = new Main();
    m.init();
    m.printMines();

}

void init(){
    for (int x = 0; x < buttons[0].length; x++) {
        for (int y = 0; y < buttons.length; y++) {
           buttons[y][x] = false;
        }
    }
    buttons[11][1] =  true;
    buttons[12][3] =  true;
    buttons[7][3] =  true;
    buttons[12][6] =  true;
    buttons[2][4] =  true;

}

void printMines(){
    for (int x = 0; x < buttons[0].length; x++) {
        for (int y = 0; y < buttons.length; y++) {
            if(!buttons[y][x]) {
                System.out.print(countSurrounding(y, x));
            }else {
                System.out.print('X');
            }

        }
        System.out.print('\n');
    }

}




// returns 1 if there's a mine at y,x or 0 if there isn't
int mineAt(int y, int x) {
    if(y >= 0 && y < HEIGHT && x >= 0 && x < WIDTH && buttons[y][x]) { //check for bounds
        return 1;
    }
    else {
        return 0;
    }
}

int countSurrounding(int y, int x) {
    int mines = 0;
    mines += mineAt(y - 1, x - 1);  // NW
    mines += mineAt(y - 1, x);      // N
    mines += mineAt(y - 1, x + 1);  // NE
    mines += mineAt(y, x - 1);      // W
    mines += mineAt(y, x + 1);      // E
    mines += mineAt(y + 1, x - 1);  // SW
    mines += mineAt(y + 1, x);      // S
    mines += mineAt(y + 1, x + 1);  // SE
    return mines;
}

}