Метод toString для печати игровой доски с двумерным логическим массивом - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь написать метод toString, который возьмет двумерный логический массив и выведет «x» или «_» в зависимости от того, являются ли они истинными или ложными, что было случайно инициализировано.Тем не менее, каждый раз, когда я печатаю доску, я возвращаю адрес памяти, и я не думаю, что он когда-либо попадает в мою строку, в которую я верю корректно переопределяю метод.Я разместил свой код ниже вместе с примером того, как я хочу, чтобы формат получился.Любая помощь будет принята с благодарностью.

public static boolean[][] randomize() {

        //Initializes random
        Random random = new Random();

        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                board[row][col] = random.nextBoolean();
            }
        }

        return board;
    }
 @Override
    public String toString() {
        String result = ""; 

        for (int i = 0; i < board.length; i++) {
            System.out.print(i);
            result += i;
        }
        result += "\n";
        System.out.println();

        for (int row = 0; row < board.length; row++) {
            System.out.print(row);
            result += row;
            for (int col = 0; col < board[row].length; col++) {
                if (board[row][col] == false) {
                    System.out.print("_");
                    result += "_";
                }
                else if (board[row][col] == true) {
                    System.out.print("X");
                    result += "X";
                }
            }
            System.out.println();
            result += "\n";
        }

        return result;
    }  

public void play() {
        currentStatus = GameState.IN_PROGRESS;
        DuoPlayPlayer currentPlayer = playerOne;

        //Creates and Prints the Board
        boolean[][] board = LightsOut.randomize();
        System.out.println(board);
        System.out.println(currentPlayer.getName() + " it is your turn!");
}

1 Ответ

2 голосов
/ 21 марта 2019

Здесь

boolean[][] board = LightsOut.randomize();
System.out.println(board);

вы пытаетесь напечатать доску, но доска на самом деле представляет собой двумерный массив примитивных логических значений.Метод toString(), который вы переопределили, будет работать для объектов класса, для которого метод toString() был переопределен.Если вы передадите переменные типов массива в метод System.out.println, он напечатает их адрес.

Если вы действительно хотите напечатать вашу логическую плату, рассмотрите возможность использования метода Arrays.toString () вloop - так как этот метод работает только для одномерных массивов.Если вы хотите напечатать двумерные массивы этим методом, вы получите адреса массивов для второго измерения.Или рассмотрите возможность использования Arrays.deepToString () , которая не требует цикла.Однако это выведет значения true / false в вашей консоли.

В вашем случае было бы целесообразно создать класс с именем Board, который бы содержал двумерный массив логических значений в качестве члена, и вы могли бы переопределить toString() метод для Board класса.Тогда вы могли бы сделать что-то вроде:

    Board board = new Board();
    System.out.println(board);

И здесь переопределенный метод toString() класса Board может быть вызван неявно.

Я также заметил, чтоспособ, которым вы создаете конечный результат в этом toString() методе, не оптимален.Вы должны прочитать о таких темах, как неизменность строк, пул строк и использование классов, таких как StringBuilder .

...