使用简单的位图操作很困难

时间:2013-05-27 13:52:31

标签: c#

这是我第一次在这里问,所以忍受我:) 基本上我的代码有问题,我无法弄清楚它是什么。 它是我正在开发的游戏的城市生成器。它创建了一个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;

            }





        }
    }

1 个答案:

答案 0 :(得分:1)

问题在于||如果第一个表达式为True,则(condition-OR)运算符不会计算任何表达式。

因此,如果第一个像素蓝色,则不评估其余像素,因为!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;
}