我正在用Java编写扫雷程序。如果我使用方形(nxn)板,它可以很好地工作,但如果我使用非方形板,比如10x15,我的计数器功能会产生一些奇怪的结果。见下图:
看起来计数对应于计数为0的地雷附近的方格。所以计数似乎是在翻译,我只是无法弄清楚为什么这可能正好发生。但显然有非方形板的链接,因为正如我所说,它适用于方板。这是相关的代码。 buttons
只是2D按钮数组。 WIDTH
和HEIGHT
是按钮数量方面的电路板宽度和高度。 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;
}
答案 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;
}
}