布尔+ while循环=?

时间:2011-04-08 01:23:41

标签: c# boolean while-loop

我在下面的代码中遇到了一个奇怪的问题(我已经删除了那些无关紧要的部分,并且所引用的任何类/函数都按预期工作):

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循环中,它正确评估。第二次,它评估为假。如果我初始化失败为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 个答案:

答案 0 :(得分:3)

你的数学错了。这样:

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);
}

答案 1 :(得分:2)

我不是肯定的,但你使用Rectangle.Intersect可能不对。 Intersect返回一个矩形,表示两个指定矩形的交集,如果没有交叉,则返回“空”矩形。你可以试试IntersectsWith - 这会返回一个布尔值。

答案 2 :(得分:0)

您的循环逻辑似乎没有任何错误,可能会错误地设置failed。如果您确信该方法不应该在第二个循环中失败,请检查您的帮助方法,尤其是Rectangle.Intersect。添加更多跟踪输出对于调试也很有用。

答案 3 :(得分:0)

在while循环的每次迭代中,失败被重新初始化为false

答案 4 :(得分:0)

我对评估两次感到困惑?当然在休息之后它会退出for循环。也许尝试清理你的解决方案,删除隐藏的obj目录,然后重建?

答案 5 :(得分:0)

如果不了解Intersect方法,我会说它必须是造成问题的原因。你说while循环的第一次迭代(猜测我的部分 - 你的问题部分含糊不清)给出了对失败的正确评价(我猜这是在if (!failed)行)。这里不调用Intersect方法,因为rooms数组中没有空间,因此失败变量的初始化失败是错误的。然后第二次通过while循环在房间数组中有一个房间,Intersect方法根据您的目的不正确地评估,并且总是说有一个交叉点。我现在可以看到@FreeAsInBeer在Intersect方法中看到了一个错误。