Faltando uma condição na regra de Roque
Uma das regras para determinar se o Roque é possível é que a casa que o Rei "pula" ao realizar o roque, isto é, a casa que a torre vai parar, não pode estar sob ataque de peças adversárias. No código atual, essa jogada é permitida, desrespeitando esta regra.
Uma das regras para determinar se o Roque é possível é que a casa que o Rei "pula" ao realizar o roque, isto é, a casa que a torre vai parar, não pode estar sob ataque de peças adversárias. No código atual, essa jogada é permitida, desrespeitando esta regra.
Problema resolvido!
Fiz um fork para consertar essa questão, basta clicar aqui pra ver minha solução
O que eu fiz foi criar um novo método que testasse se o roque feito passou ou não passou por uma casa atacada por uma peça inimiga:
private boolean testIllegalCastling(Position source, Position target) {
ChessPiece movedPiece = (ChessPiece)board.piece(target);
boolean isIllegal = false;
// position in-between
Position inbet = new Position(source.getRow(),
(source.getColumn()>target.getColumn()) ? source.getColumn() - 1 : target.getColumn() - 1);
// identifies if a king has moved
if (movedPiece instanceof King) {
// indentifies if a king has castled, once it moved two squares away
if (Math.abs(source.getColumn() - target.getColumn()) == 2) {
// checks if the position passed through by the king is attacked
Piece capturedPiece = makeMove(target, inbet);
if (testCheck(currentPlayer)) {
isIllegal = true;
}
undoMove(target, inbet, capturedPiece);
}
}
return isIllegal;
Esse método eu incluí como um segundo parâmetro na parte onde o método performChessMove() valida o lance, verificando se o rei está em xeque ou não:
...
if (testCheck(currentPlayer) || testIllegalCastling(source, target)) {
undoMove(source, target, capturedPiece);
throw new ChessException("You can't put yourself in check");
}
...
Eis aí o resultado!
