Java. Крестики нолики

920
09 марта 2017, 22:02

Игра крестики нолики. Лишние методы убрал.

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";
    }
}
  1. Я понимаю что надо делать через цикл, но не совсем понимаю как. Могу тупо "слизать", но хочу понять.
  2. Если у нас фиксированное кол-во ячеек, можно ли реализовать это через SWITCH ?
  3. Если я заполняю все 9 ячеек массива String,ами "X" или "O", все равно получаю исключение которое не могу понять - Exception in thread "main" java.lang.NoSuchMethodException:
    XOgame.model.A.main([Ljava.lang.String;) at java.lang.Class.getMethod(Class.java:1786) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)
  4. Подобную тему изучаю Java. Массивы. Нужен метод проверяющий победителя в крестики нолики
Answer 1

Давайте рассмотрим общий случай, когда поле большое и побеждает тот, кто сможет первым выстроить в один ряд n фигур.

Пусть F - множество всех фигур заданного типа на доске.

  1. Для каждой фигуры f из F мы можем определить множество соседних фигур Nf этого же типа.

  2. Для каждой соседней фигуры из Nf мы можем определить её расположение относительно исходной (N, NE, E, SE, S, SW, W, NW).

  3. Затем для каждой соседней фигуры мы можем в цикле до размера выигрывающей последовательности проверить, можно ли сделать ещё один шаг в том же направлении.

На первый взгляд, выходит три цикла в разных методах: перебор фигур заданного типа, перебор соседних фигур заданного типа, перебор шагов по заданному направлению.

Оптимизировать можно (если нужно, в случае большой доски) алгоритм выбора соседних фигур, изначально создав в памяти граф. Также можно подумать что-нибудь на тему уменьшения исходного множества, выбросив из него заведомо неподходящие позиции. Например, если связный компонент графа содержит меньше элементов, чем должно быть в выигрышной последовательности - его можно не проверять. Кроме того, можно производить вычисления на каждом ходу, обрабатывая лишь изменившийся связный компонент.

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

READ ALSO
Проблемы с RecycleView android

Проблемы с RecycleView android

Добрый деньВозникла проблема с RecycleView, а именно: Как-то странно забиваются данные в список, если список данных очень большой, то создаются...

385
Медленно работает перемножение матриц java

Медленно работает перемножение матриц java

Добрый деньНаписал код, вычисляющий остаток от деления n-ного числа Фибоначчи на вводимое из консоли число, где n может быть очень большим...

380
Непонятная часть кода

Непонятная часть кода

Увидел задачу, суть которой была переопределить методы equals и hashcode чтобы сравнение объектов работало правильноТак вот, что значит эта строка?

250
зачем нужен state в AbstractQueuedSynchronizer

зачем нужен state в AbstractQueuedSynchronizer

AbstractQueuedSynchronizer содержит внутреннее поле state0 и 1 зарезервированы для состояния - блокировки нет, и блокировка установлена

270