Написать функцию для игры в крестики нолики. Функция должна выводить поле в рамке

Задача: Написать функцию для игры в крестики нолики. Функция должна выводить поле в рамке Для этого напишем универсальную функцию, которая принимает матрицу целых чисел N*N (1 <= N <= 300), значения могут быть:

0 — клетка свободна 1 — клетка занята первым игроком 2 — клетка занята вторым игроком Функция должна выводить отформатированное поле:

каждая клетка должна быть размером 3 столбца и 1 строка (без учета границ). символ X или 0 должны располагаться по центру для рамки использовать следующие символы: ━, ┃, ╋. Сигнатура функции Название функции: print.

Параметры: int[][] grid.

Возвращаемый тип: void.

Примеры Входные данные grid = [ [ 2, 0, 1 ], [ 0, 1, 2 ], [ 1, 0, 0 ] ];

На данный момент я написала код, который выводит только вертикальные боковые рамки и внутри игровое поле. Но как встроить горизонтальные рамки, которые должны располагаться под строкой игрового поля - не понимаю. Если кто-то знает помогите пожалуйста - Вот мой код:

public static void print(int[][] grid){
        int humanOne = 1;
        int humanTwo = 2;
        char stepOne = 'X';
        char stepTwo = 'O';

        for (int row = 0; row < grid.length; row++) {
            for (int col = 0; col < grid[row].length; col++) {
                if (grid[row][col] == humanOne) {
                    grid[row][col] = stepOne;
                    System.out.print(" " + stepOne + " " + "┃");
                } else if (grid[row][col] == humanTwo) {
                    grid[row][col] = stepTwo;
                    System.out.print(" " + stepTwo + " " +"┃");
                } else if (grid[row][col] == 0) {
                    grid[row][col] = ' ';
                    System.out.print(" " + ' ' + " " + "┃");
                }
            }
            System.out.println();
        }
        System.out.println();
        System.out.print("━" + "━" + "━" + "╋");
       // for (int N = 0; N < 9; N++) {
       //     System.out.print("━" + "━" + "━" + "╋");
       // }
    }

Ну вот на данный момент у меня получилось вот такое поле: поле

public static void print(int[][] grid){
        int humanOne = 1;
        int humanTwo = 2;
        char stepOne = 'X';
        char stepTwo = 'O';

        for (int row = 0; row < grid.length; row++) {
            for (int col = 0; col < grid[row].length; col++) {
                if (grid[row][col] == humanOne) {
                    grid[row][col] = stepOne;
                    System.out.print(" " + stepOne + " " + "┃");
                } else if (grid[row][col] == humanTwo) {
                    grid[row][col] = stepTwo;
                    System.out.print(" " + stepTwo + " " +"┃");
                } else if (grid[row][col] == 0) {
                    grid[row][col] = ' ';
                    System.out.print(" " + ' ' + " " + "┃");
                }
            }
            System.out.println();
            for (int N = 0; N < grid.length; N++) {
                System.out.print("━" + "━" + "━" + "╋");
            }
            System.out.println();
        }
        System.out.println();
    }

Это код дополненный - Только нужно убрать крайние нижние рамки и крайние правые - чтобы их не было, остались только внутренние... Может знаете как это можно сделать....


Ответы (2 шт):

Автор решения: kio

Если я правильно понял задачу, должно получиться что то типа такого:

  ┃━╋━╋━┃ 
  ┃Х┃О┃О┃
  ┃━╋━╋━┃

Для этого необходимо посчитать количество символов, которое необходимо вывести, а также учитывать начало линии и конец линии. 1(┃),2(━),3(╋),4(━),5(╋),6(━),7(┃). То есть для вывода одномерного массива(строки) состоящего из трех элементов необходимо выводить 7 символов. При этом для первого и последнего символа необходимо задать условия, а центр можно выводить в цикле.

Реализация блока (в идеале вынести его в отдельную процедуру):

for (int i = 0; i < grid.length; i++) { // выводим строку разделитель 
            if (i == 0) {   // Обрабатываем первую ячейку
                System.out.print("┃");
                System.out.print("━");
                System.out.print("╋");
            } else if (i < grid.length - 1) {   // все последующие, кроме последней
                System.out.print("━");
                System.out.print("╋");
            } else {    // выводим последнюю ячейку, закрывающую
                System.out.print("━");
                System.out.print("┃");
            }
        }
        System.out.println(); // перевод на следующую строку, для вывода информации из массива
→ Ссылка
Автор решения: DronDron

Если надо сделать такое (не знаю как выровнять, тут такой шрифт):
╋━━━╋
┃0┃ ┃X┃
┃ ┃X┃0┃
┃X┃ ┃ ┃
╋━━━╋
То можно написать так:

public void print(int[][] grid) {
    char[] symbols = { ' ', 'X', '0' };
    String horizontal = "╋" + "━".repeat(grid.length * 2 - 1) + "╋";
    System.out.println(horizontal);
    for (int[] ints : grid)
        System.out.println(Arrays.stream(ints).mapToObj(e -> String.valueOf(symbols[e]))
                .collect(Collectors.joining("┃", "┃", "┃")));
    System.out.println(horizontal);
}

Ну или у Вас stream'о-зависимость :) то вот:

public void print(int[][] grid) {
    char[] symbols = { ' ', 'X', '0' };
    String horizontal = "╋" + "━".repeat(grid.length * 2 - 1) + "╋\n";
    System.out.print(Arrays.stream(grid).map(ints -> Arrays.stream(ints).mapToObj(e -> String.valueOf(symbols[e]))
            .collect(Collectors.joining("┃", "┃", "┃\n"))).collect(Collectors.joining("", horizontal, horizontal)));
}

P.S. программа требует чтобы матрица была квадратной!
UPD: как выяснилось, внешние рамки не нужны, тогда код ещё короче:

public static void print(int[][] grid) {
    String[] symbols = { "   ", " X ", " 0 " };
    System.out.print(Arrays.stream(grid).map(ints -> Arrays.stream(ints).mapToObj(e -> symbols[e]).collect(Collectors.joining("┃", "", "\n")))
        .collect(Collectors.joining(Stream.generate(() -> "━━━").limit(grid.length).collect(Collectors.joining("╋")) + "\n")));
}

UPD2:

public static void print(int[][] grid){
    int humanOne = 1;
    int humanTwo = 2;
    char stepOne = 'X';
    char stepTwo = 'O';

    for (int row = 0; row < grid.length; row++) {
        for (int col = 0; col < grid[row].length; col++) {
            String borderRight = "┃";
            if (col == grid[row].length - 1) {
                borderRight = "";
            }
            if (grid[row][col] == humanOne) {
                System.out.print(" " + stepOne + " " + borderRight);
            } else if (grid[row][col] == humanTwo) {
                System.out.print(" " + stepTwo + " " + borderRight);
            } else if (grid[row][col] == 0) {
                System.out.print(" " + ' ' + " " + borderRight);
            }
        }
        System.out.println();
        if (row != grid.length - 1) {
            for (int N = 0; N < grid.length; N++) {
                if (N == grid.length - 1) {
                    System.out.print("━━━");
                } else {
                    System.out.print("━━━╋");
                }
            }
        }
        System.out.println();
    }
    System.out.println();
}
→ Ссылка