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

Compartilhar em:

Atualização: o código relativo ao EnPassant do peão foi atualizado. As alterações feitas foram:

  • Operador UltMov foi modificado para o tipo TMovimento. Apesar de ser apenas uma mudança que não altera muito o resultado final do código, o tipo TMovimento se torna mais completo e vai ser vastamente utilizado no capítulo do movimento do rei, e para realizar outras operações no tabuleiro. Além disso, por ser um tipo, ele pode ser redeclarado diversas vezes dentro do código.
  • Houve um pequeno erro no posicionamento da captura do EnPassant, que foi corrigida com o novo código. O EnPassant é caracterizado pela captura da peça adversária quando o adversário realiza o primeiro movimento do peão pulando duas casas, e o peão do adversário está exatamente do lado do seu peão. Nesse caso, você pode capturar a peça do adversário realizando o movimento da diagonal. Anteriormente, havíamos nos equivocado ao colocar que o seu peão estaria uma posição a frente do peão do adversário e não lado a lado.

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.

< Capítulo 4 - Capítulo 6>