Написание Java-программы для запуска с предварительно встроенным интерфейсом (игра Life), но у меня возникли проблемы - PullRequest
0 голосов
/ 13 февраля 2012

Вот мой код: http://pastebin.com/umy0FPvB (LG)

и вот код учителя: http://pastebin.com/y5wU0Zpx (LCI)

Это говорит мне, что я ошибаюсь в строке 41 кода учителя, когда LCI пытается прочитать из матрицы, переданной LG [world ()]. ​​

Я сижу на этом некоторое время, но не могу понять, что случилось.

Exception in thread "main" java.lang.NullPointerException
    at Console.printWorld(Console.java:41)
    at Console.playLife(Console.java:56)
    at Console.main(Console.java:30)

-

/**
 * The Life game
 * @author Noah Kissinger
 * @date 2012.2.13
 */

import java.util.Random;

public class Life {

    private static boolean[][] matrix;
    private static int bL, bH, lL, lH, r, c;
    private static long rSeed;

    public Life(long seed, int rows, int columns, int birthLow, int birthHigh,
            int liveLow, int liveHigh) {

        rSeed = seed;
        bL = birthLow;
        bH = birthHigh;
        lL = liveLow;
        lH = liveHigh;
        r = rows;
        c = columns;

        createMatrix();

    }

    public void update() {
        updateMatrix();
    }

    public boolean[][] world() {
        return matrix;
    }

    public static void createMatrix() {

        Random seedBool = new Random(rSeed);

        boolean[][] matrix = new boolean[r][c];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = false;
            }
        }

        for (int i = 1; i < matrix.length - 1; i++) {
            for (int j = 1; j < matrix[i].length - 1; j++) {
                matrix[i][j] = seedBool.nextBoolean();
            }
        }

    }

    public static void updateMatrix() {

        Random seedBool = new Random(rSeed);

        boolean[][] matrixCopy = matrix.clone();
        for (int i = 0; i < matrix.length; i++)
            matrixCopy[i] = matrix[i].clone();

        int count = 0;

        for (int i = 1; i < matrix.length - 1; i++) {
            for (int j = 1; j < matrix[i].length - 1; j++) {

                if (matrix[i][j] == false) {

                    if (matrixCopy[i - 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i - 1][j] == true)
                        count++;
                    if (matrixCopy[i - 1][j + 1] == true)
                        count++;
                    if (matrixCopy[i][j - 1] == true)
                        count++;
                    if (matrixCopy[i][j + 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j] == true)
                        count++;
                    if (matrixCopy[i + 1][j + 1] == true)
                        count++;

                    if (count >= bL && count <= bH) {
                        matrix[i][j] = true;

                        for (int i1 = 0; i1 < matrix.length; i1++) {
                            for (int j1 = 0; j1 < matrix[i1].length; j1++) {
                                matrix[i1][j1] = false;
                            }
                        }

                        for (int i1 = 1; i1 < matrix.length - 1; i1++) {
                            for (int j1 = 1; j1 < matrix[i1].length - 1; j1++) {
                                matrix[i1][j1] = seedBool.nextBoolean();
                            }
                        }
                    } else
                        matrix[i][j] = false;
                    count = 0;

                }

                else {

                    if (matrixCopy[i - 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i - 1][j] == true)
                        count++;
                    if (matrixCopy[i - 1][j + 1] == true)
                        count++;
                    if (matrixCopy[i][j - 1] == true)
                        count++;
                    if (matrixCopy[i][j + 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j] == true)
                        count++;
                    if (matrixCopy[i + 1][j + 1] == true)
                        count++;

                    if (count >= lL && count <= lH)
                        matrix[i][j] = true;
                    else
                        matrix[i][j] = false;
                    count = 0;

                }
            }
        }
    }
}

-

/**
 * The Console class is a console interface to the Life game.
 * @author DH
 * @date Sept. 2008
 */

import java.util.Scanner;


public class Console {

    /**
     * @param args unused
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter the size of the matrix(rows, columns) :");
        int rows = in.nextInt();
        int columns = in.nextInt();
        System.out.println("Please enter random seed: ");
        long seed = in.nextLong();
        System.out.println("Please enter birth range (low, high) :");
        int birthLow = in.nextInt();
        int birthHigh = in.nextInt();
        System.out.println("Please enter live range (low, high): ");
        int liveLow = in.nextInt();
        int liveHigh = in.nextInt();
        try {
            Life game = new Life(seed, rows, columns, birthLow, birthHigh, liveLow, liveHigh);
            playLife(game);
        } catch (IllegalArgumentException e) {
            System.out.println("Inappropriate values: " + e.getMessage());
        }
    }

    /**
     * Print a boolean matrix
     * @param world is a boolean matrix to be printed with # for true and - for false.
     */
    public static void printWorld(boolean[][] matrix) {
        for (int r=0; r<matrix.length; r++) {
            for (int c=0; c<matrix[0].length; c++) {
                System.out.print(matrix[r][c] ? " # " : " - ");
            }
            System.out.println();
        }
        System.out.println();

    }

    /**
     * Play the game of Life starting with a given state
     * @param game is the Life object that provides the current state of Life
     */
    public static void playLife(Life game) {
        printWorld(game.world());
        for (int i=0; i<10; i++) {
            game.update();
            printWorld(game.world());
        }
    }

}

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Вот ваша проблема.В вашем методе createMatrix() вы определяете локальную переменную matrix, когда вы действительно хотите изменить поле matrix.

. Возможно, вам будет полезно получить доступ к полям с this, например this.matrix.Это делает четкое различие в коде.Однако большинство IDE автоматически выделяют поля и локальные переменные, поэтому некоторые люди считают это ненужным, это вопрос стиля и не слишком важный.

Я не проверял остальную часть вашей программы, могут быть другие ошибки.

   public static void createMatrix() {

    Random seedBool = new Random(rSeed);

    this.matrix = new boolean[r][c];

    for (int i = 0; i < this.matrix.length; i++) {
        for (int j = 0; j < this.matrix[i].length; j++) {
            this.matrix[i][j] = false;
        }
    }

    for (int i = 1; i < this.matrix.length - 1; i++) {
        for (int j = 1; j < this.matrix[i].length - 1; j++) {
            this.matrix[i][j] = seedBool.nextBoolean();
        }
    }

}
1 голос
/ 13 февраля 2012

boolean[][] matrix = new boolean[r][c];

Эта строка создает двумерный массив логических значений и сохраняет его в переменной loca в методе createMatrix. Итак, статическое поле matrix в классе Life по-прежнему будет null. Это поле читается и передается методом world в метод playLife. И, затем, вызов printLife метода триггера NPE.

Кстати, почему вы реализовали игру жизни, используя множество статических полей и методов?

...