由于环绕,我无法让我的生命游戏计划发挥作用

时间:2013-09-27 00:31:19

标签: java multidimensional-array conways-game-of-life

我有一些方法可以运行康威的生命游戏,但在我的邻居计数方法中,我不知道如何解释。我会把执行此操作的方法。 我再一次只需要帮助我的neighborCount方法。我已经测试了其他方法,它们似乎工作正常,但是当我测试问题方法时,它会返回真正的虚假值。

public class GameOfLife {

private boolean[][] society;
private boolean cell = true;
private boolean empty = false;

public GameOfLife(int rows, int cols) {
    // Complete this method.
    society = new boolean[rows][cols];
    for (int r = 0; r < society.length; r++) {
        for (int c = 0; c < society[0].length; c++) {
            society[r][c] = empty;
        }
    }
}
public void growCellAt(int row, int col) {
    // Complete this method
    society[row][col] = cell;
}
public int neighborCount(int row, int col) {
    int count = 0;
    for (int r = 0; r < society.length; r++) {
        for (int c = 0; c < society[0].length; c++) {
            // up and left
            if (society[(r - 1 + row) % row][(c - 1 + col) % col] == cell) {
                count++;
            }
            // up
            if (society[(r - 1 + row) % row][c] == cell) {
                count++;
            }
            // up and right
            if (society[(r - 1 + row) % row][(c + 1 + col) % col] == cell) {
                count++;
            }
            // right
            if (society[r][(c + 1 + col) % col] == cell) {
                count++;
            }
            // down and right
            if (society[(r + 1 + row) % row][(c + 1 + col) % col] == cell) {
                count++;
            }
            // down
            if (society[(r + 1 + row) % row][c]){
                count++;
            }
            // down and left
            if (society[(r + 1 + row) % row][(c - 1 + col) % col] == cell) {
                count++;
            }
            // left
            if (society[r][(c - 1 + col) % col] == cell) {
                count++;
            }
        }
    }
    return count;
}

}

2 个答案:

答案 0 :(得分:2)

您的模数看起来使用了错误的值。虽然,很难分辨,因为该函数内部的逻辑有点奇怪。

如果rowcol是您要测试的单元格的索引(因为它们似乎在其他地方),那么它肯定是错误的。您需要按实际行长度和列长度进行修改。

society[(r - 1 + row) % society.length][(c - 1 + col) % society[0].length]

请注意,负数的模数通常不是一个好主意。我不知道这是否适用于java,但正常的方法是避免它们。绕过那个:

(r + society.length - 1 + row) % society.length
(c + society[0].length - 1 + col) % society[0].length

答案 1 :(得分:0)

您可以尝试使用更简单的内容,例如:

public Cell[] getNeighbours(int i, int j) {
int i2 = i - 1, i3 = i + 1, j2 = j - 1, j3 = j + 1;
if (i2 == -1) i2 = board.length - 1;
if (i3 == (board.length)) i3 = 0;
if (j2 == -1) j2 = board[i].length - 1;
if (j3 == (board[i].length)) j3 = 0;
return new Cell[]{board[i2][j2], board[i2][j], board[i2][j3], board[i][j2], board[i][j3], board[i3][j2], board[i3][j], board[i3][j3]};

}