在我的 2D 平铺游戏中,当我在另一个 for 循环中更新 2D 数组中的所有对象时,我遇到了一个问题(在 2D 数组中从左上角到右下,逐行循环(如下面的代码((, 如果程序在索引 (5,6( 处循环并且它需要来自自身下对象的数据, 它将使用他在循环为 (5,5( 时执行的新数据,但我想使用双精度 for 循环开始之前的所有数据......
一个基本的例子:
int[][] map = new int[10][10];
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 10; y++)
{
update(x, y, map);
}
}
// I remember you that it is an example
void update(int x, int y, int[][] m)
{
m[x][y] = 0
if(y > 9) { return; }
m[x][y + 1] = 1
}
它会立即将数据"1"放在 (x, 10( 处,而不考虑它会产生错误......(ArrayOutOfBoundsException...(
当他还没有启动双循环时,我如何让它使用数组的数据?
我知道它生成了 ArrayOutOfBoundExecption,如果我能像我在这里所做的那样纠正它,就会有一个
int Water = 1;
int Air = 0;
int[][] map = new int[20][20];
void update()
{
for(int x = 0; x < 10; x++)
{
for(int y = 0; y < 10; y++)
{
tick(x, y, map);
}
}
}
void tick(int x, int y, int[][] m)
{
if(y > m.lenght - 1) { return; }
m[x][y] = Air;
m[x][y + 1] = Water;
}
您是说您正在逐行迭代地图,而实际上您是按列迭代地图。首先尝试循环y
,然后循环x
。
您的更新方法也是错误的。 y+1
y = 9
何时尝试访问map[x][10]
,这将引发ArrayOutOfBoundsException
。请记住,声明为 new int[10]
的数组有 10 个项目,从 0 开始,到位置 9 结束。
int Water = 1;
int Air = 0;
int[][] map = new int[20][20];
void update()
{
for(int x = 0; x < 10; x++)
{
for(int y = 9; y >= 0; y--)
{
tick(x, y, map);
}
}
}
void tick(int x, int y, int[][] m)
{
if (y < m[0].length - 1)
m[x][y+1] = m[x][y];
}
当然,你需要先做一些细胞水,但这应该放在构造函数中。