游戏生活:找邻居

游戏生活:找邻居

问题描述:

我正在做一个生活的游戏,我做了这个方法来查找附近的邻居游戏生活:找邻居

private int getNeighbours(LifeBoard board, int row, int col){ 
    if(board.get(row+1, col)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col)){ 
     neighbours++; 
    } 
    if(board.get(row, col+1)){ 
     neighbours++; 
    } 
    if(board.get(row, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row+1, col+1)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row+1, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col+1)){ 
     neighbours++; 
    } 

    return neighbours; 
} 

我觉得,如果它是可怕的编码和它畏缩,所以我的问题是..有没有办法让这个更好?现在,它“排序”的作品,但我想我是否可以用循环来代替。

谢谢。

+3

更好适合codereview.stackexchange.com – 2014-11-24 16:15:55

+0

@Jon Skeet有正确的答案。但是,如果你开始有一个大的领域,你原来的方式将更快地执行,因为你基本上展开了循环,循环展开总是比循环更快。 – markbernard 2014-11-24 16:44:23

那么,你可以使用循环,只是明确排除的位置本身(即当x和y偏移均为0):

private int getNeighbours(LifeBoard board, int row, int col) { 
    int neighbours = 0; 
    for (int xOffset = -1; xOffset < 2; xOffset++) { 
     for (int yOffset = -1; yOffset < 2; yOffset++) { 
      if ((xOffset != 0 || yOffset != 0) 
        && board.get(row + yOffset, col + xOffset)) { 
       neighbours++; 
      } 
     } 
    } 
    return neighbours; 
} 

这里假设你的board.get(...)方法是好的,其值关闭的边缘董事会。

为偏移替代策略:

  • 如上,for (int xOffset = -1; xOffset < 2; xOffset++)
  • 使用一个包容上限:for (int xOffset = -1; xOffset <= 1; xOffset++)
  • 使用阵列别处定义:

    private static final int[] OFFSETS = { -1, 0, 1 }; 
    ... 
    for (int xOffset : OFFSETS) 
    
+1

我会用'OFFSETS = new int [] {-1,0,1}'和'for(int xOffset:OFFSETS){...}' – njzk2 2014-11-24 16:19:52

+0

@ njzk2:这样做也可以。 – 2014-11-24 16:21:08

+0

@ njzk2:我已将该选项编辑为答案 – 2014-11-24 16:28:31