Jump to content

Ping pong, está me a dar erro no último end


Recommended Posts

anonimo1337
Program ping_pong ;

const cantoCima = 2 ;
cantoBaixo = 10 ;
cantoEsquerda = 2 ;
cantoDireita = 38 ;

var
bolaX, bolaY: integer; // posicao x, y da bola
raquete1X, raquete1Y: integer; // posicao x, y da raquete 1
raquete2X, raquete2Y: integer; // posicao x, y da raquete 2
moveBolaDireita, moveBolaBaixo: boolean ; // controla direcao da bola
pontos: integer;
acabouJogo: boolean ;
menu1:real;
nome1, nome2:string;
moveuRaquete : boolean ;
resp : char ;
procedure DesenhaCampo;
procedure moveBola ;
procedure moveRaquetes ;
procedure VerificaChoqueRaquete ;
procedure iniciaJogo ;
procedure VerificaFimJogo;


Procedure menuin;                                                //Interface do Menu
Begin
  clrscr;
  Writeln;
  Writeln;
  writeln('     ----------- ');
  Writeln('       1-Jogar   ');
  writeln('     ----------- ');
  writeln;
  Writeln;
  writeln('    ---------------- ');
  Writeln('     2-como jogar    ');
  writeln('    ---------------- ');
  Writeln;
  Writeln;
  writeln;
  writeln('    ---------- ');
  Writeln('     3-Sair    ');
  writeln('    ---------- ');
  Writeln;
  menu1:=4
End;

