Dando as cartas
Como fazer jogos de baralho no Delphi

Um dos tipos de jogos mais jogados (e, no entanto, um dos menos discutidos), os jogos de baralho certamente representam uma área de conhecimento obscura dentro do cenário de desenvolvimento de jogos.

Para resolver alguns desses problemas, o club TILT está disponibilizando um conjunto de componentes para o desenvolvimento de jogos de baralho, no estilo daqueles que acompanham o Windows.

Alternativas

Os componentes usados nesse artigo são de autoria de Giulio Ferrari e são distribuídos gratuitamente. Além desses componentes, pode-se também utilizar as funções da biblioteca cards.dll, que é uma biblioteca padrão do windows.

Porém, os componentes de Ferrari são mais simples de usar e o resultado é indistinguível daqueles produzidos pelas funções da cards.dll.

Baralho e Cartas

O primeiro componente usado na criação desse jogo será o TDeck. Ele representa um baralho, contendo 52 cartas de 4 naipes (suits) e 13 valores (values) diferentes (lembrando-se de que as cartas Valete, Rainha e Rei valem respectivamente 11, 12 e 13 e o Ás vale 1).

Para criar um baralho, basta criar um objeto desse tipo, passando como parâmetros um formulário e a posição onde o baralho deve se encontrar. Pegar uma carta do topo do baralho também é igualmente simples: basta chamar a função getNextCard passando como parâmetro uma variável do tipo TCard.

Essa classe de objetos é descendente de TGraphicControl, o que significa que ela é responsável por sua própria renderização; não é preciso nenhum código por parte do programador!

Os principais elementos dessa classe são: "value" que contém o valor (de 1 à 13) da carta, "suit" que indica o naipe da carta (respectivamente espadas, ouros, paus e copas) e, finalmente, showDeck que indica se o valor da carta está sendo mostrada (valor false) ou se é o baralho (valor true).

O Jogo

Para demonstrar como utilizar esses componentes, um pequeno jogo será criado. Ele consiste em uma rodada de truco simplificado: O jogador e o computador retiram três cartas do baralho (cada), Em seguida, o jogador coloca uma carta "na mesa", seguido pelo computador. Aquele com a maior carta ganha um ponto, e quem obtiver mais pontos (dentro da rodada), ganha o jogo.

O primeiro passo do jogo é embaralhar as cartas, limpar a "mesa" de jogo, selecionar as cartas do jogador e do computador e zerar as variáveis de pontuação. Pegar uma carta (para o jogador) consiste em chamar o método getNextCard do baralho (que retorna a carta no topo do baralho), colocá-la na posição adequada (alterando as propriedades left e top), indicar que esta carta deve ser mostrada e colocar o evento onClick da carta para um método do formulário principal que fará uma jogada quando a carta for clicada. Simplificadamente:

baralho.GetNextCard(jc1);
jc1.Left:= 170;
jc1.top:= 256;
jc1.ShowDeck:= false;
jc1.OnClick:= onCartaJogClick;

O código para as cartas do computador é ainda mais simples: basta pegar a próxima carta do baralho e colocá-la na posição desejada.

O próximo passo para o jogo é responder ao evento onClick das cartas do jogador, o que será feito dentro do método onCartaJogClick. Dentro desse método, a carta selecionada é movida para o meio da mesa, essa carta é definida como a carta selecionada pelo jogador (que será usada para a decisão de qual carta o computador irá jogar) e, finalmente, a rotina de decisão do computador é chamada.

Esse é o método que faz a maior parte do processamento do jogo. Em primeiro lugar, o computador decide qual carta jogar baseado-se no pequeno algoritmo abaixo:

1- Se uma das cartas do computador é maior que a carta selecionada, jogar essa carta.

2- Senão, jogar uma carta aleatória.

Esse algoritmo é implementando como uma série de "ifs", encadeados, que testam essas condições para a primeira, a segunda e a terceira carta.

Depois de decidida qual carta será jogada, ela é movida para o meio da mesa e eliminada da "mão" do computador.

Finalmente, após a efetuada a jogada, a condição de vitória é testada: se a do jogador é maior, ele ganha um ponto. Se a do computador é maior ele ganha um ponto. E em caso de empate, ambos ganham um ponto.

Quando um dos jogadores obtiver 2 pontos de vantagem sobre o outro, ou quando o número de rodadas terminar, uma vitória (do jogador ou computador) ou empate é declarado.

Finalizando

Embora o jogo criado seja bem simples, ele demonstra todos os conceitos envolvidos na criação de um jogo de baralho comum: embaralhamento, posicionamento e seleção de cartas.

Algumas melhorias que podem ser adicionadas: transformar o jogo em uma partida de truco completa (levando em consideração as cartas especiais), armazenar uma pontuação através das partidas ou melhorar o algoritmo de decisão do computador.

Até mais, e boa programação!


Download...
Clique no link para fazer o download dos arquivos. Se sua assinatura do club TILT está para vencer, clique aqui e saiba como renová-la.

Fontes completos do exemplo da matéria
 
online