生命游戏:寻找邻居

Mic*_*ael 3 java conways-game-of-life

我正在制作一个生活游戏,我用这种方法找到附近的邻居

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;
}
Run Code Online (Sandbox Code Playgroud)

我觉得它好像编码严重并且畏缩,所以我的问题是..有没有办法让这更好?现在,它"有点"可行,但我在想是否可以用循环代替它.

谢谢.

Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)

这假设您的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)
    
    Run Code Online (Sandbox Code Playgroud)