Написать функцию для игры в крестики нолики. Функция должна выводить поле в рамке
Задача: Написать функцию для игры в крестики нолики. Функция должна выводить поле в рамке Для этого напишем универсальную функцию, которая принимает матрицу целых чисел 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 шт):
Если я правильно понял задачу, должно получиться что то типа такого:
┃━╋━╋━┃
┃Х┃О┃О┃
┃━╋━╋━┃
Для этого необходимо посчитать количество символов, которое необходимо вывести, а также учитывать начало линии и конец линии. 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(); // перевод на следующую строку, для вывода информации из массива
Если надо сделать такое (не знаю как выровнять, тут такой шрифт):
╋━━━╋
┃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();
}