Игра крестики нолики. Лишние методы убрал.
public class Field {
public String[][] figures = new String[3][3];
public String getFigure(final Point point) {
return figures[point.x][point.y];
}
}
public class Point {
public int x;
public int y;
}
Теперь нужно сделать проверку, на совпадения по вертикалям, горизонталям и диагоналям. Отпускаем все тонкости относительно чей ход, сколько каких фигур на поле и тд.
public class A {
public String getWinner(final Field field) {
Point point1 = new Point();
point1.x = 0;
point1.y = 0;
Point point2 = new Point();
point1.x = 0;
point1.y = 1;
Point point3 = new Point();
point1.x = 0;
point1.y = 2;
if (field.getFigure(point1) != null && field.getFigure(point2) != null && field.getFigure(point3) != null &&
field.getFigure(point1).equals(field.getFigure(point2)) &&
field.getFigure(point2).equals(field.getFigure(point3))) {
return field.getFigure(point1);
}
return "no winners";
}
}
Давайте рассмотрим общий случай, когда поле большое и побеждает тот, кто сможет первым выстроить в один ряд n фигур.
Пусть F - множество всех фигур заданного типа на доске.
Для каждой фигуры f из F мы можем определить множество соседних фигур Nf этого же типа.
Для каждой соседней фигуры из Nf мы можем определить её расположение относительно исходной (N, NE, E, SE, S, SW, W, NW).
Затем для каждой соседней фигуры мы можем в цикле до размера выигрывающей последовательности проверить, можно ли сделать ещё один шаг в том же направлении.
На первый взгляд, выходит три цикла в разных методах: перебор фигур заданного типа, перебор соседних фигур заданного типа, перебор шагов по заданному направлению.
Оптимизировать можно (если нужно, в случае большой доски) алгоритм выбора соседних фигур, изначально создав в памяти граф. Также можно подумать что-нибудь на тему уменьшения исходного множества, выбросив из него заведомо неподходящие позиции. Например, если связный компонент графа содержит меньше элементов, чем должно быть в выигрышной последовательности - его можно не проверять. Кроме того, можно производить вычисления на каждом ходу, обрабатывая лишь изменившийся связный компонент.
Надеюсь, это поможет Вам составить код, в котором бизнес-логика игры выражена явно и читаемо.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники