Так что я работал над шахматной игрой, и каждая шахматная фигура генерирует правильные наборы ходов, но когда я пробегаю игру, в конечном итоге это удаляет неправильные ходы.
Например, в данном конкретном случае король находится под контролем из-за слона на с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;
}
Любая возможная помощь была бы фантастической, и мне жаль, если я не предоставил достаточно информации. Я рад добавить что-нибудь еще, что нужно.