Метод победы в JavaFX Connect 4 - PullRequest
1 голос
/ 11 марта 2020

Я создаю игру Connect 4 в JavaFX, вот мой метод checkWin. Моя игра работает так, что в каждой ячейке board есть пустой кружок, и только когда пользователь выбирает столбец, он имеет setFill(Color.RED) (или синий цвет в зависимости от игрока). Все работает нормально, кроме этого метода.

public void checkWin(int row, int column, GridPane board) {
        Circle piece = ((Circle)getNodeByRowColumnIndex(row, column, board));

        // Horizontal check
        if (column - 3 <= 0) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row, column + i, board)) ; i++) {
                System.out.println("Checking : (" + (row) + " , " + (column + i) + ")");
                if(i == 4) hasWon = true;
            }
        } else if (column + 3 > Columns) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row, column - i, board)) ; i++) {
                System.out.println("Checking : (" + (row) + " , " + (column - i) + ")");
                if(i == 4) hasWon = true;
            }       
        }

        // Vertical check
        if (row - 3 <= 0) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row + i, column, board)) ; i++) {
                System.out.println("Checking : (" + (row + i) + " , " + (column) + ")");
                if(i == 4) hasWon = true;
                System.out.println(i);
            }

        } else if (row + 3 > Rows) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row - i, column, board)) ; i++) {
                System.out.println("Checking : (" + (row - i) + " , " + (column) + ")");
                if(i == 4) hasWon = true;
            }       
        }

        // Ascending diagonal check
        if (row - 3 <= 0 && column - 3 <= 0) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row + i, column + i, board)) ; i++) {
                System.out.println("Checking : (" + (row + i) + " , " + (column + i) + ")");
                if(i == 4) hasWon = true;
            }
        } else if (row + 3 > Rows && column + 3 > Columns) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row - i, column - i, board)) ; i++) {
                System.out.println("Checking : (" + (row - i) + " , " + (column - i) + ")");
                if(i == 4) hasWon = true;       
            }
        }

        // Descending diagonal check
        if (row + 3 > Rows && column - 3 <= 0) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row - i, column + i, board)); i++) {
                System.out.println("Checking : (" + (row - i) + " , " + (column + i) + ")");
                if(i == 4) hasWon = true;
            }

        } else if (row - 3 <= 0 && column + 3 > Columns) {
            for(int i = 1; piece.equals((Circle)getNodeByRowColumnIndex(row + i, column - i, board)); i++) {
                System.out.println("Checking : (" + (row + i) + " , " + (column - i) + ")");
                if(i == 4) hasWon = true;
            }
        }
    }

1 Ответ

5 голосов
/ 11 марта 2020

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

Секунда. Фактическая проблема тесно связана и показывает, почему вы должны это сделать: вы хотите только сравнить цвета кругов. Не сами круги. (Я только предполагаю, что это круги JavaFX, потому что вы не показываете полный код ...) Потому что у каждого круга есть радиус и центр . И каждый центр наиболее вероятен, ваш метод equals всегда будет возвращать false.

Так что сравнивайте только цвета. Или лучше: отделить данные от представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...