0

我目前正在开始了解 Java。因此,虽然我一直在尝试开发一些扫雷应用程序,但我注意到,当尝试将坐标添加到“Mines[]”数组时,调试窗口打开,我的应用程序不会继续显示指定的 Minefield。

这就是我的代码:

package com.ochs.minesweeper;

public class MineField {

public Mine[] mines;

public MineField(int xMines, int yMines) {
    mines = new Mine[xMines*yMines];
    int xCounter = 0;
    int yCounter = 0;
    for(int i = 0; i < yMines; i++) {
        for(int j = 0; j < xMines; j++) {
            mines[i*j].setX(xCounter);
            mines[i*j].setY(yCounter);
            xCounter += 100;
        }yCounter += 100;
    }
}   
}

即使我只是尝试类似:

for(int i = 0; i < xMines*yMines; i++) {
    mines[i].setX(2);
} 

或类似的东西似乎我无法使用数组中for循环的变量来处理......

有谁知道我做错了什么?我只希望我的 MineField 拥有它的 Mine[] 数组。这些地雷都是在 for 循环中创建的,具有不同的坐标,因此它们可以显示在我的表面视图的网格中。有人有想法吗?或者在我的示例中如何创建一个简单的对象网格的另一种解决方案?

提前致谢!

4

2 回答 2

1

在这段代码中设置坐标的位置存在问题:

mines[i*j].setX(xCounter);
mines[i*j].setY(yCounter);

例如,坐标 (x=2, y=3) 和 (x=3, y=2) 指的是网格上的不同位置,但是 2*3=6 和 3*2=6。您需要稍微复杂一点的逻辑来获得每个坐标的唯一索引(semihyagcioglu 的方法要好得多):

public MineField(int xMines, int yMines) {
mines = new Mine[xMines*yMines];
int xCounter = 0;
int yCounter = 0;
for(int i = 0; i < yMines; i++) {
    for(int j = 0; j < xMines; j++) {
        mines[i+(j*yMines)].setX(xCounter);
        mines[i+(j*yMines)].setY(yCounter);
        xCounter += 100;
    }yCounter += 100;
}
}  

应用程序崩溃的原因是您需要Mine[]在尝试调用它们之前实例化数组setX()中的每个矿井对象setY()

for (int i=0; i< (xMines*yMines); i++)
  Mine[i] = new Mine();
于 2013-04-27T21:01:00.713 回答
1

为什么不使用二维数组?您可以定义Mine[][] mines然后在循环中:

 for(int i = 0; i < yMines; i++) {
        for(int j = 0; j < xMines; j++) {
            mines[i][j].setX(xCounter);
            mines[i][j].setY(yCounter);
            xCounter += 100;
        }yCounter += 100;
    }
于 2013-04-27T20:40:34.517 回答