Skip to content

Encerramento prematuro da partida sem um xeque-mate válido devido à promoção automática para rainha #7

Description

@luan-github

A promoção automática da rainha dentro da função 'performChessMove()' pode alterar as variáveis 'check' ou 'checkMate', fazendo com que o programa acuse xeque ou xeque-mate inexistentes quando o jogador promover seu peão para uma peça que não ataque o rei do oponente.

Para reproduzir o bug, basta iniciar a partida sem as peças que não são peões no lado do rei das peças negras e um peão branco na casa H7. No primeiro movimento, promova o peão branco para um bispo ou cavalo. A partida será encerrada com um xeque-mate inexistente.

Captura de tela de 2023-06-15 19-14-04

Solução sugerida: Remover o código 'promoted = replacePromotedPiece("Q");' na função 'performChessMove()' e alterar o código 'return promoted;' na função 'replacePromotedPiece()' para algo como 'throw new IllegalStateException("No valid piece for promotion was provided.");'. Em seguida atualizar os valores das variáveis 'check', 'checkMate' e 'currentPlayer' antes de finalizar a função replacePromotedPiece():

public ChessPiece replacePromotedPiece(String type) {
	if (promoted == null) {
		throw new IllegalStateException("There is no piece to be promoted");
	}
	if (!type.equals("B") && !type.equals("N") && !type.equals("R") & !type.equals("Q")) {
		throw new IllegalStateException("No valid piece for promotion was provided.");
	}

	Position pos = promoted.getChessPosition().toPosition();
	Piece p = board.removePiece(pos);
	piecesOnTheBoard.remove(p);

	ChessPiece newPiece = newPiece(type, promoted.getColor());
	board.placePiece(newPiece, pos);
	piecesOnTheBoard.add(newPiece);

	check = (testCheck(currentPlayer)) ? true : false;

	if (testCheckMate(currentPlayer)) {
		checkMate = true;
		currentPlayer = opponent(currentPlayer);
	}

	return newPiece;
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions