Проверка метода Winner для моей игры TicTacToe - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь заставить метод checkgamewinner работать для моей игры TicTacToe, но у меня есть проблемы с тем, что l oop даже запускается или у меня как заканчивается. Всякий раз, когда я начинаю открывать свою игру и нажимать на поле, он выводит спам "нет победителя" в качестве печати. Вот мой текущий код:

public String checkGameWinner(char [][]grid) {
    boolean winner = false;
    String result = "None";
    while(!winner) {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (gridAt(0, 0) == 'x' & gridAt(0, 1) == 'x' & gridAt(0, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(1, 0) == 'x' & gridAt(2, 0) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(1, 0) == 'x' & gridAt(1, 1) == 'x' & gridAt(1, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(2, 0) == 'x' & gridAt(2, 1) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 1) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 1) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 2) == 'x' & gridAt(1, 2) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 2) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 0) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(0, 1) == 'x' & gridAt(0, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'o' & gridAt(1, 0) == 'o' & gridAt(2, 0) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 0) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(1, 0) == 'o' & gridAt(1, 1) == 'o' & gridAt(1, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(2, 0) == 'o' & gridAt(2, 1) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 1) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 1) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 2) == 'o' & gridAt(1, 2) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 2) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 0) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else {
                    result = "no winner";
                    System.out.println(result);
                }
            }

        }
    }
    return result;
}

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

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

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

Надеюсь, это поможет вам правильно составить лог c.

Кроме того, попробуйте правильно разделить ваши методы, чтобы их было легко читать, отлаживать и поддерживать.

Удачи и счастливого обучения!

0 голосов
/ 28 апреля 2020

Вам не нужно использовать циклы и, если еще условия вместе. Я создал образец программы с условиями if else.

public class Main
{
    public static void main(String[] args) {
        char [][]grid = {
                {'x', 'x', 'x'},
                {'x', 'x', 'x'},
                {'x', 'x', 'x'}
        };
        checkGameWinner(grid);
    }

    public static String checkGameWinner(char [][]grid) {
        String result = "None";
        boolean winner = true;
        if (grid[0][0] == 'x' && grid[0][1] == 'x' && grid[0][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[1][0] == 'x' && grid[2][0] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[1][1] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[1][0] == 'x' && grid[1][1] == 'x' && grid[1][2] == 'x') {
            result = "Player x has won";
        } else if (grid[2][0] == 'x' && grid[2][1] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][1] == 'x' && grid[1][1] == 'x' && grid[2][1] == 'x') {
            result = "Player x has won";
        } else if (grid[0][2] == 'x' && grid[1][2] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][2] == 'x' && grid[1][1] == 'x' && grid[2][0] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[0][1] == 'x' && grid[0][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'o' && grid[1][0] == 'o' && grid[2][0] == 'o') {
            result = "Player o has won";
        } else if (grid[0][0] == 'o' && grid[1][1] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[1][0] == 'o' && grid[1][1] == 'o' && grid[1][2] == 'o') {
            result = "Player o has won";
        } else if (grid[2][0] == 'o' && grid[2][1] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[0][1] == 'o' && grid[1][1] == 'o' && grid[2][1] == 'o') {
            result = "Player o has won";
        } else if (grid[0][2] == 'o' && grid[1][2] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[0][2] == 'o' && grid[1][1] == 'o' && grid[2][0] == 'o') {
            result = "Player o has won";
        } else {
            result = "no winner";
            winner = false;
        }
        System.out.println(result);
        return result;
    }
}

Примечание: Выше не самый лучший способ решения данной проблемы.

0 голосов
/ 28 апреля 2020

Почему бы не упростить себе задачу и не создать такие методы.

private boolean checkRows() {
}
private boolean checkColumns() {
}
private boolean checkDiagnonals() {
}

Тогда у вас будет меньше тестов в каждом методе, и их будет легче отлаживать как отдельные методы.

if (checkRows() || checkColumns() || checkDiagonals()) {
  // winning code here.
}

Я предполагал, что они будут методами экземпляра, поэтому у них будет доступ к char[][] grid.

Относительно вашего текущего кода.

  • Избавьтесь от l oop, это бесполезно
  • Избавиться от петель. Вы уже проверяете явные индексы.
  • когда вы решаете, кто победил, напечатайте его и просто return true.
  • Если вы дойдете до конца всех тестов без победителя, return false .

Для отладки установите sh тестовых случаев для x и o, чтобы вы знали, где искать

...