生命游戏,java对象

时间:2015-09-22 01:13:49

标签: java

我的java编程程序运行不正常。我的教授让我们下载一个console.java来帮助使用make一个控制台来显示我们的程序输出。我认为当我调用update方法和checkCells时程序会卡住。我的教授说,调用行和列的matrix.length是不正确的,但如果我没有使用matrix.length,我会对如何调用列感到难过。

赞赏任何输入

import java.util.*;

public class Life {

    private int birthLow = 0;
    private int birthHigh = 0;
    private int liveLow = 0;
    private int liveHigh = 0;
    private boolean[][] matrix;

    public Life(long seed, int rows, int cols, int birthLow2, int birthHigh2, int liveLow2, int liveHigh2) {

        boolean initalMatrix[][] = new boolean[rows][cols];

        seedArray(initalMatrix, rows, cols, seed);

        birthLow = birthLow2;
        birthHigh = birthHigh2;
        liveLow = liveLow2;
        liveHigh = liveHigh2;
        matrix = initalMatrix;

        if ((rows < 1) && (cols < 1)) {

            throw new IllegalArgumentException("Rows must be positive, not " + rows);
        }
        if ((rows > 9) && (cols < 9)) {

            throw new IllegalArgumentException("Rows and cols cant go over 9, not " + rows + cols);
        }
        if (birthLow < 1 || (birthHigh > 9) || (liveLow < 1) || (liveHigh > 9)) {

            throw new IllegalArgumentException("birth rates can not be below 1 or above 9 " + birthLow + birthHigh);
        }

    }

    public boolean[][] world() {
        boolean[][] matrixClone = matrix.clone();
        for (int row = 0; row < matrix.length; row++) {
            matrixClone[row] = matrix[row].clone();
        }
        return matrixClone;
    }

    public void update() {
        matrix = checkCells(matrix, matrix.length, matrix.length, birthLow, birthHigh, liveLow, liveHigh);
    }

    public static void seedArray(boolean[][] matrix, int rows, int cols, long seed) {
        // generates a random seed to fill the matrix
        Random s = new Random(seed);

        for (int r = 1; r < rows - 1; r++) {
            for (int c = 1; c < cols - 1; c++) {

                boolean x = s.nextBoolean();
                matrix[r][c] = x;
            }
        }
    }

    public static void printBoard(boolean[][] matrix, int rows, int cols) {
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < cols; c++) {

                if (matrix[r][c] == false && c == 0) {
                    System.out.print("- ");
                } else if (matrix[r][c] == false && c > 0) {
                    System.out.print("- ");
                } else if (matrix[r][c] == true) {
                    System.out.print("# ");
                }
            }
            System.out.println();

        }
        System.out.println();
    }

    public static boolean[][] checkCells(boolean[][] matrix, int rows, int cols, int birthLow, int birthHigh,
            int liveLow, int liveHigh) {
        // clones matrix board
        boolean[][] matrixClone = matrix.clone();
        for (int row = 0; row < matrix.length; row++) {
            matrixClone[row] = matrix[row].clone();
        }
        // determines if the living cell is going to live or die
        for (int r = 1; r < rows; r++) {
            for (int c = 1; c < cols; c++) {
                if (neighbors(matrixClone, r, c) < liveLow || neighbors(matrixClone, r, c) > liveHigh || c == 0
                        || r == 0 || c == cols - 1 || r == rows - 1) {
                    matrix[r][c] = false;
                } else if (neighbors(matrixClone, r, c) >= birthLow && neighbors(matrixClone, r, c) <= birthHigh) {
                    matrix[r][c] = true;

                }
            }

        }
        return matrixClone;

    }

    public static int neighbors(boolean[][] matrixClone, int r, int c) {
        int neighbors = 0;
        // checks all neighbors for life or death
        for (int rn = (r - 1); rn <= (r + 1); rn++) {
            for (int cn = (c - 1); cn <= (c + 1); cn++) {
                try {
                    if (matrixClone[rn][cn] == true) {
                        neighbors++;
                    }
                    // catches the array if it checks out the perimeter
                } catch (ArrayIndexOutOfBoundsException f) {
                    continue;
                }
            }
        }
        return neighbors;
    }

}

2 个答案:

答案 0 :(得分:0)

不要将<dependency> <groupId>com.sun.jersey.jersey-test-framework</groupId> <artifactId>jersey-test-framework-grizzly2</artifactId> <version>1.17.1</version> <scope>test</scope> </dependency> 用于列。你已经知道了。原因是它为您提供了行数。相反,只需保存matrix.lengthrow的值并使用它们。

这样做的一种方法是创建字段,并在构造函数中初始化它们。

答案 1 :(得分:0)

请勿初始化名为initialMatrix的随机布尔[] []。相反,请初始化上方字段中的boolean [] []矩阵(矩阵=新的boolean [rows] [cols])。然后对于seedArray,调用seedArray(矩阵,行,列,种子)。

最后,在update()方法中,不要使用matrix.length,而是使用行和列。