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语句,而直接针对那些我不希望出现的语句但只是一直给我一个System.IndexOutOfRangeException
:索引超出了数组的范围。
即使我放了看起来应该可以防止的代码。
有什么建议吗?或替代代码?
答案 0 :(得分:2)
如果认为问题出在以下逻辑方面:
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,则如果索引恰巧跳过了length的确切值,您可能会陷入无限循环。