joao_o grande Posted January 3, 2016 at 07:41 PM Report Share #591262 Posted January 3, 2016 at 07:41 PM ola, Eu estou a tentar fazer um pequeno jogo no qual eu clico nas setas e um caracter move-se. No entanto, isto está dificil e há qualquer coisa de errado. O meu 1º objetivo é fazer mover o personagem. Podem dar uma olhadela pelo programa e ver o que está errado?? Daria mesmo muito jeito. O que acontece, independentemente das teclas em que eu clico é isto: (não consigo colar um print screen do meu ecra aqui. Alguém me ajuda??) Para quem não quiser analisar as duas primeiras procedures: 1 - Na primeira procedure escreve-se as coordenadas do texto, escrevemos o texto que queremos e indicamos se queremos Writeln(True) ou Write(False) através de uma variável boolean. 2 - Na segunda procedure ele desenha simplesmente o caracter a ser movido nas coordenadas indicadas pelo programador. P.S.: Não usei clrscr pq apaga a tela toda e eu não quero. Só quero apagar a posição anterior do boneco (por isso usei o [ESPAÇO]) Aqui vai o codigo. Program Jogo;var Jogador:Record X,Y:integer; end;ch:char;Procedure Escrever(Escreve_x,Escreve_y:integer; texto:string; novaln: Boolean);Begin If novaln=True then Begin Gotoxy(Escreve_x,Escreve_y); Writeln(texto); End else Begin Gotoxy(Escreve_x,Escreve_y); Write(texto); End;End;Procedure Desenha_jogador(Desenha_Jogador_X,Desenha_Jogador_Y:integer);Begin Gotoxy(Desenha_Jogador_X,Desenha_Jogador_Y); Writeln(#178);End;Procedure Movimenta_personagem;var Jogador:Record X,Y:integer; end;ch:char;Beginrepeat ch:=readkey; Case ch of #0:begin ch:=readkey; Case ch of #75:begin //left Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.X:=Jogador.X-1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #77:begin //right Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.X:=Jogador.X+1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #80:begin //up Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.Y:=Jogador.Y+1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #72:begin //down Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.Y:=Jogador.Y-1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #27:Exit; end; end; end;until ch=#27; End;BEGINJogador.X:=40;Jogador.Y:=12;Desenha_jogador(Jogador.X,Jogador.Y);Movimenta_personagem;END.[/Code] Link to comment Share on other sites More sharing options...
nunopicado Posted January 3, 2016 at 08:18 PM Report Share #591267 Posted January 3, 2016 at 08:18 PM O teu problema principal está no Procedure Movimenta_personagem. Declaras uma variável local Jogador, e é esse que está a ser alterado pelo case controlado pelas teclas das setas, mas na hora de desenhar o jogador, está a ser usada a variável global Jogador, que nunca chega a ser movimentada excepto na inicialização da app. Remove a variável local Jogador, e essa parte já trabalha bem. Depois, é só veres o resto se funciona como queres. 😉 "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 More sharing options...
joao_o grande Posted January 3, 2016 at 11:02 PM Author Report Share #591273 Posted January 3, 2016 at 11:02 PM (edited) Espetáculo!!! Já funciona. Obrigado nuno, O 1º objetivo está cumprido. Agora vou para o segundo.. Eu apaguei a variável global e as tres primeiras linhas do programa principal passei-as para a procedure. Para quem precisar aqui vai o programa feito e funcional. Program Jogo; var ch:char; Procedure Escrever(Escreve_x,Escreve_y:integer; texto:string; novaln: Boolean); Begin If novaln=True then Begin Gotoxy(Escreve_x,Escreve_y); Writeln(texto); End else Begin Gotoxy(Escreve_x,Escreve_y); Write(texto); End; End; Procedure Desenha_jogador(Desenha_Jogador_X,Desenha_Jogador_Y:integer); Begin Gotoxy(Desenha_Jogador_X,Desenha_Jogador_Y); Writeln(#178); End; //Procedure Inimigos_Aleatorio Procedure Movimenta_personagem; var Jogador:Record X,Y:integer; end; ch:char; Begin Jogador.X:=40; Jogador.Y:=12; Desenha_jogador(Jogador.X,Jogador.Y); repeat ch:=readkey; Case ch of #0:begin ch:=readkey; Case ch of #75:begin //left Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.X:=Jogador.X-1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #77:begin //right Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.X:=Jogador.X+1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #80:begin //up Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.Y:=Jogador.Y+1; Desenha_Jogador(Jogador.X,Jogador.Y); end; #72:begin //down Escrever(Jogador.X,Jogador.Y,' ',False); Jogador.Y:=Jogador.Y-1; Desenha_Jogador(Jogador.X,Jogador.Y); end; end; end; #27:Exit; end; until ch=#27; End; BEGIN clrscr; cursoroff; Movimenta_personagem; END. Edited January 3, 2016 at 11:03 PM by joao_o grande Link to comment Share on other sites More sharing options...
nunopicado Posted January 3, 2016 at 11:20 PM Report Share #591279 Posted January 3, 2016 at 11:20 PM Não te esqueças de validar os valores que atribuis à posição do jogador. Se tentares movê-lo para cima do Y = 1 ou para a esquerda do X = 1, tens erro. E se tentares movê-lo para baixo ou para a direita do limite da janela, também terás problemas visuais. 😉 "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 More sharing options...
thoga31 Posted January 3, 2016 at 11:56 PM Report Share #591282 Posted January 3, 2016 at 11:56 PM Sugestão: const MAX_X = 80; MAX_Y = 25; MIN_X = 1; MIN_Y = MIN_X; procedure MudaPosJogador(var jog : TJogador; const ch : char); // Definir tipo "TJogador" begin case ch of #75 : // left jog.X := jog.X-1; #77 : //right jog.X := jog.X+1; #80 : //up jog.Y := jog.Y+1; #72 : //down jog.Y := jog.Y-1; end; if jog.Y > MAX_Y then jog.Y := MIN_Y else if jog.Y < MIN_Y then jog.Y := MAX_Y; if jog.X > MAX_X then jog.X := MIN_X else if jog.X < MIN_X then jog.X := MAX_X; end; // usar MudaPosJogador(jogador, ReadKey); Knowledge is free! Link to comment Share on other sites More sharing options...
joao_o grande Posted January 4, 2016 at 07:34 PM Author Report Share #591334 Posted January 4, 2016 at 07:34 PM Não te esqueças de validar os valores que atribuis à posição do jogador. Se tentares movê-lo para cima do Y = 1 ou para a esquerda do X = 1, tens erro. E se tentares movê-lo para baixo ou para a direita do limite da janela, também terás problemas visuais. 😉 Eu sei que faltava isso, mas não queria avançar sem primeiro conseguir fazer mover o personagem. Obrigado aos dois. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now