请帮助我对Conway的生活游戏的基本java实现

我花了很长时间试图编写一个程序来实现康威的生活游戏 – 链接更多信息。 。 我正在关注一些在线指南,并获得了大部分function。 我写了下面显示的“下一个”和“邻居”方法。 谁能告诉我这些是不是很好的实施,以及它们如何变得更好呢?

练习的目的是不修改或改变任何其他方法,只需编写下一个方法! 🙂

import java.io.*; import java.util.Random; public class Life { private boolean[][] cells; public static void main( String[] args ) { Life generation = new Life( ); for (int i = 0; i != 10; i++) { System.out.println( generation ); generation.next( ); } } // Constructors public void next (){ int SIZE; SIZE=cells.length; boolean[][] tempCells = new boolean [SIZE] [SIZE]; for( int i=0; i<SIZE; i++ ) { for( int j=0; j<SIZE; j++ ) { tempCells[i][j] = cells[i][j]; } } for (int row = 0; row < cells.length ; row++) { for (int col = 0 ; col  3 || neighbours(row, col) < 2 ) { tempCells[row][col] = false; } else if (neighbours(row, col) == 3 ) { tempCells[row][col] = true; } } } cells = tempCells; } public int neighbours (int row, int col) { int acc=0; for ( int i = row -1; i <= row + 1 ; i++) { for (int j = col -1 ; j <= col + 1 ; j++) { try { if (cells[i][j]==true && (i != row || j!=col)) { acc++; } } catch ( ArrayIndexOutOfBoundsException f) {continue;} } } return acc; } // Initialises 6 * 6 grid with Glider pattern. public Life( ) { final int SIZE = 8; // Arguably, this should have been a class (static) array. final int[][] pairs = {{2,4},{3,3},{1,2},{2,2},{3,2}}; cells = new boolean[ SIZE ][ ]; for (int row = 0; row < SIZE; row ++) { cells[ row ] = new boolean[ SIZE ]; } for (int pair = 0; pair < pairs.length; pair ++) { final int row = pairs[ pair ][ 0 ]; final int col = pairs[ pair ][ 1 ]; cells[ row ][ col ] = true; } } // Initialise size * size grid with random cells. //public Life( int size ) { //final Random rand = new Random( ); //cells = new boolean[ size ][ ]; //for (int row = 0; row < size; row ++) { //cells[ row ] = new boolean[ size ]; //for (int col = 0; col < size; col ++) { //cells[ row ][ col ] = (rand.nextInt( 2 ) == 0); //} //} //} // Public methods and helper methods. @Override public String toString( ) { String result = ""; for (int row = 0; row < cells.length; row ++) { final boolean[] column = cells[ row ]; for (int col = 0; col < column.length; col ++) { result = result + (column[ col ] ? "x" : "."); } result = result + "\n"; } return result; } } 

您不需要将cells的内容复制到tempCells (下一个第一个嵌套循环)。 相反,您可以在下一个循环中向ifelse添加一个额外的子句。 此外,存储来自neighbours的结果对于速度和清晰度来说都是一个好主意。

 for (int row = 0; row < cells.length ; row++) for (int col = 0 ; col < cells[row].length ; col++) { int n = neighbours(row,col); if (n > 3 || n < 2) tempCells[row][col] = false; else if (n == 3) tempCells[row][col] = true; else tempCells[row][col] = cells[row][col]; } 

(除此之外,看起来很好,但我还没有运行并测试过您的代码。)

不要使用ArrayIndexOutOfBoundException来计算边界外(OOB)条件。 它会杀死性能。 更好地使用环绕机制来像处理球体一样处理你的数组,这样你根本就不会遇到OOB。 你可以尝试这样的事情:

 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]}; 

}

然后,您可以遍历返回的数组并检查其中有多少是活着的并返回该计数。