编程逻辑:如何检查网格中的邻居?

Dev*_*ted 2 java grid

在尝试以类逻辑方式检查基于"网格"的编程项目中的邻居时,我遇到了很多麻烦.

我遇到的主要问题是想办法有效地检查它是否在侧面以便我没有得到索引越界错误.

编辑:我忘了提到我正在使用二维数组.

Jon*_*eet 6

这是一个简单的方法来获得邻居位置,避免担心双方:

int leftX = (x - 1 + width) % width;
int rightX = (x + 1) % width;
int aboveY = (y - 1 + height) % height;
int belowY = (y + 1) % height;
Run Code Online (Sandbox Code Playgroud)

它可能不是最有效的方法,但它将每个计算保持为一个简单的表达式.当然,这是假设你想要环绕式的.如果不这样做,你就必须有条件做的事情:

if (x > 0)
{
    // Use x - 1
}
if (x < width - 1)
{
    // Use x + 1
}
Run Code Online (Sandbox Code Playgroud)


Rin*_*g Ø 5

基本上,您希望访问单元格的邻居,同时确保您不会脱离网格。您可以尝试一个简单的算法:

假设中心单元格(所在的位置)是(x,y),并且您还想检查对角线。
你的网格是 X 上的 [0,W[,Y 上的 [0,H[(基本上W x H,从 (0,0) 开始))

  for (i=-1 ; i<2 ; i++)    
    for (j=-1 ; j<2 ; j++)
      if (i !=0 && j != 0)
  {
     rx = x + i;
     ry = y + j;

     if (rx >= 0 && ry >= 0 && rx < W && ry < H)
     {
       // I'm in
     }
     else
     {
       // I'm out
     }

  }
Run Code Online (Sandbox Code Playgroud)

这可以在 (i,j) 上进行优化,例如,i如果 为 0,则从 0 开始x

如果你不需要对角线,你只需检查(x-1,y) (x+1,y) (x,y-1)(x,y+1)

  for (i=-1 ; i<2 ; i+=2)
  {
     // check (x+i, y)
     // check (x, y+i)
  }
Run Code Online (Sandbox Code Playgroud)