Booleans + циклы while =? - PullRequest
       13

Booleans + циклы while =?

0 голосов
/ 08 апреля 2011

У меня странная проблема с приведенным ниже кодом (я удалил несущественные части, и все указанные классы / функции работают должным образом):

int curNumRooms = 0;

while(curNumRooms < numberOfRooms) {
    int w = Random.Range(minimumRoomSize, maximumRoomSize+1);
    int h = Random.Range(minimumRoomSize, maximumRoomSize+1);

    int x = Random.Range(0, (int)levelSize.x - w - 1);
    int y = Random.Range(0, (int)levelSize.y - h - 1);          

    Rectangle newRoom = new Rectangle(x,y,w,h);

    bool failed = false;

    foreach (Rectangle otherRoom in rooms) {
        if(otherRoom != null) {                 
            if (newRoom.Intersect(otherRoom)) {
                failed = true;
                break;
            }
        }
    }

    if (!failed) {          
        rooms[curNumRooms] = newRoom;
        curNumRooms++;
    }

}

По какой-то причинеОшибка не всегда оценивается как истина.Я добавил пару отладочных сообщений, и, как ни странно, неудачные вычисления дважды - в первый раз, в цикле foreach, он оценивает правильно.Второй раз он оценивается как ложный.Если я инициализирую fail как true, то во второй раз он оценивается как true, почти как если бы цикл while запускался дважды, а второй цикл игнорировался в цикле foreach.

Почему это так?


РЕДАКТИРОВАТЬ 1: Вот мой класс Rectangle и соответствующие переменные:

public class Rectangle {
        public int x1;
        public int y1;
        public int x2;
        public int y2;

        public bool Intersect(Rectangle other) {
            return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 <= other.y1);      
        }

        public Rectangle(int x, int y, int w, int h) {
            this.x1 = x;
            this.x2 = x+w;
            this.y1 = y;
            this.y2 = y + h;
        }

        public Rectangle() {

        }

        public Vector2 Center() {
            int centerX = (x1 + x2) / 2;
            int centerY = (y1 + y2) / 2;

            Vector2 center = new Vector2(centerX, centerY);

            return center;
        }
    }

Вот переменные, которые я использовал:

public Vector2 levelSize = new Vector2(80,30);
public int maximumRoomSize = 10;
public int minimumRoomSize = 5;

Ответы [ 6 ]

3 голосов
/ 08 апреля 2011

Ты математика не права.Это:

public bool Intersect(Rectangle other) {
    return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 <= other.y1);
}

Должно быть изменено на (Примечание: я изменяю <= на >= в последней части инструкции):

public bool Intersect(Rectangle other) {
    return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 >= other.y1);
}
2 голосов
/ 08 апреля 2011

Я не уверен, но вы используете Rectangle.Intersect может быть неправильно. Пересечение возвращает прямоугольник, представляющий пересечение двух указанных прямоугольников, или «пустой» прямоугольник, если пересечения нет. Вместо этого вы можете попробовать IntersectsWith - это возвращает логическое значение.

0 голосов
/ 08 апреля 2011

Не понимая метода Intersect, я бы сказал, что это должно быть причиной вашей проблемы. Вы говорите, что первая итерация цикла while (угадайте с моей стороны - ваш вопрос расплывчат в деталях) дает правильную оценку сбоя (я предполагаю, что это в строке if (!failed)). Метод Intersect здесь не вызывается, потому что в массиве комнат нет комнат, поэтому вы получаете с ошибкой ложь из-за инициализации переменной с ошибкой. Затем во второй раз в цикле while в массиве комнат есть место, метод Intersect неправильно оценивает ваши цели и всегда говорит, что есть пересечение. Теперь я вижу, что @FreeAsInBeer обнаружил ошибку в методе Intersect.

0 голосов
/ 08 апреля 2011

Меня смущают оценки дважды?Конечно, после перерыва он выходит из цикла for.Возможно, попробуйте очистить свое решение, удалить скрытый каталог obj и затем пересобрать?

0 голосов
/ 08 апреля 2011

В каждой итерации цикла while неудачно инициализируется REAL

0 голосов
/ 08 апреля 2011

Похоже, что в вашей логике цикла нет ничего плохого в том, чтобы неправильно установить failed. Если вы уверены, что метод не должен завершиться сбоем во втором цикле, проверьте вспомогательные методы, в частности Rectangle.Intersect. Добавление дополнительных результатов трассировки также будет полезно для отладки.

...