JOGO DE XADREZ EM DELPHI: CAPÍTULO 2 - MOVIMENTO DE PEÇAS

Adicionado em 22/01/2023

Compartilhar em:

Bem vindo ao segundo capítulo do tutorial que ensina como criar um jogo de xadrez em Delphi.

Nessa segunda parte, ensinaremos como mover as peças no tabuleiro de xadrez. Além disso, iniciaremos com as regras de movimentação de peças. Nessa parte, ensinaremos como movimentar o cavalo.

Além disso, explicaremos passo a passo do algoritmo utilizado.

Vamos continuar utilizando o nosso tabuleiro desenvolvido na primeira parte desse tutorial (Tutorial 1)

MOVENDO PEÇAS

Quando vamos mover uma peça, pÅ•ecisamos clicar sobre ela mover para uma nova casa e soltar o mouse. Claro que existem alternativas utilizando o teclado, mas vamos focar na utilização do mouse

O processo mais complexo ocorre quando a peça é liberada após ser movida para uma nova posição.

Nesse caso, devemos calcular os seguintes aspectos:

  1. É a vez das peças brancas ou pretas de mover?
  2. Existe uma nova posição?;
  3. A posição esta vazia ou não;
  4. O movimento da peça está correto?
  5. Se a posição não estiver vazia, é possível comer a peça que está na posição?;
  6. É primeiro movimento do peão, ou roque, ou EnPassant, ou peão chegando do outro lado do tabuleiro, ou Xeque-mate, ou empate por falta de movimentos, ou empate por movimentos repetidos.

Está claro que existe muito trabalho a ser feito. Além disso, os itens 3, 4 e 5 requerem muito mais trabalho. Por isso, nesse capítulo focaremos nos itens 1, 2 e começaremos a analisar o movimento da peça do cavalo cujo movimento é um dos mais simples de ser programado.

Primeiramente, vamos capturar quando o usuário clicar sobre uma peça. Para isso, clicamos sobre nosso tabuleiro, vamos ao Object Inspector e na aba Eventos damos dois cliques sobre o evento OnMouseDown

Dentro do procedimento, adicionamos os seguintes comandos:

As variáveis Coluna, Linha e N devem ser declaradas como variáveis globais. Isso porque vamos utilizar essa variável em outros procedimentos.

A declaração de variáveis globais deve ser feita logo antes do protocolo implementation. As varíaveis Coluna, Linha e N são declaradas como Integer.

Agora vamos entender os comandos. As variáveis X e Y são intrínsecas do evento nesse procedimento. Elas trazem informação sobre a posição do mouse sobre o tabuleiro. X e Y terão valor 0 no canto superior esquerdo do tabuleiro.

Ao dividirmos por 41 (lembre-se que nosso tabuleiro tem casas com tamanho 40x40), obtemos o número inteiro (veja bem, não podemos utilizar "/" que retornaria uma variável float) que representa a posição no tabuleiro.

Nossa variável N tem somente uma função: buscar a imagem da peça dentro do nosso componente TImageList. Se você utilizou as imagens fornecidas no tutorial anterior, elas devem estar organizadas de acordo com os valores de N mostrados acima. Caso contrário, você deve verificar qual a numeração das suas imagens.

Dessa forma, o comando case irá identificar qual peça foi encontrada na posição clicada com o mouse e vai buscar a imagem correspondente.

A variável ComPeca é utilizada para verificar se existe uma peça na posição clicada. Caso não tenha, nada acontece.

O comando SetDragImage irá, como dissemos anteriormente, selecionar a peça correcta N dentro do TImageList. Por fim, o comando BeginDrag irá definir o ponto de onde a imagem começara a ser movimentada.

Durante o movimento da peça, queremos que a peça siga o mouse simulando o movimento feito com a mão em um tabuleiro real. Para isso, clicamos duas vezes no Evento OnMouseDrag dentro do Object Inspector do Tabuleiro, e adicionamos o comando:

O comando DragMove do TImageList faz com que a peça clicada siga o mouse enquanto o botão esquerdo (ou direito dependendo da sua configuração) estiver pressionado.

