生命游戏:寻找邻居

3

我正在开发一个生命游戏,并编写了此方法以查找附近的邻居。

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。 - Janis F
@Jon Skeet 的答案是正确的。然而,如果你开始有一个很大的字段,你原来的方式将执行得更快,因为你基本上展开了循环,而循环展开总是比循环快。 - markbernard
1个回答

5

好的,您可以使用循环并明确排除位置本身(即当 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(...)方法能够处理超出棋盘边缘的值。
针对这些偏移量的替代策略:
  • As above, for (int xOffset = -1; xOffset < 2; xOffset++)
  • Use an inclusive upper bound: for (int xOffset = -1; xOffset <= 1; xOffset++)
  • Use an array defined elsewhere:

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

1
我会使用类似 OFFSETS = new int[] {-1, 0, 1}for (int xOffset : OFFSETS) {...} 这样的东西。 - njzk2
@njzk2:是的,那也可以。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接