特定细胞测试了解生命游戏的功能

时间:2016-07-08 13:23:18

标签: java arrays

我有生命游戏,我写完整个游戏只留给我编写检查细胞的功能,并决定他是活着还是死。

代码:

public class lifeGame1 {
public static void main(String[]args){
    gameOfLife(4, 5, 0.3);
}

public static void gameOfLife(int n, int m, double p){
    int[][] matrix = new int[n][n];

    // Random each matrix[i][j]
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(Math.random() < p)
                matrix[i][j] = 1;
            else
                matrix[i][j] = 0;
        } // for j
    } // for i

    System.out.println("The board is: ");
    printMatrix(matrix);

    int steps = 0;
    while(steps < m){
        int[][] newMatrix = new int[n][n];
        for(int i = 0; i < newMatrix.length; i++){
            for(int j = 0; j < newMatrix[i].length; j++){
                newMatrix[i][j] = checkTheNewValueOfCell(matrix, i, j);
            }
        }

        matrix = newMatrix;
        System.out.println("The new board: ");
        printMatrix(matrix);

        steps++;
    } // while

}

public static void printMatrix(int[][] matrix){
    // Random each matrix[i][j]
    for(int i = 0; i < matrix.length; i++){ // for each row
        for(int j = 0; j < matrix[i].length; j++){ // print one row
            System.out.print(matrix[i][j] + " ");
        } // for j
        System.out.println();
    } // for i
}
}

细胞可以根据以下规则使死者或生命: 1.活细胞可能因以下原因而死亡:

一个。如果它的密度超过三个活着的邻居。

B中。孤独,如果它有少于两个活的邻居。 因此,当且仅当它有两个或三个活着的邻居时,细胞生命仍然是我的生命。

如果它只有三个活着的邻居,那么2个死细胞可能会转动脸颊。

  1. 虽然音量室有五个邻居)如果Angular三(但也是为了工作规则相同。
  2. 检查单元格的代码:

     private static int checkTheNewValueOfCell(int[][] matrix, int i, int j) {
        // check how much active neighbors
        int countActiveNeighbors = 0;
        for(int k = i-1; k <= i+1; k++){
            for(int m = j-1; m <= j+1; m++){
                if(k >= 0 && k < matrix.length && m >= 0 && m < matrix[0].length){ // אם בתחום
                    if(k != i || m != j)
                        if(matrix[k][m] == 1)
                            countActiveNeighbors++;
                } // if
            } // for m
        } // for k
    
        if(matrix[i][j] == 1){ // pail
            if(countActiveNeighbors == 2 || countActiveNeighbors == 3)
                return 1;
            else
                return 0;
        }else{ // savil
            if(countActiveNeighbors == 3)
                return 1;
            else
                return 0;
        }
        }
    

    我得到了一位讲述其功能并确实工作的讲师的帮助,但直到最后我才意识到这一点,对我来说理解它真的很重要。 我不明白从i-1到i + 1的循环四和从j-1到j + 1的循环四。 如果我在第一个单元格中,那么我应该得到一个错误,即i-1等于-1并且它超出了数组的范围不是吗?

    可以帮助编写一个简单的函数,以便我们更好地理解它吗?

    感谢&#39; S

2 个答案:

答案 0 :(得分:0)

只有在尝试访问无效的数组索引时才会得到ArrayIndexOutOfBoundsException。但是在嵌套的for循环中,您有以下if语句:

if(k >= 0 && k < matrix.length && m >= 0 && m < matrix[0].length){ // אם בתחום
            if(k != i || m != j)
                if(matrix[k][m] == 1)
                    countActiveNeighbors++;
        } // if
如果测试k和m在矩阵内(它们都是正的并且小于矩阵的长度/宽度),那么顶部是p。然后底部实际访问索引k,m处的数组。由于您在访问之前检查了有效索引,因此您不会获得异常

答案 1 :(得分:0)

我评论了试图让它更清晰的功能。希望它与我的评论配对,可以帮助您理解!

private static int checkTheNewValueOfCell(int[][] matrix, int i, int j) {
    // check how much active neighbors
    int countActiveNeighbors = 0; // Neighbor count starts at 0
    for(int k = i-1; k <= i+1; k++){ // Loop from 1 before the cell to 1 after the cell
        for(int m = j-1; m <= j+1; m++){ // Loop from 1 above the cell to 1 below it
            if(k >= 0 && k < matrix.length && m >= 0 && m < matrix[0].length){ // אם בתחום // This if statement skips out of bounds in case we are on an edge cell
                if(k != i || m != j) // This if statement skips the current cell we are looking at
                    if(matrix[k][m] == 1) 
                        countActiveNeighbors++; // Finally we increment if we find a neighbor cell
            } // if
        } // for m
    } // for k