2013-04-27 56 views
0

我目前开始支持Java。所以当我一直在尝试开发一些扫雷应用程序时,我注意到当试图向“Mines []”数组添加坐标时,打开调试窗口,我的应用程序不会继续显示目标雷区。Android游戏 - 试图创建一个数组失败?

所以这是我的代码:

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

'打开调试窗口' - ? – Simon 2013-04-27 20:48:04

回答

1

为什么不使用2维数组?您可以定义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

有一个与你在哪里在该位的代码设置坐标的问题:

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();