Игра крестики нолики. Лишние методы убрал.
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).
Затем для каждой соседней фигуры мы можем в цикле до размера выигрывающей последовательности проверить, можно ли сделать ещё один шаг в том же направлении.
На первый взгляд, выходит три цикла в разных методах: перебор фигур заданного типа, перебор соседних фигур заданного типа, перебор шагов по заданному направлению.
Оптимизировать можно (если нужно, в случае большой доски) алгоритм выбора соседних фигур, изначально создав в памяти граф. Также можно подумать что-нибудь на тему уменьшения исходного множества, выбросив из него заведомо неподходящие позиции. Например, если связный компонент графа содержит меньше элементов, чем должно быть в выигрышной последовательности - его можно не проверять. Кроме того, можно производить вычисления на каждом ходу, обрабатывая лишь изменившийся связный компонент.
Надеюсь, это поможет Вам составить код, в котором бизнес-логика игры выражена явно и читаемо.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньВозникла проблема с RecycleView, а именно: Как-то странно забиваются данные в список, если список данных очень большой, то создаются...
Добрый деньНаписал код, вычисляющий остаток от деления n-ного числа Фибоначчи на вводимое из консоли число, где n может быть очень большим...
Увидел задачу, суть которой была переопределить методы equals и hashcode чтобы сравнение объектов работало правильноТак вот, что значит эта строка?
AbstractQueuedSynchronizer содержит внутреннее поле state0 и 1 зарезервированы для состояния - блокировки нет, и блокировка установлена