segunda-feira, 10 de dezembro de 2012

Procedure tela

A Procedure tela é responsável por desenhar a tela relacionada a fase que o jogador escolheu e inicializar todos os itens desta fase. Esta procedure é executada apenas uma vez antes de começar uma partida.

O código desta procedure é extenso mas é simples. As ações que são executadas dentro desta procedure são as seguintes:
procedure tela;
var i:integer;
    s,strfase:string;
begin
    { Inicia dados dos jogadores... }

    { Inicia dados das bolas... }

    { Limpa a matriz mapa que representa a fase atual... }

    { Preenche as bordas da fase na matriz mapa... }

    { Preenche a matriz mapa de acordo com a fase escolhida... }

    { Desenha a fase de acordo com os valores da matriz mapa... }

    { Inicia as minas da fase... }

    { Inicia os objetos que os jogadores tem de pegar... }

    { Monta a string de Recorde e exibe no topo da tela... }

end;

O código abaixo inicia os dados do jogador. Lembre-se que as variáveis "jog" e "obj" são arrays de duas posições do tipo "geral". O tipo "geral" é definido no início do programa e possui as variáveis col, lin, cara, cor e direcao
  for i:= 1 to qjog do
    begin
      jog[i].cara:=2;
      jog[i].direcao:=0;
      extrainfo[i].score:=0;
      if i = 1 then
        begin
          jog[i].col:=28;
          jog[i].lin:=11;
          jog[i].cor:=10;
          obj[i].cara:=4;
          obj[i].cor:=10;
        end
      else
        begin
          jog[i].col:=23;
          jog[i].lin:=7;
          jog[i].cor:=14;
          obj[i].cara:=6;
          obj[i].cor:=14;
        end;
    end;

As variáveis lin e col definem a posição na área do jogo. A variável direcao pode conter os valores de 0 a 4, sendo que 0 (zero) significa que o jogador está parado e os outros valores indicam a direção atual que o jogador está se movendo.

A variável cara contém o valor ASCII do símbolo que deve ser desenhado na tela. Os valores utilizados no Mina 2 são:
☻ (ASCII = 2), ♦ (ASCII = 4) e ♠ (ASCII = 6)

O 1º jogador utiliza a cor verde claro (valor = 10) e o 2º jogador utiliza a cor amarelo (valor = 14). A cor também é usada nos objetos que os jogadores devem pegar.


Em relação as bolas do jogo, elas iniciam em posições predeterminadas na área de jogo mas com um pequeno ajuste aleatório que é obtido usando a função "random()".

A função "random()" recebe como parâmetro um valor inteiro X e retorna um valor aleatório que vai de 0 até X-1. Por exemplo, random(3) pode retornar os valores 0, 1 ou 2.

O trecho de código abaixo mostra como é definida a posição da 1ª bola na área de jogo. As outras bolas são feitas de forma semelhante.
  if qbola > 0 then
    for i:= 1 to qbola do
     begin
      case i of
        1: begin
             bola[i].col:=3+random(3);
             bola[i].lin:=2+random(3);
             bola[i].direcao:=2;
           end;

    ...

Esta imagem mostra como ficaram as posições iniciais das 8 bolas na fase 2.


A matriz mapa[lin,col] guarda o valor "1" para as posições da fase que contém um bloco. Todas as fases possuem o mesmo tipo de borda feito com os blocos. A parte interior da área do jogo é preenchida de acordo com a fase escolhida.

O código abaixo mostra o algoritmo de preenchimento das fases de 2 a 5. A fase 1 não está presente porque não existe nenhum bloco na área central da fase 1.

Por exemplo, a fase 2 que está na imagem acima consiste apenas das bordas e de uma linha central que inicia na posição (lin=9, col=12) e vai até a posição (lin=9, col=39) da matriz mapa.
  case fase of
       2: for i:= 12 to 39 do
              mapa[9,i]:=1;
       3: for i:= 5 to 13 do
            begin
              mapa[i,15]:=1;
              mapa[i,36]:=1;
            end;
       4: for i:= 12 to 39 do
            begin
              mapa[5,i]:=1;
              mapa[13,i]:=1;
              if (i=25) or (i=26) then
                begin
                  mapa[8,i]:=1;
                  mapa[9,i]:=1;
                  mapa[10,i]:=1;
                end;
            end;
       5: begin
            i:=12;
            repeat
              if(odd(i)) then
                for j:=4 to 12 do
                  mapa[j,i]:=1
              else
                for j:=6 to 14 do
                  mapa[j,i]:=1;
              i:=i+9;
            until i>39;
          end;
  end;

O código que desenha os blocos na tela baseado nos valores da matriz mapa é o seguinte:
  textcolor(12);   {cor vermelha}
  for i:= 1 to altura do
    for j:= 1 to largura do
      if mapa[i,j]=1 then
        begin
          gotoxy(j+difcol,i+diflin);
          write('█');
        end;

As diferenças entre as coordenadas da área do jogo e as coordenadas da tela estão definidas nas constantes "diflin = 6" e "difcol = 15", sendo assim a posição (1,1) da matriz mapa será desenhada na coordenada de tela (7,16).

Todas as variáveis que definem as posições do jogador, objetos e bolas, são referentes a posição dentro da área de jogo. Para encontrar a posição real de tela onde serão desenhados esses itens é preciso adicionar os valores das constantes diflin e difcol.