Индекс находился вне границ массива.хотя я пытался остановить это - PullRequest
0 голосов
/ 21 октября 2018
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: индекс был за пределами массива.даже при том, что я помещаю код, который выглядит так, как будто это должно предотвратить это.

есть предложения?или альтернативный код?

1 Ответ

0 голосов
/ 21 октября 2018

Если вы думаете, что проблема в строках с такой логикой:

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).Несмотря на то, что оба работают в этом случае, если позже вы по какой-то причине решили увеличить индекс на два, вы можете попасть в бесконечный цикл, если индекс просто пропустил точное значение длины.

...