quarta-feira, 2 de janeiro de 2013

Procedures utilitárias

Existem diversas procedures utilitárias no Mina 2 que serão analisadas nesta postagem.

A procedure informa escreve no topo da tela o tempo restante e qual jogador está vencendo. Nas laterais são escritos os nomes e pontos dos jogadores de acordo com a cor de cada jogador como pode ser visto nesta imagem.


Os nomes e os pontos dos jogadores estão armazenados no vetor "extrainfo[]". Este é o código da procedure informa:
procedure informa;
var ind,col:integer;
begin
 for ind:=1 to qjog do   {nome e ponto do jog}
  begin
    apagalinha(5);
    textcolor(jog[ind].cor);
    if ind=1 then
       col:=67
    else
       col:=3;
    gotoxy(col,10);
    write(extrainfo[ind].nome);
    gotoxy(col+2,12);
    write(extrainfo[ind].score:3);
  end;
  textcolor(15);
  if qjog=2 then
    if extrainfo[1].score = extrainfo[2].score then
       msg('     Empate')
    else
     begin
       if extrainfo[1].score > extrainfo[2].score then
          ind:=1
       else
          ind:=2;
       msg(extrainfo[ind].nome + ' esta vencendo.');
     end;
  gotoxy(35,3);
  textcolor(15);
  if tempo<=10 then textcolor(15+blink);
  write('TEMPO: ',tempo:2);
end;

Existe outra procedure chamada mostra que é responsável por exibir na tela os caracteres que representam os jogadores e seus objetos, além das bolas que ameaçam os jogadores. Esta procedure e a procedure informa são chamadas a partir da procedure jogo.

As informações necessárias para a exibição de todos os itens estão nos vetores "jog[]", "obj[]" e "bola[]". Estes vetores são do tipo "geral" como pode ser visto na postagem Definição das variáveis.
procedure mostra;
var ind:integer;
begin
  for ind:=1 to qjog do
    begin
      textcolor(jog[ind].cor);

      gotoxy(obj[ind].col + difcol, obj[ind].lin + diflin);
      write(chr(obj[ind].cara));

      gotoxy(jog[ind].col + difcol, jog[ind].lin + diflin);
      write(chr(jog[ind].cara));
    end;

  if qbola > 0 then
   for ind:= 1 to qbola do
    begin
      textcolor(15); {branco}
      gotoxy(bola[ind].col + difcol, bola[ind].lin + diflin);
      write('0');
    end;
end;

A procedure inicia procura uma posição aleatória na fase que não contenha um bloco. Esta procedure utiliza passagem de parâmetros por referência. Isto é feito usando a palavra "var" na frente dos nomes dos parâmetros. Na passagem por referência, as variáveis originais que foram passadas para a procedure tem os seus valores modificados.
procedure inicia(var nlin, ncol:integer);
begin
   repeat
     nlin := random( altura ) + 1;
     ncol := random( largura) + 1;
   until mapa[ nlin, ncol ] = 0;
end;

A procedure morte é chamada quando ocorre algum tipo de colisão do jogador. Ela desenha um "*" na posição atual do jogador e exibe uma mensagem no topo da tela com o nome do jogador que explodiu. Depois faz uma pequena pausa e subtrai 5 pontos do jogador.
procedure morte(x:integer);
begin
  apagalinha(5);
  sound(50);
  textcolor(jog[x].cor);
  gotoxy(jog[x].col + difcol, jog[x].lin + diflin);
  write('*');
  msg(extrainfo[x].nome + ' explodiu.');
  delay(300);
  nosound;
  delay(400);
  apagalinha(5);
  extrainfo[x].score := extrainfo[x].score - 5;
  jog[x].direcao := 0;
end;