Jump to content

Carro a mover-se através das setas (algo está errado mas eu não estou a encontrar)


goncalopereira12

Recommended Posts

var coluna, readkey: integer ;

var coluna, readkey: integer ;
var Gasoleo, KMINICIAL, KMFINAL, sub: Real;

 Begin
    for coluna:= 5 to 50 do
    Begin
       clrscr ;
       gotoxy( 1, 2 );
       writeln( 'Bruum... Pressione uma tecla para parar...' );
       gotoxy( coluna, 7 );
       writeln( '  - ', #177, #177, #177, #177, #177, #177  );
       gotoxy( coluna, 8 );
       writeln( '- - ', #177, #177,  #177, #177, '  ', #177  );
       gotoxy( coluna, 9 );
       writeln( '- - ', #177, #177, #177, #177, #177, #177, #177, #177 );
       gotoxy( coluna, 10 );
       writeln( '    o     o' );
       writeln( '--------------------------------------------------------------');
       delay( 400 );
       if(keypressed ) then break ;
       repeat
 tecla:=readkey;
 tecla:=upcase (tecla);
 case tecla of
 #80 :down;
 #72 :up;
 #77:right;
 #75 :left;
 
 
     End ;
     
   
     
     
  End.  

Estou ainda a começar mas não estou a conseguir resolver este problema, se alguém me poder ajudar. Agradecia, obrigado.

Edited by nunopicado
Syntax Highlight
Link to comment
Share on other sites

Bom dia Gonçalo.
Peço-te que, quando coloques posts no forum, sejas um pouco mais explícito. Colocar praticamente apenas um código sem dizeres exatamente qual a tua dificuldade não convida ninguém a responder, além de ser contra as regras do fórum.

Dito isto, o código não é muito grande e saltou à vista uma coisa:
As teclas são caracteres especiais, e como tal, precisam de tratamento especial.

Sempre que tocas numa seta, o programa recebe não um código, mas dois.
O primeiro é um caracter nulo (#0), e só de seguida recebe o código da tecla pressionada.

Assim:

  1. Não uses UPCASE para trabalhar com as setas. O UPCASE serve para letras, e neste caso, além de não ajudar, pode até prejudicar.
  2. Tens de fazer um readkey para te ler o #0, e outro readkey para ler a tecla da seta.

Ou seja, a secção de leitura da tecla ficaria mais ou menos isto:

  Tecla := ReadKey;
  if Tecla = #0
    then begin
      Tecla := ReadKey;
      case Tecla of
        #80 : Down;
        #72 : Up;
        #77 : Right;
        #75 : Left;
      end;
    end;

 

Segunda coisa:

if(keypressed ) then break ;

Ao fazeres isto, ele já nem sequer vai ler a tecla. Estás a sair do ciclo assim que uma tecla é pressionada, pelo que ele já não faz mais nada até o fim do ciclo.

 

Terceira coisa:

Tens um 

repeat

Mas não tens um "until". Sem isso, o programa nem sequer compila.

  • Vote 1

"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 comment
Share on other sites

Boa tarde. Peço desde já desculpa, sou novo nestes fórums e não sabia. Muito obrigado, estou a precisar de ajuda agora para um outro programa que eu decidi começar, visto que o de ontem estava um bocado complicado para mim, será que poderia me ajudar a resolver, é o seguinte eu queria quando solicitado ao utilizador do programa o tempo que queria que o carro anda-se esse indivíduo dissesse por exemplo 10 segundos e o carro iria andar esses somente 10 segundos. O PROBLEMA é o carro não pára nesses mesmo segundos e eu devido à minha inexperiência não estou a conseguir resolver. Será que me poderia ajudar se não for incomodo, muito obrigado.

 

program CarroTemporizadorproject;

var
  tempo: integer; 
  coluna: integer;
begin
  
  WriteLn('Digite o tempo para o carro andar (em segundos):');
  ReadLn(tempo);
  
        for coluna:= 5 to 500 do  
       begin
       clrscr ;
       gotoxy( 1, 2 );
       gotoxy( coluna, 7 );
       writeln( '  - ', #177, #177, #177, #177, #177, #177  );
       gotoxy( coluna, 8 );
       writeln( '- - ', #177, #177,  #177, #177, '  ', #177  );
       gotoxy( coluna, 9 );
       writeln( '- - ', #177, #177, #177, #177, #177, #177, #177, #177 );
       gotoxy( coluna, 10 );
       writeln( '    o     o' );
       delay( 100 );
     
      if (keypressed) then break;
             
           else
           
           Delay(tempo);
           
           end;

 

Edited by nunopicado
Syntax Highlight
Link to comment
Share on other sites

O delay para a execução do programa durante o tempo que lá metes (em milissegundos).
Ou seja, se quisesses parar por 10 segundos, terias de colocar o valor 10000.

No entanto, o que tu queres não é que o programa pare por 10 segundos. Queres que ele faça alguma coisa por 10 segundos. 
Ou seja, não podes usar a função Delay.

Tens de usar uma função que te devolva a hora atual. No início do movimento guardas a hora atual e o ciclo que faz o carro mover-se continuar a correr. A cada volta do ciclo, tens de voltar a ler a hora atual e analisar se já passaram 10 segundos desde a hora que gravaste no início do ciclo.

A questão que se coloca é: O PascalZim é capaz de ler a hora? Sinceramente, não faço ideia.
Escolheste a pior amostra de compilador de que há memória. É tão limitado que algo tão simples como a hora não tenho a certeza que ele seja capaz de realizar.
Literalmente, podias ir buscar o compilador Turbo Pascal 5.5 com que eu comecei há mais de 30 anos e mesmo com todas as suas limitações ficarias mais bem servido do que com o PascalZim.

 

"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 comment
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.