1

这是我第一次在这里问,所以请耐心等待:) 基本上我的代码有问题,我不知道它是什么。这是我正在开发的游戏的城市生成器。它创建了一个 20 x 20 位图,地面为棕色,河流为蓝色。现在我需要它生成一个粉红色的 3x3 块,然后它应该检查是否有任何重叠,如果是,则生成一个新的随机位置,然后继续检查是否有蓝色。我的问题是它会生成河流和 3x3 粉色块,无论它是否与蓝色部分重叠。

根据代码,这应该是不可能的。在河流之后调用生成城市街区的函数是:

private void CreateCityBlock(string name, Color col) {

        //This variable stops the loop
        bool canGenerate = false;

        //Create a loop that checks if it can generate the 3x3 block
        while (!canGenerate)
        {
            //Create a random and generate two positions for "x" and "y"
            Random rnd = new Random();
            int x = rnd.Next(1, 19);
            int y = rnd.Next(1, 19);



            //Check if it overlaps with the river
            if (!city.GetPixel(x, y).Equals(Color.Blue)||
                !city.GetPixel(x - 1, y + 1).Equals(Color.Blue) ||
                !city.GetPixel(x, y + 1).Equals(Color.Blue) ||
                !city.GetPixel(x + 1, y + 1).Equals(Color.Blue) ||
                !city.GetPixel(x - 1, y).Equals(Color.Blue) ||
                !city.GetPixel(x + 1, y).Equals(Color.Blue) ||
                !city.GetPixel(x - 1, y - 1).Equals(Color.Blue) ||
                !city.GetPixel(x, y - 1).Equals(Color.Blue) ||
                !city.GetPixel(x + 1, y - 1).Equals(Color.Blue))
            {
                //set the color to pink
                city.SetPixel(x - 1, y + 1, col);
                city.SetPixel(x, y + 1, col);
                city.SetPixel(x + 1, y + 1, col);
                city.SetPixel(x - 1, y, col);
                city.SetPixel(x, y, col);
                city.SetPixel(x + 1, y, col);
                city.SetPixel(x - 1, y - 1, col);
                city.SetPixel(x, y - 1, col);
                city.SetPixel(x + 1, y - 1, col);
                canGenerate = true;

            }





        }
    }
4

1 回答 1

1

问题在于 || 如果第一个表达式是 ,则(条件或)运算符不计算任何表达式True

因此,如果第一个像素不是蓝色的,则不会评估其余像素,因为 !False 等于 True。

在这种情况下,我会编写一个单独的“检查”方法来评估所有像素并相应地返回结果,例如:

// Returns true if the area overlaps a river pixel, false otherwise
private bool Overlaps(Bitmap city, int x, int y)
{
    for (int cx = x - 1; cx < x + 2; cx++)
    {
        for (int cy = y - 1; cy < y + 2; cy++)
        {
            if (city.GetPixel(cx, cy).Equals(Color.Blue))
                return true;
        }
    }

    return false;
}
于 2013-05-27T14:09:26.553 回答