mateusalves Posted October 29, 2021 at 07:13 PM Report #624374 Posted October 29, 2021 at 07:13 PM Boas, tenho um programa para fazer para um trabalho, e apenas não estou a conseguir efetuar um passo, cujo objetivo é clicar na tecla ESC e através deste clique, limpar todo o ecrã escrever algo através de: "write('...');". Se alguém me conseguisse ajudar seria brutal. Obrigado.
mateusalves Posted October 30, 2021 at 03:33 PM Author Report #624378 Posted October 30, 2021 at 03:33 PM Boas. Fiz este programa: Program Bandeira_Portugal; var ATRASO1,ATRASO2, c1,c2,l1,l2:integer; var c:char; var sair:boolean; Begin ATRASO1:= 1; // 100 milissegundos ATRASO2:= 200; // 200 milissegundos gotoxy(26,27); textcolor(YELLOW); writeln('Precione ESC para terminar o programa'); c1:=1; c2:=87; l1:=0; l2:=0; while c1<31 do //preencher simetricamente o verde e o vermelho begin while l1<25 do begin delay(ATRASO1); l1:=l1+1; gotoxy(c1,l1); textcolor(GREEN); textbackground(GREEN); write('.'); l2:=l2+1; gotoxy(c2,l2); textcolor(RED); textbackground(RED); write('.'); end; l1:=0; c1:=c1+1; l2:=0; c2:=c2-1; end; c2:=57; l2:=0; while c2>30 do //preencher o vermelho em falta begin while l2<25 do begin delay(ATRASO1); l2:=l2+1; gotoxy(c2,l2); textcolor(RED); textbackground(RED); write('.'); end; l2:=0; c2:=c2-1; end; End. Queria clicar no ESC e fazer com que a bandeira parasse de se mover e aparecesse o meu nome por baixo da mesma, letra a letra. Já tenho os códigos para o segundo passo, mas não estou a conseguir parar a bandeira clicando no ESC, suponho que seja usando o readkey... Se alguém me pudesse ajudar ficava muito agradecido. Cumprimentos.
nunopicado Posted October 30, 2021 at 11:27 PM Report #624379 Posted October 30, 2021 at 11:27 PM Se bem percebi o que queres, o readkey é apenas parte da história. Se a ideia é durante a execução dos ciclos verificar se a tecla é pressionada, não podes usar apenas o readykey, pois este pausa-te a sequencia até receber a tecla. Terias de usar uma função chamada KeyPressed, mas que não faço ideia se existe na amostra de compilador que é o PZim. O KeyPressed verifica se alguma tecla é pressionada, mas sem parar a operação. Só por si não consegue dizer qual tecla foi pressionada, e aí já entra o readkey. Em conjunto, estas duas funções deverão fazer o que precisas. Algo tipo (algures dentro do ciclo): if KeyPressed then case ReadKey do #0: ReadKey; // Serve para limpar o buffer caso seja pressionada uma tecla especial #27: FazOQueQuiseresFazerAoPressionarEsc; end; "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.
mateusalves Posted October 31, 2021 at 08:38 AM Author Report #624380 Posted October 31, 2021 at 08:38 AM Isto é o que eu tenho: Program Bandeira_Portugal; var ATRASO1,ATRASO2, c1,c2,l1,l2,l3:integer; c:char; sair:boolean; Begin ATRASO1:= 1; // 1 milissegundo ATRASO2:= 200; // 200 milissegundos c1:=1; c2:=87; l1:=0; l2:=0; gotoxy(26,27); textcolor(YELLOW); writeln('Precione ESC para terminar o programa'); while c1<31 do //preencher simetricamente o verde e o vermelho begin while l1<25 do begin delay(ATRASO1); l1:=l1+1; gotoxy(c1,l1); textcolor(GREEN); textbackground(GREEN); write('.'); l2:=l2+1; gotoxy(c2,l2); textcolor(RED); textbackground(RED); write('.'); end; l1:=0; c1:=c1+1; l2:=0; c2:=c2-1; end; c2:=57; l2:=0; while c2>30 do //preencher o vermelho em falta begin while l2<25 do begin delay(ATRASO1); l2:=l2+1; gotoxy(c2,l2); textcolor(RED); textbackground(RED); write('.'); end; l2:=0; c2:=c2-1; end; End. Isto é o que quero que aconteça quando pressionar o ESC: //A bandeira não se mexe mais e aparece o texto seguinte: textcolor(WHITE); textbackground(BLACK); gotoxy(1,26);write('P');delay(ATRASO2);gotoxy(1,26);write('Po');delay(ATRASO2); gotoxy(1,26);write('Por');delay(ATRASO2);gotoxy(1,26);write('Por ');delay(ATRASO2); gotoxy(1,26);write('Por M');delay(ATRASO2);gotoxy(1,26);write('Por Ma');delay(ATRASO2); gotoxy(1,26);write('Por Mat');delay(ATRASO2);gotoxy(1,26);write('Por Mate');delay(ATRASO2); gotoxy(1,26);write('Por Mateu');delay(ATRASO2);gotoxy(1,26);write('Por Mateus');delay(ATRASO2); gotoxy(1,26);write('Por Mateus ');delay(ATRASO2);gotoxy(1,26);write('Por Mateus A');delay(ATRASO2); gotoxy(1,26);write('Por Mateus Al');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alv');delay(ATRASO2); gotoxy(1,26);write('Por Mateus Alve');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alves');delay(ATRASO2); clrscr; Já tentei de tudo e não consigo fazer funcionar...
passarito Posted November 2, 2021 at 02:08 PM Report #624400 Posted November 2, 2021 at 02:08 PM Pegando no que te disse o @nunopicado, colocas isto em todos os ciclos if KeyPressed then case ReadKey do #0: ReadKey; // Serve para limpar o buffer caso seja pressionada uma tecla especial #27: textcolor(WHITE); textbackground(BLACK); gotoxy(1,26);write('P');delay(ATRASO2);gotoxy(1,26);write('Po');delay(ATRASO2); gotoxy(1,26);write('Por');delay(ATRASO2);gotoxy(1,26);write('Por ');delay(ATRASO2); gotoxy(1,26);write('Por M');delay(ATRASO2);gotoxy(1,26);write('Por Ma');delay(ATRASO2); gotoxy(1,26);write('Por Mat');delay(ATRASO2);gotoxy(1,26);write('Por Mate');delay(ATRASO2); gotoxy(1,26);write('Por Mateu');delay(ATRASO2);gotoxy(1,26);write('Por Mateus');delay(ATRASO2); gotoxy(1,26);write('Por Mateus ');delay(ATRASO2);gotoxy(1,26);write('Por Mateus A');delay(ATRASO2); gotoxy(1,26);write('Por Mateus Al');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alv');delay(ATRASO2); gotoxy(1,26);write('Por Mateus Alve');delay(ATRASO2);gotoxy(1,26);write('Por Mateus Alves');delay(ATRASO2); clrscr; end; Mas isto é programação "spaghetti". Usa procedimentos e funções. 1 Report
nunopicado Posted November 2, 2021 at 04:25 PM Report #624407 Posted November 2, 2021 at 04:25 PM Junta-lhe só um begin antes do textcolor e um end depois do clrscr. Mas como diz o @passarito, isso precisa urgentemente ser refactorado com procedimentos/funções. Além de que multiplas instruções na mesma linha de código fica um pesadelo para quem está a olhar. Pensa nisto: Sempre que fizeres Copy/Paste num código, há 99% de hipótese de haver uma forma melhor de fazer a mesma coisa com menos trabalho e mais eficácia. Só nesse pedaço de código que queres executar quando tocas no ESC tens 16x gotoxy, 16x write e 16x delay. Sem a 'batota' das multiplas instruções na mesma linha, terias só nessa parte 48 linhas de código, praticamente todo repetido. É o que chamamos uma bandeira vermelha de mau código. Assim de cabeça, algo assim faria o mesmo efeito: procedure TypeWriter(const Text: string; const X, Y: Byte; DelayValue: Word); var i: Integer; begin GotoXY(X, Y); for i := 1 to Length(Text) do begin Write(Text[i]); Delay(DelayValue); end; end; que depois usarias assim: textcolor(WHITE); textbackground(BLACK); TypeWriter('Por Mateus Alves', 1, 26, ATRASO2); clrscr; 1 Report "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.
passarito Posted November 3, 2021 at 12:26 PM Report #624445 Posted November 3, 2021 at 12:26 PM 19 horas atrás, nunopicado disse: Junta-lhe só um begin antes do textcolor e um end depois do clrscr. Tens toda a razão. No teu código, eu apenas optaria por colocar o textcolor e textbackground dentro do procedimento usando mais 2 argumentos para passar os valores das cores. @mateusalves, pelo que vi, parece-me que estás a iniciar nisto do Pascal e a "brincar" para aprender. Se for o caso vai aproveitando as dicas que te damos aqui 😉 Assim sendo, aqui qualquer coisinha: Esses WHILE's para mim estão mesmo a pedir um ciclo FOR. Poupa-te em código e fica mais perceptível. Vou fazer o vermelho e depois podes aplicar o mesmo método nos outros ciclos WHILE // c2:=57; --> Não é preciso // l2:=0; ---> Não é preciso // Com o ciclo FOR não necessitas de inicializar, re-inicializar nem incrementar as variavies For c2:=57 DownTo 30 do //preencher o vermelho em falta begin For l2:=0 to 25 do begin // aqui usaria um procedimento semelhante ao do @nunopicado em vez do código abaixo delay(ATRASO1); gotoxy(c2,l2); textcolor(RED); textbackground(RED); write('.'); end; end; 1 Report
nunopicado Posted November 4, 2021 at 02:19 AM Report #624460 Posted November 4, 2021 at 02:19 AM 13 horas atrás, passarito disse: No teu código, eu apenas optaria por colocar o textcolor e textbackground dentro do procedimento usando mais 2 argumentos para passar os valores das cores. Sim, ainda pensei nisso, mas acabei por não pôr. Ficaria assim: procedure TypeWriter(const Text: string; const X, Y, Color, BGColor: Byte; DelayValue: Word); var i: Integer; begin TextColor(Color); TextBackGround(BGColor); GotoXY(X, Y); for i := 1 to Length(Text) do begin Write(Text[i]); Delay(DelayValue); end; end; E depois a usar: TypeWriter('Por Mateus Alves', 1, 26, WHITE, BLACK, ATRASO2); clrscr; "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.
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