JOGO DE XADREZ EM DELPHI: CAPÍTULO 5 - FINALIZANDO MOVIMENTO DO PEÃO E CAPTURA DE PEÇAS
Adicionado em 07/05/2023 - Atualizado em 01/02/2024
Atualização: o código relativo ao EnPassant do peão foi atualizado. As alterações feitas foram:
Olá pessoal, hoje iniciamos um novo tutorial para encaminhar a preparação do tabuleiro de xadrez em Delphi para a etapa final. Inicialmente, a ideia era colocar nesse capítulo todas as regras finais necessárias para finalizar o tabuleiro, no entanto, devido ao tamanho do capítulo relativo ao movimento do rei, resolvi reduzir esse capítulo para cobrir somente o movimento do peão (o qual já é complexo suficiente) e captura de peças.
Como havíamos dito anteriormente, precisamos adicionar as regras de captura de peça, a captura EnPassant do peão, e promoção do peão. Vamos começar esse capítulo descrevendo como criar as regras do EnPassant do Peão.
----------------------------------------------------
- ENPASSANT DO PEÃO
Para isso, criamos, primeiramente, o operador record com o nome TMovimento contendo informação do movimento antes e depois de ser realizado.
O operador record é muito utilizado para registrar dados que podem conter diferentes variáveis. Isso se torna muito útil para registrar os movimentos das peças no tabuleiro, atribuindo diferentes propriedades a ela, tais como posição anterior, posterior, captura, e tipo de peça. Isso também permite que possamos desfazer e refazer movimentos no tabuleiro. Isso será implementado no capítulo final.
Assim sendo, adicionamos o operador record dentro a seção private do código:
Agora, vamos criar uma variável global que vai guardar o movimento das nossas peças chamado HistoricoMovimentos e uma variável que irá conter o movimento atual chamada IndiceMovimentoAtual. Vamos adicionar também as variáveis globais EnPassant, Promocao e CapPeao do tipo booleano que serão utilizados como forma de comunicação entre a função de validação do peão e o evento TabuleiroMouseUp.
Dentro do procedimento que realiza o movimento das peças (TabuleiroMouseUp) declaramos uma variável local Movimento que vai ser do tipo TMovimento e que via guardar as informações tais como o tipo da peça que foi movida, se houve peça capturada, a origem e o destino do movimento e, por fim, se o movimento foi EnPassant.
Veja que coloquei o condicional Tabuleiro.Cells[NovaColuna,NovaLinha] = ' ' entre chaves (ou seja como comentário, sendo ignorado pelo compilador). Isso é feito pois agora começamos a trabalhar com a captura de peças e a nova casa da peça não deve estar vazia. Além disso, iniciamos a variável EnPassant como falso antes da validação do movimento do peão.
Feito isso, agora voltamos até o procedimento que valida o movimento do peão. Na parte que descreve o movimento do peão depois que o primeiro movimento já foi realizado, ou seja, quando a linha que o peão está não é a linha 6, adicione a variável local UltMov e em seguida os condicionais tal como mostrado abaixo:
Fazemos a mesma coisa para o movimento do peão preto.
Se você executar o seu jogo de Xadrez, agora será possível capturar o peão através do movimento EnPassant:
Quando retiramos a restrição de que a nova posição da peça deve estar vazia ({(Tabuleiro.Cells[NovaColuna,NovaLinha] = ' ')}), acabamos por implementar automaticamente a captura de peças da maioria das peças.
No entanto, isso não funciona com o peão, visto que o movimento do peão é para frente, e sua captura é na diagonal.
Para evitar isso, vamos fazer uma pequena modificação no procedimento de validação do movimento do peão. Aonde havíamos escrito if (Linha - NLinha > 1) or (Linha - NLinha < 0) then para as peças brancas e if (NLinha - Linha > 1) or (NLinha - Linha < 0) then para as pretas, vamos adicionar a condição (Tabuleiro.Cells[NCol,NLinha] <> ' ').
----------------------------------------------------
MOVIMENTO DE CAPTURA DO PEÃO
A captura de uma peça realizada por um peão difere das demais peças em sua abordagem. Enquanto as outras peças capturam seus alvos seguindo precisamente a direção de seus movimentos, o peão executa capturas diagonalmente enquanto avança.
Portanto, simplesmente remover a cláusula condicional {(Tabuleiro.Cells[NovaColuna, NovaLinha] = ' ')} do evento TabuleiroMouseUp não é suficiente para validar com precisão a captura de uma peça por um peão.
Para realizar essa validação de forma adequada, é necessário voltar ao código de validação do movimento do peão e fazer modificações na seção que verifica se houve uma mudança de coluna:
Veja que aqui adicionamos a variável CapPeao como verdadeira quando o peão é capturado. A variável é iniciada com valor False antes e depois do case que valida o movimento do peão no evento TabuleiroMouseUp:
----------------------------------------------------
- PROMOÇÃO DO PEÃO
Iniciamento pelo movimento do peão branco. Neste caso, não é necessário alterar a condição inicial (quando Linha = 6), pois a promoção não se aplica nessa situação. Para os demais casos, modificaremos e incluiremos o seguinte código:
Introduzimos um recurso chamado InputQuery, que cria uma janela pop-up solicitando uma entrada do usuário. Neste contexto, o usuário deve inserir a letra que representa a peça para a qual deseja promover o peão. Se uma letra incorreta for digitada, a janela será exibida repetidamente até que a entrada correta seja fornecida.
Uma vez que a letra correta é inserida, procedemos com a substituição da representação do peão pela da nova peça escolhida. Importante notar que, neste processo, utilizamos as variáveis Coluna e Linha em vez de NCol e NLinha. A escolha dessas variáveis é estratégica para evitar conflitos no evento TabuleiroMouseUp. Neste evento, o movimento do jogo atualiza a nova posição com a letra da posição anterior. Se NCol e NLinha fossem usadas, esse processo interferiria na promoção do peão, substituindo a nova peça promovida. Ao usar Coluna e Linha, evitamos essa sobreposição indesejada.
No evento do TabuleiroMouseUp temos que adicionar o registro do movimento de promoção da seguinte forma:
Este procedimento é replicado para o peão preto. Após a compilação, seu jogo deve apresentar a seguinte aparência:
Com isso finalizamos este capítulo com os movimentos de captura, e finalizando os movimentos do peão.
No nosso próximo, finalizaremos o nosso tutorial com os movimentos do rei e as condições de vitória.