我目前正在开始使用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循环中创建的,因此它们可以在我的surfaceview上的网格中显示。 有没有人有想法?或者也许是另一种解决方案,我可以在我的示例矿山中创建一个简单的对象网格?
提前致谢!
答案 0 :(得分: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;
}
答案 1 :(得分: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();