//Ecrã Inicial
Begin
  textcolor (Red);
  Writeln ('            - - - --- -´~~~~           ');
  Writeln ('          ,´                `,         ');
  Writeln ('         (                     ,        ');
  Writeln ('        (                       )       ');
  Writeln ('       {            ---          )      ');
  Writeln ('      {            /  /           )                 _ _ _ _ _ _ _ _ _ _ _ _  ');
  Writeln ('      |            ---            |                |                       | ');
  Writeln ('      |                           |                |       Ping Pong       | ');
  Writeln ('      |                           |                |_ _ _ _ _ _ _ _ _ _ _ _| ');
  Writeln ('      \                           /     ');
  Writeln ('       \                         /      ');
  Writeln ('        - - -´~~~~     - - -´~~~~       ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |     |                ');
  Writeln ('                 |_____|                ');
  Textcolor (Black);
  Textbackground (White);
  Writeln('   ----------------------------------------------   ');
  Writeln('   |  Insira o nome dos 2 jogadores para jogar  |   ');
  Writeln('   ----------------------------------------------   ');
  Textcolor (red );
  Textbackground (Black);
  Readln(nome1);
  Readln(nome2);
  menuin;
  Repeat
    Readln(menu1);
    If menu1=1 then
    
    
    // Começa o jogo
    
    
    //----------------------------------------------------------------
    // Desenha o campo do pong
    //----------------------------------------------------------------
    
    
    begin
      textcolor(white);
      gotoxy(1,1);
      writeln(#201,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#203,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#187);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#186,'                  ',#176,'                  ',#186);
      writeln(#200,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#202,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#205,#188);
      writeln('');
      writeln;
      if(pontos <> 0) then writeln('Pontos: ', pontos);
      
    end;
    
    
    
    
    //----------------------------------------------------------------
    // Move a bola pelo campo
    //----------------------------------------------------------------
    
    Begin
      // Move a bola na horizontal
      if (moveBolaDireita) then
      bolaX:= bolaX + 1
      else
      bolaX:= bolaX - 1;
      
      // Move a bola na vertical
      if (moveBolaBaixo) then
      bolaY:= bolaY + 1
      else
      bolaY:= bolaY - 1;
      
      // Se a bola bateu em cima ou embaixo do campo inverte sua direcao
      if (bolaY = cantoBaixo) or (bolaY = cantoCima) then
      moveBolaBaixo := not moveBolaBaixo ;
      
      // Desenha a bola na sua nova posicao
      gotoxy(bolaX,bolaY);
      write(#219);
    End ;
    
    
    
    //----------------------------------------------------------------
    // Move as raquetes
    //----------------------------------------------------------------
    
    
    Begin
      // Verifica se alguma raquete se moveu
      while keypressed do
      begin
        case readkey of
          // Seta para cima: move a raquete 1 para cima
          #72: if (raquete1Y > cantoCima+1) then
          raquete1Y:= raquete1Y - 1;
          
          // Seta para baixo: move a raquete 1 para baixo
          #80:    if (raquete1Y < cantoBaixo) then
          raquete1Y:= raquete1Y + 1;
          
          // Numero 8: move a raquete 2 para cima
          '8': if (raquete2Y > cantoCima+1) then
          raquete2Y:= raquete2Y - 1;
          
          // Numero 2: move a raquete 2 para baixo
          '2':    if (raquete2Y < cantoBaixo) then
          raquete2Y:= raquete2Y + 1;
        end;
      end ;
      
      // Desenha a raquete 1
      textcolor (lightred);
      gotoxy(raquete1X,raquete1Y);
      write(#219);
      gotoxy(raquete1X,raquete1Y -1);
      write(#219);
      
      // Desenha a raquete 2
      textcolor(lightblue);
      gotoxy(raquete2X,raquete2Y);
      write(#219);
      gotoxy(raquete2X,raquete2Y -1);
      write(#219) ;
    End;
    
    
    //----------------------------------------------------------------
    // Verifica se a bola bateu em alguma raquete
    //----------------------------------------------------------------
    
    Begin
      // Se a bola bateu na raquete 1 joga ela para direita
      if (bolaX = raquete1X+1) then
      if (bolaY = raquete1Y) or (bolaY = raquete1Y-1) then
      begin
        moveBolaDireita := true ;
        pontos:= pontos + 1;
      end;
      
      // Se a bola bateu na raquete 2 joga ela para esquerda
      if (bolaX = raquete2X-1) then
      if (bolaY = raquete2Y) or (bolaY = raquete2Y-1) then
      begin
        moveBolaDireita := false ;
        pontos := pontos + 1;
      end;
    End;
    
    
    //----------------------------------------------------------------
    // Inicia o jogo
    //----------------------------------------------------------------
    
    Begin
      randomize;
      
      // Determina posicao inicial da bola
      bolaX:= 20;
      bolaY:= random(cantoBaixo-2) + 2;
      
      // Determina para que lado a começa a se mover
      moveBolaBaixo := true ;
      if(random(2) = 1) then
      moveBolaDireita := true
      else
      moveBolaDireita := false ;
      
      // Determina posicao inicial da raquete 1
      raquete1X:= cantoEsquerda;
      raquete1Y:= (cantoCima+cantoBaixo) div 2 ;
      
      // Determina posicao inicial da raquete 2
      raquete2X:= cantoDireita;
      raquete2Y:= (cantoCima+cantoBaixo) div 2 ;
      pontos := 0;
      
      // inicializacao do jogo
      acabouJogo := false ;
      clrscr;
    End;
    
    
    
    //----------------------------------------------------------------
    // Fim do jogo: a bola passou por uma das raquetes
    //----------------------------------------------------------------
    
    
    Begin
      // Se a bola nao bateu no canto do tabuleiro sai do procedure
      if(bolaX <> cantoEsquerda-1) and (bolaX <> cantoDireita+1) then
      exit ;
      
      // Mostra qual jogador venceu o jogo
      textcolor(white);
      gotoxy(41,3);
      if (bolaX < cantoEsquerda) then
      writeln('Vencedor: Jogador 2')
      else
      writeln('Vencedor: Jogador 1');
      
      // Pergunta se quer continuar jogando
      gotoxy(41,5);
      write('Digite <ENTER> para parar...');
      gotoxy(41,7);
      write('Pressione outra tecla para jogar...');
      resp := upcase(readkey);
        
        // Se a resposta é não, termina o programa
        if (resp= #13) then
        Begin
          acabouJogo := true ;
          exit ;
        End ;
        
        // Se a resposta é sim, reinicia o jogo
        iniciaJogo ;
      End ;
      
      
      
      //----------------------------------------------------------------
      // Inicio do programa
      //----------------------------------------------------------------
      Begin
        // Desenha o campo de jogo, de fundo verde
        textbackground(green);
        clrscr;
        DesenhaCampo;
        writeln('=> Pressione uma tecla para iniciar o jogo');
        readkey ;
        
        // Roda o jogo
        iniciaJogo ;
        while not acabouJogo do
        begin
          delay(150);
          DesenhaCampo;
          moveBola ;
          moveRaquetes ;
          VerificaChoqueRaquete ;
          VerificaFimJogo ;
        end;
      End;
      
      
      
      
      
      
      
      
      
      //Tela ao sair do Jogo
      
      if menu1=3 then
      
      Begin
        clrscr;
        Writeln;
        Textcolor (red);
        Writeln('   ----------------------------------------------   ');
        Writeln('                Obrigado por jogar!                 ');
        Writeln('   ----------------------------------------------   ');
        Writeln;
        Writeln;
        Writeln;
        Writeln;
        Textcolor (red);
        Writeln ('             - - - --- -´~~~~           ');
        Writeln ('          , ´                `,         ');
        Writeln ('         (                     ,        ');
        Writeln ('        (                       )       ');
        Writeln ('       {            ---          )      ');
        Writeln ('      {            /  /           )     ');
        Writeln ('      |            ---            |     ');
        Writeln ('      |                           |     ');
        Writeln ('      \                           /     ');
        Writeln ('       \                         /      ');
        Writeln ('        - - -´~~~~     - - -´~~~~       ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |     |                ');
        Writeln ('                 |_____|                ');
        Writeln;
        Writeln;
        Writeln;
        Writeln;
        Writeln;
        
      End
      
      
      //Instruções
      else
      if menu1=2 then
      Begin
        clrscr;
        Textcolor (11);
        Writeln;
        Writeln(' Se é o jogador 1, mova a raquete com as setas do lado esquerdo e direito (<--- --->)  ');
        
        Writeln(' Se é o jogador 2, mova a raquete com o "A" e o "D" ');
        
        Writeln(' O jogo vai até aos 10 pontos ');
        Writeln;
        Writeln(' Quem fizer mais pontos ganha!  ');
        Writeln;
        Writeln;
        writeln;
        writeln('  -----------------------------   ');
        writeln(' | Boa Sorte e boas raquetadas!| ');
        writeln('  -----------------------------   ');
        
        Textcolor (red);
        Writeln('Pressione esc para voltar ao Menu');
        Readkey;
        menuin;
      End
      Else
      Writeln('Opção inválida');
    Until ((menu1=1) or (menu1=2) or (menu1=3));
    //Fim do Programa
  end;
  
  
end.

Está me a dar erro no ultimo end.

 

 

Edited by nunopicado
Syntax Highlight
Link to post
Share on other sites
passarito

No último Else coloca um end; depois da acção (writeln...)

editado: se calhar é melhor 2 end;

Por outro lado nunca usei begin...end no meio de um programa sem um if, for ou while antes. Apenas no corpo principal do programa ou da unit. Mas isso devo ser eu que estou muito desatualizado :)

Edited by passarito
Link to post
Share on other sites
nunopicado

O penúltimo end está a mais.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to post
Share on other sites
nunopicado
21 minutos atrás, anonimo1337 disse:

Se puser o if em que sentido vou usar o if?

@passarito

Continua a dar erro @nunopicado

Tens de terminar os procedimentos que tens em cima declarados:

procedure DesenhaCampo;
procedure moveBola ;
procedure moveRaquetes ;
procedure VerificaChoqueRaquete ;
procedure iniciaJogo ;
procedure VerificaFimJogo;

 

 

O que o passarito quer dizer não é para meteres ifs, é que não precisas usar begin/end no meio do código como tens. 

Mas ainda que seja estranho e desnecessário, não é esse o problema. 

Mete o código dos procedimentos, remove o End a mais, e o código pelo menos já compila. 

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to post
Share on other sites
nunopicado
2 minutos atrás, anonimo1337 disse:

E como é que termino os procedures?

Tenho de perguntar: O  código é teu, ou copiaste de algum lado?
Tens um procedimento completo, o MenuIn, pelo que se o código for teu, a pergunta "como termino os procedures" não faz grande sentido.

Agora, olhando para o código, os tais begin...end que o @passarito mencionou estão precedidos por comentários que fazem pensar que esses begin...end (e o código dentro de cada um desses conjuntos é na verdade a continuação dos procedimentos que estão em cima, e que estão com falta exactamente de um begin...end e o respectivo código dentro de cada um desses conjuntos; o que faz pensar que esse código está fora do sítio

A minha sugestão é que indentes corretamente o código, olhes para ele e verifiques o final dos procedimentos. Procura entender o código que tens, e volta com perguntas concretas, caso as tenhas. No momento, dá ideia que pegaste num código sem olhar para ele, tentaste compilar e não funcionou.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.