chess-system-java icon indicating copy to clipboard operation
chess-system-java copied to clipboard

Faltando uma condição na regra de Roque

Open it-jhack opened this issue 4 years ago • 1 comments

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.

it-jhack avatar Feb 24 '21 12:02 it-jhack

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!

chess1 chess2 chess3

joaofilipecs avatar Jul 22 '21 21:07 joaofilipecs