我正在用Java创建一个基于文本的扫雷游戏。如果用户为游戏板创建一个完美的正方形,游戏可以正常工作,但是如果他们输入两个不同的值,我会在将地雷添加到二维数组中时出现异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19
at Grid.addMines(Grid.java:77)
添加地雷(第77行是if语句):
public void addMines()
{
Random generator = new Random();
int count = 0;
while (count < numMines)
{
int x = generator.nextInt(rows);
int y = generator.nextInt(columns);
if (grid[x][y].minePresent == false)
{
grid[x][y].setCurrent("*");
grid[x][y].minePresent = true;
count++;
}
else
continue;
}
}
答案 0 :(得分:6)
这看起来很可疑:
int x = generator.nextInt(rows);
int y = generator.nextInt(columns);
鉴于x
值通常指定列,我怀疑你想要:
int x = generator.nextInt(columns);
int y = generator.nextInt(rows);
或者更清楚:
int column = generator.nextInt(columns);
int row = generator.nextInt(rows);
然后始终使用:
Foo[][] grid = new Foo[rows][columns];
...
grid[row][column] = ...;
或:
Foo[][] grid = new Foo[columns][rows];
...
grid[column][row] = ...;
其中任何一个都没问题,但你的订单错误,因为你从“列/行”模型变为“x / y”模型不一致。
值得退一步,研究如何在将来诊断类似问题。如果某些东西在两个值相同(本例中为行和列)时有效,并且在它们不同时失败,则通常表示您正在使用其中一个值而不是另一个值。因此,请从错误点仔细跟踪您的代码,找出使用这些值的任何位置,并检查它们。
答案 1 :(得分:2)
问题在于访问您的游戏字段:
if (grid[x][y].minePresent == false)
{
grid[x][y].setCurrent("*");
grid[x][y].minePresent = true;
count++;
}
在这里你应该以相反的顺序访问它们:
grid[y][x].setCurrent("*"); // and so on
因为你创建二维数组的方式。
答案 2 :(得分:0)
网格的尺寸是否小于[rows] [columns]?
您可以通过执行以下操作来检查:
System.out.println(grid.length+"/"+rows);
System.out.println(grid[0].length+"/"+columns);
如果任何左边的值小于正确的值,那么你就有了罪魁祸首。如果您不小心提供了较小的数字,请查看网格的初始化。
答案 3 :(得分:-2)
根据文档http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28%29
,上面的Jon也给出了答案所有2 ^ 32个可能的int值以(近似)相等的概率产生。
E.g。否定也将被退回。您必须使用Math.abs并执行int x = Math.abs(generator.nextInt(columns));