0

手続き型生成コードの一部として、グリッド内のセルに隣接するセルがあるかどうかをチェックする関数があります。

グリッドは 2D 配列で、印刷すると次のようになります (# = セルと . = 空で、端の周りの # は境界線です)。

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

また、私のコードのより効率的なバージョンはありますか?

ありがとう

4

1 に答える 1

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;
}
于 2013-07-28T14:10:16.987 に答える