作为我正在进行的项目的一部分,我想将含有水的瓷砖划分为“海洋”和“湖泊”。这是通过首先找到 map 边缘的所有水图块,并将它们指定为“海”图块来完成的。所有与海块相邻(没有对角线)的水块也是海块。所有其他水瓷砖都是“湖”瓷砖。

我找到第一个海瓦(在板的边缘)的方法没有缺陷。然而,我寻找其他海块的方法通常会遗漏应该是海的大矩形区域。代码如下:(seed 是一个 bool 数组,其中 true 是陆地,false 是水,seas 是另一个 bool 数组,其中 true 是海瓦而 false 不是)

for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y])
        {
            if (x + 1 < length && seas[x + 1, y])
                seas[x, y] = true;
            else if (x - 1 >= 0 && seas[x - 1, y])
                seas[x, y] = true;
            else if (y + 1 < height && seas[x, y + 1])
                seas[x, y] = true;
            else if (y - 1 >= 0 && seas[x, y - 1])
                seas[x, y] = true;
        }
    }
}

我一生都找不到这段代码中的错字,也许一双新的眼睛会有所帮助?

我的代码的下一步是找到所有不是海瓷砖的水瓷砖,并将它们指定为湖瓷砖。这是通过以下代码段完成的:( seasseed 与上面相同,lakes 是一个 bool 数组,其中 true 是湖瓦片而 false 不是)
for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y] && !seas[x, y])
        {
            lakes[x, y] = true;
        }
    }
}

这是另一个可能的错误来源,但我再一次不知道它是如何被破坏的。

附件是基于生成的三个 bool 数组生成的图像。绿色是陆地板块,蓝色是海洋板块,而浅蓝色(或浅蓝色)是湖板块。如您所见,有大片水域与海瓦相邻,它们也应该是海瓦,但却是湖瓦。
c# - 我用于检查某物是否与某个点相邻的算法存在问题-LMLPHP

先感谢您。

最佳答案

作为一个凌乱的数学解决方案,您可以重复第一个代码块 N 次(其中 N 等于您的长度变量可能 N-1 次,因为您在第一次执行 +-1 检查)。原因是您可能会跳过一些其邻居尚未标记但稍后将被标记的图块。所以你必须稍后再回来检查它的邻居是否被标记。显然有更多的优化方法需要更少的过程。

for (int z=0;z < length; z++){

for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y])
        {
            if (x + 1 < length && seas[x + 1, y])
                seas[x, y] = true;
            else if (x - 1 >= 0 && seas[x - 1, y])
                seas[x, y] = true;
            else if (y + 1 < height && seas[x, y + 1])
                seas[x, y] = true;
            else if (y - 1 >= 0 && seas[x, y - 1])
                seas[x, y] = true;
        }
    }
}
}

关于c# - 我用于检查某物是否与某个点相邻的算法存在问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37123159/

10-11 13:59