C#程序生成 - 检查邻居

时间:2013-07-28 14:03:59

标签: c# multidimensional-array procedural-generation

作为一些程序生成代码的一部分,我有一个函数来检查网格中的单元格是否有任何相邻单元格。

网格是一个2D数组,如果它被打印出来,它看起来像这样(#= cell和。= empty,边缘周围的#是边框):

 0123456789
0##########
1#........#
2#........#
3#........#
4#........#
5#....##..#
6#........#
7#........#
8#........#
9##########

因此,例如,如果检查单元格5,5,我的代码将返回true。

我为检查相邻单元格而编写的代码是有效的,但是没有考虑它正在检查的单元格是否位于“边缘”(例如0,0或0,1或10,10)并且如果确实在边缘检查单元格,则创建出界错误。我不确定如何编写考虑到这一点的代码,任何建议都会受到赞赏。

到目前为止,这是我的代码:

public static bool HasNeighbour(int[,] array, int CellX, int CellY)
{

    if (array[CellX + 1, CellY] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY] == 1)
    {
        return true;
    }

    if (array[CellX, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX, CellY - 1] == 1)
    {
        return true;
    }

    if (array[CellX + 1, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX + 1, CellY - 1] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY + 1] == 1)
    {
        return true;
    }

    if (array[CellX - 1, CellY - 1] == 1)
    {
        return true;
    }
    return false;
}

此外,我的代码是否有更高效的版本?

由于

1 个答案:

答案 0 :(得分:1)

尝试此代码(包括边界检查):

public static bool HasNeighbour(int[,] array, int CellX, int CellY) {
  for (int i = -1; i <= 1; ++i)
    for (int j = -1; j <= 1; ++j)
      if ((i != 0) && (j != 0)) {
        int x = CellX + i;

        if ((x < 0) || (x >= array.GetLength(0)))
          continue;

        int y = CellY + j;

        if ((y < 0) || (y >= array.GetLength(1)))
          continue; 

        if (array[x, y])
          return true;
      }

  return false;
}