我有生命游戏,我写完整个游戏只留给我编写检查细胞的功能,并决定他是活着还是死。
代码:
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个死细胞可能会转动脸颊。检查单元格的代码:
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
答案 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