Почему мои массивы возвращаются пустыми из метода, но код работает нормально при запуске в основном методе? - PullRequest
0 голосов
/ 19 марта 2020

У меня возникла следующая проблема с моей программой. Это консольное приложение "connect four" Java. При запуске моей программы я сбрасываю 3 вещи.

  1. Многомерный массив символов

public final int rows = 8, columns = 8;

public char[][] board = new char[rows][columns];

Я сбрасываю его с помощью for-l oop, перезаписывая каждое поле массива символом '.', Который является моей текстурой платы по умолчанию.

    public char[][] resetBoard() {
        // for loops cycle through every array field
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                board[i][j] = '.';
            }
        }
        return board;
    }

Целочисленный массив

public int[] nums = new int[columns];

Я сбросил его с помощью for-l oop, используя переменную i, поскольку я просто нужен массив с длиной столбцов, который просто считает от 1. Он используется, чтобы пользователь знал, какой столбец он выбрал. Как в шахматах "А6", например, без букв.

    public int[] resetNums() {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = i + 1;
        }
        return nums;
    }

Целое число

public int roundCounter = 0;

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

    public int resetRoundCounter() {
        // Resetting Round Counter, by initializing it to 0
        return roundCounter = 0;
    }

Я перезагружаю их так:

        gameMain main = new gameMain();
        gameMode mode = new gameMode();
        gameCheck check = new gameCheck();

        main.board = main.resetBoard();
        main.nums = main.resetNums();
        check.roundCounter = check.resetRoundCounter();

Моя проблема при печати игрового поля, массива чисел и раунда Счетчик, похоже, не работает. Игровое поле просто пустое. Массив nums имеет значение только 0, а круглый счетчик остается равным 0. При запуске кода в основном методе он работал лучше, чем при выполнении его через классы et c.

Мой метод печати:

    public void printBoard() {
        gameMain main = new gameMain();
        gameCheck check = new gameCheck();

        // Printing number array with space in between the elements
        for (int i = 0; i < main.nums.length; i++) {
            System.out.print(main.nums[i] + " ");
        }
        // Printing the round count next to the number array
        System.out.println("            Round " + check.getRoundCounter());

        for (int i = 0; i < main.rows; i++) {
            for (int j = 0; j < main.columns; j++) {
                System.out.print(main.board[i][j] + " ");
            }
            System.out.println();
        }
        for (int i = 0; i < main.nums.length; i++) {
            System.out.print(main.nums[i] + " ");
        }
        System.out.println("\n");
    }

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

Спасибо за чтение и заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Сделайте это как

public void resetBoard() {
    // for loops cycle through every array field
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            board[i][j] = '.';
        }
    }
}

public void resetNums() {
    for (int i = 0; i < nums.length; i++) {
        nums[i] = i + 1;
    }
}

public void resetRoundCounter() {
    // Resetting Round Counter, by initializing it to 0
    roundCounter = 0;
}

Наконец, назовите их следующим образом:

gameMain main = new gameMain();
gameCheck check = new gameCheck();
main.resetBoard();
main.resetNums();
check.resetRoundCounter();

Я также рекомендую вам следовать Java Соглашению об именах например gameMain должно быть GameMain и gameCheck должно быть GameCheck.

0 голосов
/ 19 марта 2020

Я думаю, что то, что происходит с вами, связано со ссылками на объекты, которые вы используете. Вы смешиваете два разных способа работы, я приведу вам пример:

Вы можете использовать ссылку 'roundCounter' и работать над ней:

public void resetRoundCounter() {
        // Resetting Round Counter, by initializing it to 0
        roundCounter = 0;
}

или вы можете вернуть ее, как это:

public int resetRoundCounter() {
        // Resetting Round Counter, by initializing it to 0
        return 0;
}

В первом случае вам придется вызывать функцию следующим образом:

resetRoundCounter(); //this function changes the value of your variable.

Во втором случае вам придется вызывать функцию следующим образом :

roundCounter = resetRoundCounter(); 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...