Teste a sua pontaria
Comece sempre pelos jogos mais simples

Você é bom de mira? Então que tal testar o seu desempenho num painel igual a este aí em baixo?. Ao "Iniciar" uma partida, uma barra irá subir, bem devagar, no canto esquerdo do painel. Quando ela estiver no mesmo nível que o alvo (à direita) clique no botão "Alvo". É só isso. Se acertar bem no meio do dito cujo, um ponto. Se passar perto, ou apenas "raspar"... Dançou.

Mas aí você vai dizer: "pô, esse jogo é muito simples... qualquer um faz...". Será que faz mesmo? Bem, o propósito aqui é mostrar passo-a-passo como fazer um joguinho bem simplezinho. Tente acertar o alvo algumas vezes e em pouco tempo você irá perceber que, até que para um jogo simples, ele está conseguindo prender a sua atenção.

E se você é daqueles que não acerta muito, então depois de um tempo já estará começando a se sentir "desafiado" pela máquina e querendo provar o quanto é melhor que ela. Lembre-se: nosso jogo não tem nenhum mistério. Tudo está na cabeça do jogador.

Vamos ao jogo propriamente dito. Para montá-lo, via Delphi, não há necessidade de nenhum elemento gráfico.

O primeiro passo é criar um TPaintBox (System) mais ou menos do tamanho do formulário. Uns 300 x 200 pixels já é de bom tamanho. Chamei esse objeto de 'Area', pois será a área onde a barra irá se deslocar.

TPaintBox:
   Height:= 200
   Left:= 100
   Name:= Area
   Top:= 10
   Width:= 300

A seguir, crie um TTimer (System). Coloque a propriedade Enabled em False. É esse Timer quem irá comandar a parte central do jogo. Crie dois TSpeedButton (Additional), um chamado btAlvo e o outro btInic. Crie também dois TLabels (Standard), um chamado Placar e outro Mensag. E finalmente crie um TLabel chamado Alvo e coloque como:

TTimer:
   Enabled:= False
   Interval:= 10

TSpeedButton:
  Caption:= Alvo

  Height:= 16

  Left:= 5

  Name:= btAlvo

  Top:= 190

  Width:= 40

TSpeedButton:
  Caption:= Inic

  Height:= 16

  Left:= 50

  Name:= btInic

  Top:= 190

  Width:= 40

TLabel:
  Left:= 100

  Name:= Mensag

  Top:= 220

TLabel:
  Left:= 100

  Name:= Placar

  Top:= 245

TLabel:
  Caption:= ]

  Left:= 390

  Name:= Alvo

  Top:= 95

O próximo passo é criar as variáveis globais que serão usadas pelo sistema:
 


var
  Form1: TForm1;
  JPx,JPy: integer; 
{Coordenadas da barra preta}
  Status: byte;      {Status de funcionamento}
  Contador: integer; {Conta as partidas}
  Acertou: integer;  {Quantas vezes acertou}

Vamos criar uma procedure para inicializar a partida e começar a impressão da barra.
 


procedure PreparaJogo;
begin
   with Form1 do begin
   JPx:= 0;             
{Coluna 0}
   JPy:= Area.Height-2; {Última linha da Area de jogo}
   Status:= 0;          {0 = O jogo pode começar}
   Timer1.Enabled:= True;  {Ativa o Timer}
   Area.Canvas.Pen.Color:= clSilver;    {Cor da tinta}
   Area.Canvas.Brush.Color:= clSilver;  {Cor do papel}
   {Apaga toda a área do jogo}
   Area.Canvas.Rectangle(0,0,Area.Width,Area.Height);
   Area.Canvas.Pen.Color:= clBlack;
   Area.Canvas.Brush.Color:= clBlack;
  
{Imprime o primeiro ponto da barra (4 x 4 pixels)}
   Area.Canvas.Rectangle(JPx,JPy,JPx+4,JPy+2);
  
{Sorteia uma posição aleatória para o Alvo}
   Alvo.Top:= 20 + Random(Area.Height - 40);
   Mensag.Caption:= 'Subindo...';
{Começando...}
   inc(Contador);   {Mais uma jogada}
  
end;
end;

Agora é só colocar o evento OnClick no botão btInic
 


begin
   PreparaJogo;
end;

O botão btAlvo também tem um evento OnClick. Ele serve para avisar ao sistema que o jogador "disparou" a barra:
 


begin
   Status:= 1;  
{Ok, disparou}
end;

Só falta criar o controle principal do jogo, que estará no evento OnTimer do Timer1:
 


begin
   if Status = 2 then begin 
{Se acabou o disparo...}
      if (JPy < Alvo.Top-Area.Top+4)
     
{Se a barra estiver acima do alvo}
      or (JPy > Alvo.Top-Area.Top+8) then
     
{ou se ela estiver abaixo, então...}
         Mensag.Caption:= 'Errrroooouuuuu!!!!!!'
         else begin;
        
{caso contrário}
            Mensag.Caption:= 'Na mosca!';
            inc(Acertou);  
{Mais um acerto}
            end;
      Placar.Caption:= 'De '+IntToStr(Contador)+
         ', acertou '+IntToStr(Acertou);
     
{Monta o placar}
      Timer1.Enabled:= False; end; {Desliga o Timer}
   if Status = 0 then JPy:= JPy - 2;
  
{Se está subindo, suba mais 2 pixels}
   if Status = 1 then JPx:= JPx + 6;
  
{Se indo em direção ao alvo ande mais 6 pixels}
   if Status <> 2 then begin
  
{Se não estiver parado, faça um ponto da barra}
      Area.Canvas.Brush.Color:= clBlack;
      Area.Canvas.Rectangle(JPx,JPy,JPx+6,JPy+6); end;
   if JPx > Area.Width - 8 then Status:= 2;
  
{Se chegou no canto da área, acabou a partida}
end;

Viu só como é simples? Agora basta testar para ver se não há nenhum erro de digitação. Partindo deste ponto, voce poderá criar implementos, como sons, cores e, quem sabe até, sofisticar mais o jogo com elementos gráficos e mensagens diferentes. A imaginação é seu único limite.


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