指数数组的边界之外。尽管我试图阻止它
Index was outside the bounds of the array. even though i tried to stop it
while (worldY != WorldHeight) { //3rd pass (Filling in rough terrain)
while (worldX != WorldWidth) {
if (worldY > 0) {
if (world[worldX, worldY-1] == 1) { world[worldX, worldY] = 1; }
if (worldX > 0) {
if (world[worldX-1, worldY-1] == 1) { world[worldX, worldY] = 1; }
}
if (worldX < WorldWidth) {
if (world[worldX+1, worldY-1] == 1) { world[worldX, worldY] = 1; }
}
}
if (worldX > 0) {
if (world[worldX-1, worldY] == 1) { world[worldX, worldY] = 1; }
}
if (worldX < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
worldX++;
}
worldX = 0;
worldY++;
}
我已经为此苦恼了一段时间,问过我的朋友和互联网,但为什么每次它到达这里时它都会忽略我最初的 if 语句并直接针对那些我不希望它出现的语句be at yet 一直给我一个 System.IndexOutOfRangeException
: Index was outside the bounds of the array.
即使我放置的代码看起来应该可以防止这种情况发生。
有什么建议吗?或替代代码?
如果认为问题出在逻辑上是这样的:
if (worldX < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
此处您检查 worldX
是否小于 WorldWidth
,然后使用 worldX + 1
。但这并不安全。考虑 WorldWidth
为 6 且 worldX
为 5 的情况。然后您的检查顺利进行,但是 worldX + 1
然后是 6 并导致 IndexOutOfBoundsException
.
正确的处理方式是:
if ((worldX + 1) < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
同样的问题在您的代码中出现了两次,所以一旦您解决了这些问题,它应该会按预期工作。
还有一个建议,我建议使用 while (index < length)
而不是 while (index != length)
。尽管在这种情况下两者都有效,但如果您后来出于某种原因决定将索引递增 2,并且索引恰好跳过了长度的确切值,您可能会陷入无限循环。
while (worldY != WorldHeight) { //3rd pass (Filling in rough terrain)
while (worldX != WorldWidth) {
if (worldY > 0) {
if (world[worldX, worldY-1] == 1) { world[worldX, worldY] = 1; }
if (worldX > 0) {
if (world[worldX-1, worldY-1] == 1) { world[worldX, worldY] = 1; }
}
if (worldX < WorldWidth) {
if (world[worldX+1, worldY-1] == 1) { world[worldX, worldY] = 1; }
}
}
if (worldX > 0) {
if (world[worldX-1, worldY] == 1) { world[worldX, worldY] = 1; }
}
if (worldX < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
worldX++;
}
worldX = 0;
worldY++;
}
我已经为此苦恼了一段时间,问过我的朋友和互联网,但为什么每次它到达这里时它都会忽略我最初的 if 语句并直接针对那些我不希望它出现的语句be at yet 一直给我一个 System.IndexOutOfRangeException
: Index was outside the bounds of the array.
即使我放置的代码看起来应该可以防止这种情况发生。
有什么建议吗?或替代代码?
如果认为问题出在逻辑上是这样的:
if (worldX < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
此处您检查 worldX
是否小于 WorldWidth
,然后使用 worldX + 1
。但这并不安全。考虑 WorldWidth
为 6 且 worldX
为 5 的情况。然后您的检查顺利进行,但是 worldX + 1
然后是 6 并导致 IndexOutOfBoundsException
.
正确的处理方式是:
if ((worldX + 1) < WorldWidth) {
if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}
同样的问题在您的代码中出现了两次,所以一旦您解决了这些问题,它应该会按预期工作。
还有一个建议,我建议使用 while (index < length)
而不是 while (index != length)
。尽管在这种情况下两者都有效,但如果您后来出于某种原因决定将索引递增 2,并且索引恰好跳过了长度的确切值,您可能会陷入无限循环。