Генерация ходов и действительные ходы в шахматах - PullRequest
0 голосов
/ 11 апреля 2019

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

Например, в данном конкретном случае король находится под контролем из-за слона на с4. Чтобы выйти из-под контроля, игрок в верхнем регистре должен быть в состоянии переместить пешку в d7-d5, но все, что возвращается, это ходы королей. Возможно, в моем коде неверная логика.

    A  B  C  D  E  F  G  H  
 8  R  N  B  Q  #  B  N  R  8
 7  P  P  P  P  _  K  P  P  7
 6  #  _  #  _  #  _  #  _  6
 5  _  #  _  #  q  #  _  #  5
 4  #  _  b  _  p  _  #  _  4
 3  _  #  _  #  _  #  _  #  3
 2  p  p  p  p  #  p  p  p  2
 1  r  n  b  #  k  #  _  r  1
    A  B  C  D  E  F  G  H  

Поколение ходов во фрагменте кода игры

    ChessBoard testBoard;
    HashSet<ChessMove> initialMoves = new HashSet<>(), kingMoves;

    menu();
    Boolean inCheck = false;
    while (true) {

        testBoard = board.clone();
        initialMoves.addAll(board.generateMoves( currentPlayer ));
        initialMoves = testBoard.removeBadMoves(initialMoves, currentPlayer);
        kingMoves = testBoard.kingMoves(currentPlayer);
        initialMoves.addAll(kingMoves);
        if (inCheck) {
            if (board.checkWin(currentPlayer)) {
                System.out.println( "Checkmate!" );
                playerWins( currentPlayer );
                break;
            }
            System.out.println( "Check!" );
        }

Реализация генерации, проверки, удаления ходов и проверки игрока

HashSet<ChessMove> generateMoves(Player player) {
    HashSet<ChessMove> moves = new HashSet<>();
    if (player.getColor().equals(Colors.WHITE)) {
        for (ChessPiece each : whitePieces) {
            moves.addAll(each.addMoves(this));
        }
    } else if (player.getColor().equals(Colors.BLACK)){
        for (ChessPiece each : blackPieces) {
            moves.addAll(each.addMoves(this));
        }
    }
    return moves;
}

private boolean testMove(ChessMove each, Player player) {
    this.performMove(player, each);
    return !this.playerInCheck(player);
}
 HashSet<ChessMove> removeBadMoves(HashSet<ChessMove> moves, Player player) {
    HashSet<ChessMove> newMoves = new HashSet<>();
    for (ChessMove each : moves) {
        if (testMove(each, player)) {
            if (each.castle) {
                if (!playerInCheck(player)) {
                    newMoves.add(each);
                }
            }else{
                newMoves.add(each);
            }
        }

    }
    return newMoves;
}

Любая возможная помощь была бы фантастической, и мне жаль, если я не предоставил достаточно информации. Я рад добавить что-нибудь еще, что нужно.

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