From c9a61650f1af8833dbc9ee0d3e97f1c3638194ce Mon Sep 17 00:00:00 2001 From: IrReiku Date: Sun, 3 Apr 2022 01:35:54 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20theLongest?= =?UTF-8?q?Cross=20=D0=B2=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Field.java | 95 ++++++++++++++++++++++++++++++++++++++++ src/main/java/Main.java | 24 ++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/main/java/Field.java create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Field.java b/src/main/java/Field.java new file mode 100644 index 0000000..0f4a238 --- /dev/null +++ b/src/main/java/Field.java @@ -0,0 +1,95 @@ +public final class Field { + public final int size; // длина стороны поля + private final char[][] view; + + public Field(int size) { // конструктор + this.size = size; + view = new char[size][size]; + for (char[] row : view) { + java.util.Arrays.fill(row, ' '); + } + } + + public Field() { // конструктор + this.size = 3; + view = new char[size][size]; + for (char[] row : view) java.util.Arrays.fill(row, ' '); + } + + public void show() { + System.out.println("Состояние поля:"); + for (char[] i : view) { + for (char j : i) System.out.print(j + " "); + System.out.println(); + } + + } + + public void addNought(int row, int column) { + view[row - 1][column - 1] = 'O'; + } + + public void addCross(int row, int column) { + view[row - 1][column - 1] = 'X'; + } + + public void clearCell(int row, int column) { + view[row - 1][column - 1] = ' '; + } + + public void theLongestCross() { + int[] count = {0, 0, 0, 0}; + int max = -1; + // проверка рядов и строк + for (int row = 0; row < size; row++) { + for (int column = 0; column < size; column++) { + if (view[row][column] == 'X') count[0]++; + else { + if (count[0] > max) max = count[0]; + count[0] = 0; + } + if (view[column][row] == 'X') count[1]++; + else { + if (count[1] > max) max = count[1]; + count[1] = 0; + } + } + for (int k = 0; k <= 1; k++) { + if (count[k] > max) max = count[k]; + count[k] = 0; + } + } + // проверка диагоналей + for (int i = 0; i < size; i++){ + for (int j = i; j >= 0 ; j--) { + for (int l = 0; l <= i; l++) { + if (view[l][j] == 'X') count[0]++; + else { + if (count[0] > max) max = count[0]; + count[0] = 0; + } + if (view[j][l] == 'X') count[1]++; + else { + if (count[1] > max) max = count[1]; + count[1] = 0; + } + if (view[l][size - j - 1] == 'X') count[2]++; + else { + if (count[2] > max) max = count[2]; + count[2] = 0; + } + if (view[j][size - l - 1] == 'X') count[3]++; + else { + if (count[3] > max) max = count[3]; + count[3] = 0; + } + + } + } + for (int k = 0; k <= 3; k++) { + if (count[k] > max) max = count[k]; + } + } + System.out.println("Самая длинная последовательность крестиков: " + max); + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000..d025aee --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,24 @@ +/** +Вариант 15 -- поле для крестиков-ноликов [Java] +Хранит квадратное поле для игры в крестики-нолики заданного в конструкторе +размера. +Методы: добавление крестика / нолика в заданную клетку, очистка заданной клетки, +поиск самой длинной последовательности крестиков (непрерывной линии по +горизонтали / вертикали / диагонали), то же для ноликов. +*/ + +public final class Main { + public static void main(String[] args) { + Field a = new Field(3); + a.show(); + a.addNought(3, 3); + a.show(); + a.clearCell(2, 2); + a.show(); + a.addCross(3, 3); + a.addCross(2, 2); + a.addCross(1, 1); + a.show(); + a.theLongestCross(); + } +} From be1dc8b676a705a74ee4fb572ade52ed682ad53d Mon Sep 17 00:00:00 2001 From: IrReiku Date: Sun, 3 Apr 2022 16:23:01 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Field.java | 106 ++++++++++++++++++++++++++++++--------- src/main/java/Main.java | 11 ++-- 2 files changed, 90 insertions(+), 27 deletions(-) diff --git a/src/main/java/Field.java b/src/main/java/Field.java index 0f4a238..2db69d2 100644 --- a/src/main/java/Field.java +++ b/src/main/java/Field.java @@ -38,17 +38,70 @@ public void clearCell(int row, int column) { } public void theLongestCross() { + int[] count = {0, 0, 0, 0}; + int max = -1; + // проверка рядов и строк + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + if (view[i][j] == 'X') count[0]++; + else { + if (count[0] > max) max = count[0]; + count[0] = 0; + } + if (view[j][i] == 'X') count[1]++; + else { + if (count[1] > max) max = count[1]; + count[1] = 0; + } + } + for (int k = 0; k <= 1; k++) { + if (count[k] > max) max = count[k]; + count[k] = 0; + } + } + // проверка диагоналей + for (int i = 0; i < size; i++){ + for (int j = 0; j <= i; j++) { + if (view[j][i - j] == 'X') count[0]++; + else { + if (count[0] > max) max = count[0]; + count[0] = 0; + } + if (view[size - 1 - j][size - 1 - i + j] == 'X') count[1]++; + else { + if (count[1] > max) max = count[1]; + count[1] = 0; + } + if (view[j][size - 1 - i + j] == 'X') count[2]++; + else { + if (count[2] > max) max = count[2]; + count[2] = 0; + } + if (view[size - 1 - j][i - j] == 'X') count[3]++; + else { + if (count[3] > max) max = count[3]; + count[3] = 0; + } + } + for (int k = 0; k <= 3; k++) { + if (count[k] > max) max = count[k]; + count[k] = 0; + } + } + System.out.println("Самая длинная последовательность крестиков: " + max); + } + public void theLongestNought() { int[] count = {0, 0, 0, 0}; int max = -1; // проверка рядов и строк for (int row = 0; row < size; row++) { for (int column = 0; column < size; column++) { - if (view[row][column] == 'X') count[0]++; + if (view[row][column] == 'O') count[0]++; else { if (count[0] > max) max = count[0]; count[0] = 0; } - if (view[column][row] == 'X') count[1]++; + if (view[column][row] == 'O') count[1]++; else { if (count[1] > max) max = count[1]; count[1] = 0; @@ -61,35 +114,40 @@ public void theLongestCross() { } // проверка диагоналей for (int i = 0; i < size; i++){ - for (int j = i; j >= 0 ; j--) { - for (int l = 0; l <= i; l++) { - if (view[l][j] == 'X') count[0]++; - else { - if (count[0] > max) max = count[0]; - count[0] = 0; - } - if (view[j][l] == 'X') count[1]++; - else { - if (count[1] > max) max = count[1]; - count[1] = 0; - } - if (view[l][size - j - 1] == 'X') count[2]++; - else { - if (count[2] > max) max = count[2]; - count[2] = 0; - } - if (view[j][size - l - 1] == 'X') count[3]++; - else { - if (count[3] > max) max = count[3]; - count[3] = 0; + for (int j = 0; j <= i; j++) { + if (view[j][i - j] == 'O') count[0]++; + else { + if (count[0] > max) max = count[0]; + count[0] = 0; } - + if (view[size - 1 - j][size - 1 - i + j] == 'O') count[1]++; + else { + if (count[1] > max) max = count[1]; + count[1] = 0; + } + if (view[j][size - 1 - i + j] == 'O') count[2]++; + else { + if (count[2] > max) max = count[2]; + count[2] = 0; + } + if (view[size - 1 - j][i - j] == 'O') count[3]++; + else { + if (count[3] > max) max = count[3]; + count[3] = 0; } } for (int k = 0; k <= 3; k++) { if (count[k] > max) max = count[k]; + count[k] = 0; } } System.out.println("Самая длинная последовательность крестиков: " + max); } + /* private void objectInit (int row, int column, char object, int[] count, int place, int max) { + if (view[row][column] == object) count[place]++; + else { + if (count[place] > max) max = count[place]; + count[place] = 0; + } + } */ } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d025aee..28a5119 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -9,15 +9,20 @@ public final class Main { public static void main(String[] args) { - Field a = new Field(3); + Field a = new Field(5); a.show(); a.addNought(3, 3); a.show(); - a.clearCell(2, 2); + a.clearCell(3, 3); a.show(); - a.addCross(3, 3); + //a.addCross(3, 3); a.addCross(2, 2); a.addCross(1, 1); + a.addCross(3, 1); + a.addCross(2, 1); + a.addCross(5, 5); + a.addCross(3, 3); + a.addCross(4, 4); a.show(); a.theLongestCross(); } From 258c0fe5eb35c7f4562952c337270a12f3eac353 Mon Sep 17 00:00:00 2001 From: IrReiku Date: Thu, 7 Apr 2022 16:56:41 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D1=8B?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B8=20=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Field.java | 89 +++++++++++++++++++++++------------- src/main/java/Main.java | 17 +------ src/test/java/FieldTest.java | 75 ++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 48 deletions(-) create mode 100644 src/test/java/FieldTest.java diff --git a/src/main/java/Field.java b/src/main/java/Field.java index 2db69d2..f08566c 100644 --- a/src/main/java/Field.java +++ b/src/main/java/Field.java @@ -1,6 +1,11 @@ +import java.util.Arrays; +import java.util.Objects; + public final class Field { public final int size; // длина стороны поля private final char[][] view; + private int theLongestCross; + private int theLongestNought; public Field(int size) { // конструктор this.size = size; @@ -25,37 +30,49 @@ public void show() { } - public void addNought(int row, int column) { + public void addNought(int row, int column) throws Exception { + if (row < 1 || row > size || column < 1 || column > size) { + throw new Exception("Ошибка: В данном поле не существует такого ряда и/или столбца."); + } else if (view[row - 1][column - 1] != ' ') { + throw new Exception("Ошибка: Ячейка уже занята."); + } view[row - 1][column - 1] = 'O'; } - public void addCross(int row, int column) { + public void addCross(int row, int column) throws Exception { + if (row < 1 || row > size || column < 1 || column > size) { + throw new Exception("Ошибка: В данном поле не существует такого ряда и/или столбца."); + } else if (view[row - 1][column - 1] != ' ') { + throw new Exception("Ошибка: Ячейка уже занята."); + } view[row - 1][column - 1] = 'X'; } - public void clearCell(int row, int column) { + public void clearCell(int row, int column) throws Exception { + if (row < 1 || row > size || column < 1 || column > size) { + throw new Exception("Ошибка: В данном поле не существует такого ряда и/или столбца."); + } view[row - 1][column - 1] = ' '; } - public void theLongestCross() { + public int theLongestCross() { int[] count = {0, 0, 0, 0}; - int max = -1; // проверка рядов и строк for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (view[i][j] == 'X') count[0]++; else { - if (count[0] > max) max = count[0]; + if (count[0] > theLongestCross) theLongestCross = count[0]; count[0] = 0; } if (view[j][i] == 'X') count[1]++; else { - if (count[1] > max) max = count[1]; + if (count[1] > theLongestCross) theLongestCross = count[1]; count[1] = 0; } } for (int k = 0; k <= 1; k++) { - if (count[k] > max) max = count[k]; + if (count[k] > theLongestCross) theLongestCross = count[k]; count[k] = 0; } } @@ -64,51 +81,50 @@ public void theLongestCross() { for (int j = 0; j <= i; j++) { if (view[j][i - j] == 'X') count[0]++; else { - if (count[0] > max) max = count[0]; + if (count[0] > theLongestCross) theLongestCross = count[0]; count[0] = 0; } if (view[size - 1 - j][size - 1 - i + j] == 'X') count[1]++; else { - if (count[1] > max) max = count[1]; + if (count[1] > theLongestCross) theLongestCross = count[1]; count[1] = 0; } if (view[j][size - 1 - i + j] == 'X') count[2]++; else { - if (count[2] > max) max = count[2]; + if (count[2] > theLongestCross) theLongestCross = count[2]; count[2] = 0; } if (view[size - 1 - j][i - j] == 'X') count[3]++; else { - if (count[3] > max) max = count[3]; + if (count[3] > theLongestCross) theLongestCross = count[3]; count[3] = 0; } } for (int k = 0; k <= 3; k++) { - if (count[k] > max) max = count[k]; + if (count[k] > theLongestCross) theLongestCross = count[k]; count[k] = 0; } } - System.out.println("Самая длинная последовательность крестиков: " + max); + return theLongestCross; } - public void theLongestNought() { + public int theLongestNought() { int[] count = {0, 0, 0, 0}; - int max = -1; // проверка рядов и строк for (int row = 0; row < size; row++) { for (int column = 0; column < size; column++) { if (view[row][column] == 'O') count[0]++; else { - if (count[0] > max) max = count[0]; + if (count[0] > theLongestNought) theLongestNought = count[0]; count[0] = 0; } if (view[column][row] == 'O') count[1]++; else { - if (count[1] > max) max = count[1]; + if (count[1] > theLongestNought) theLongestNought = count[1]; count[1] = 0; } } for (int k = 0; k <= 1; k++) { - if (count[k] > max) max = count[k]; + if (count[k] > theLongestNought) theLongestNought = count[k]; count[k] = 0; } } @@ -117,37 +133,46 @@ public void theLongestNought() { for (int j = 0; j <= i; j++) { if (view[j][i - j] == 'O') count[0]++; else { - if (count[0] > max) max = count[0]; + if (count[0] > theLongestNought) theLongestNought = count[0]; count[0] = 0; } if (view[size - 1 - j][size - 1 - i + j] == 'O') count[1]++; else { - if (count[1] > max) max = count[1]; + if (count[1] > theLongestNought) theLongestNought = count[1]; count[1] = 0; } if (view[j][size - 1 - i + j] == 'O') count[2]++; else { - if (count[2] > max) max = count[2]; + if (count[2] > theLongestNought) theLongestNought = count[2]; count[2] = 0; } if (view[size - 1 - j][i - j] == 'O') count[3]++; else { - if (count[3] > max) max = count[3]; + if (count[3] > theLongestNought) theLongestNought = count[3]; count[3] = 0; } } for (int k = 0; k <= 3; k++) { - if (count[k] > max) max = count[k]; + if (count[k] > theLongestNought) theLongestNought = count[k]; count[k] = 0; } } - System.out.println("Самая длинная последовательность крестиков: " + max); + return theLongestNought; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Field field = (Field) o; + return size == field.size + && Arrays.deepEquals(view, field.view); + } + + @Override + public int hashCode() { + int result = Objects.hash(size, theLongestCross, theLongestNought); + result = 31 * result + Arrays.deepHashCode(view); + return result; } - /* private void objectInit (int row, int column, char object, int[] count, int place, int max) { - if (view[row][column] == object) count[place]++; - else { - if (count[place] > max) max = count[place]; - count[place] = 0; - } - } */ } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 28a5119..cf11cfb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -9,21 +9,6 @@ public final class Main { public static void main(String[] args) { - Field a = new Field(5); - a.show(); - a.addNought(3, 3); - a.show(); - a.clearCell(3, 3); - a.show(); - //a.addCross(3, 3); - a.addCross(2, 2); - a.addCross(1, 1); - a.addCross(3, 1); - a.addCross(2, 1); - a.addCross(5, 5); - a.addCross(3, 3); - a.addCross(4, 4); - a.show(); - a.theLongestCross(); + Field a = new Field(); } } diff --git a/src/test/java/FieldTest.java b/src/test/java/FieldTest.java new file mode 100644 index 0000000..3fecb9a --- /dev/null +++ b/src/test/java/FieldTest.java @@ -0,0 +1,75 @@ +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +public class FieldTest { + + @Test + public void testAddNought() throws Exception { + Field FieldA = new Field(); + Field FieldB = new Field(3); + assertThrows(Exception.class, () -> FieldA.addNought(8, 5), + "Ошибка: В данном поле не существует такого ряда и/или столбца."); + FieldA.addNought(2,3); + assertThrows(Exception.class, () -> FieldA.addNought(2, 3), + "Ошибка: Ячейка уже занята."); + FieldB.addNought(2, 3); + assertEquals(FieldA, FieldB); + FieldA.addNought(1,1); + assertNotEquals(FieldA, FieldB); + } + + @Test + public void testAddCross() throws Exception { + Field FieldA = new Field(); + assertThrows(Exception.class, () -> FieldA.addCross(8, 5), + "Ошибка: В данном поле не существует такого ряда и/или столбца."); + Field FieldB = new Field(3); + FieldA.addCross(1,2); + assertThrows(Exception.class, () -> FieldA.addCross(1, 2), + "Ошибка: Ячейка уже занята."); + FieldB.addCross(1, 2); + assertEquals(FieldA, FieldB); + FieldA.addCross(1,1); + assertNotEquals(FieldA, FieldB); + + } + + @Test + public void testClearCell() throws Exception { + Field FieldA = new Field(); + assertThrows(Exception.class, () -> FieldA.clearCell(8, 5), + "Ошибка: В данном поле не существует такого ряда и/или столбца."); + Field FieldB = new Field(3); + FieldA.addCross(1,2); + FieldA.addNought(1, 3); + FieldB.addCross(1, 2); + FieldB.addNought(1, 3); + FieldA.clearCell(1,2); + assertNotEquals(FieldA, FieldB); + FieldB.clearCell(1,2); + assertEquals(FieldA, FieldB); + } + @Test + public void testTheLongestNought() throws Exception { + Field FieldA = new Field(4); + FieldA.addCross(1,1); + FieldA.addNought(1, 2); + FieldA.addNought(1, 3); + FieldA.addNought(1, 4); + FieldA.addNought(2, 2); + assertEquals(3, FieldA.theLongestNought()); + } + @Test + public void testTheLongestCross() throws Exception { + Field FieldA = new Field(4); + FieldA.addNought(1,1); + FieldA.addNought(3,2); + FieldA.addCross(2, 1); + FieldA.addCross(2, 2); + FieldA.addCross(1, 3); + FieldA.addCross(3, 3); + FieldA.addCross(4, 4); + assertEquals(3, FieldA.theLongestCross()); + } +}