Após soltar o botão pressionado, temos que verificar:

  • Qual a nova posição?
  • Se é a vez das brancas ou das pretas de jogar
  • Se a nova posição está vazia (por enquanto não vamos comer peças)
  • Se o movimento do cavalo está correto (outros movimentos serão analisados em outros capítulos)

Dessa forma, no evento OnMouseUp adicionamos o seguinte código:

Vamos entender esse código. As novas linhas repetem exatamente o mesmo comando que havíamos realizado anteriormente no procedimento OnMouseDown, ou seja, pegamos a nova linha e coluna dividindo a posição do mouse por 41.

O segundo comando é para avaliar se o movimento do cavalo esta correto. Dessa forma, declaramos a variável PodeMover que pode receber as respostas True ou False (Verdadeiro ou Falso). Caso o cavalo possa mover para a nova casa, a função retonrará o valor verdadeiro para a variável PodeMover, caso contrario, retornará Falso.

Como o movimento do cavalo branco e negro é igual, utilizamos a função LowerCase (minúsculas) para transformar todas as letras das peças em minúsculas, ou seja, as peças brancas que são maiúsculas se tornarão minúsculas.

Por fim, verificamos se é a vez das brancas ou das pretas serem movidas. Utilizamos a variável booleana (True ou False) global para verificar. Se a peça sendo movida for branca (P D R B C T) e for vez da brancas (varíavel booleana _brancas é True), ou se as pretas estiverem sendo movidas (p d r b c t) e for vez das pretas (_brancas é False) o movimento é válido. Além disso, utilizamos a variável PodeMover que nos diz se o movimento da peça esta correto. Nesse caso, só verificamos para o cavalo, por isso a variável é posta como True para as outras peças.

Se o movimento for válido, então movemos a peça para a nova casa escrevendo a letra na nova casa e apagando na célula antiga. Além disso, setamos a variável _brancas para o contrário da própria variável. Ou seja, se era True será False e vice-versa.

Por fim, finalizamos o movimento da peça com a função EndDrag e repintamos o tabuleiro com Repaint para que a peça seja desenhada.

Agora, para validar o movimento do cavalo, vamos escrever a função checkMovCavalo

Assim, declaramos a função checkMovCavalo(NCol, NLinha: Integer): Boolean. Utilizamos a função booleada que indicará se o movimento é válido ou não (True or False);

Pressionamos Ctrl+Shift+C para declarar a função no corpo do código. Para o movimento do cavalo, escrevemos o seguinte código:

Como pode ser observado, o código é relativamente simples. Primeiramente, configuramos o Result da função como False, assim, podemos escrever condições inválidas condicionais e, caso elas sejam obedecidas, utilizamos o comando Exit e o resultado da função será falso (ou seja, movimento do cavalo inválido). Seguimos com a primeira ação condicional que verifica se a peça sendo analizada é um cavalo ou não. Caso não seja, utilizamos o comando Exit e o resultado da função será falso.

O segundo parâmetro utilizado é a posição da nova linha e nova coluna. Dado que o cavalo sempre tem que mudar de linha e coluna em seu movimento, se isso não ocorrer, o resultado da função será novamente falso.

Por fim, adicionamos o último condicional que verificará se o movimento do cavalo é em forma de L. O L do cavalo é sempre caracterizado ou pelo movimento de 2 colunas e uma linha, ou duas linhas e uma coluna. Se a condição é satisfeita, então o resultado da função será verdadeiro (True) e o movimento do cavalo será validado.

Até esse momomento o código deve estar similar ao seguinte:

É importante ressaltar que esse código foi desenvolvido pelos adminstradores desse site, e a utilização desse código para fins comerciais dependerá da autorização prévia dos autores do código

Por enquanto é isso pessoal. Em nosso próximo tutorial mostraremos como realizar o movimento do bispo e da torre. Espero que vocês tenham e gostado, e se tiverem qualquer dúvida, por favor, entrem em contato.

< Capítulo 1 - Capítulo 3 >