Подтвердить что ты не робот

Можно ли проверить состояние выигрыша в игре TicTacToe с помощью jGraphT?

Я нашел это рабочее решение:

private int[] winningPatterns = { 0b111000000, 0b000111000, 0b000000111, // rows
        0b100100100, 0b010010010, 0b001001001, // cols
        0b100010001, 0b001010100 // diagonals
};

/** Returns true if thePlayer wins */
private boolean hasWon(int thePlayer) {
    int pattern = 0b000000000; // 9-bit pattern for the 9 cells
    for (int row = 0; row < 3; ++row) {
        for (int col = 0; col < 3; ++col) {
            if (cells[row][col].content == thePlayer) {
                pattern |= (1 << (row * 3 + col));
            }
        }
    }
    for (int winningPattern : winningPatterns) {
        if ((pattern & winningPattern) == winningPattern)
            return true;
    }
    return false;
}

но я хотел бы знать, есть ли более элегантное решение с использованием графической логики.

Обновление: я также изучаю свои знания в разных и более крупных вариантах платы 3x3, и я считаю, что этот подход не очень хорошо масштабируется.

Например: https://en.wikipedia.org/wiki/Teeko

4b9b3361

Ответ 1

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

  • Создайте шаблон, пока пользователь добавляет фигуры, потому что тогда потребуется только время, затрачиваемое на массив победитель.

  • Чтобы улучшить вторую часть, вы можете попытаться сохранить ее более эффективно. Храните выигрышные позиции таким образом, чтобы вы могли проверять несколько из них одновременно. Например, если первая позиция равна 0, то она может удалить 3 варианта из победивших команд вместо одного (111 000 000, 100 100 100, 100 010 001).

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

  • Если вы сохраняете позиции игрока в отдельном массиве, где p1Tiles и p2Tiles. Тогда это может значительно увеличить средний случай, потому что большинство из них время доски будет довольно пустым. Он будет заполнен только для одного экземпляра этой игры, прежде чем доска получит reset.

  • Вам действительно не нужно проверять, что все части игрока выиграли, вам просто нужно проверить, побеждает ли кусок, который делает текущий пользователь. Таким образом, с помощью этого метода вам нужно будет проверить только худший случай на 12 других мест, даже если плата имеет размер 99..999 на 99..999. (12 из-за всех слотов вокруг текущего слота PLUS, если между ними есть один одинаковый цвет, поэтому вам нужно будет посмотреть следующий слот)