Gotoxy problém – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Gotoxy problém – Pascal – Fórum – Programujte.comGotoxy problém – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
jancijen
~ Anonymní uživatel
4 příspěvky
2. 12. 2014   #1
-
0
-

Nazdar :)

V pascale a celkovo v programovaní som nováčik a skúšal som programovať niečo pre zábavu :D
Použil som "textové obrázky" a 1 z nich sa má hýbať do boku, ale hýbe sa šikmo (dole aj do boku).

 

program Pikachu;
uses crt,dos;
var i:integer;

begin
clrscr;

writeln('                                .::. ');
writeln('                              .;:**');
writeln('                              `');
writeln('  .:XHHHHk.              db.   .;;.     dH  MX   ');
writeln('oMMMMMMMMMMM       ~MM  dMMP :MMMMMR   MMM  MR      ~MRMN ');
writeln('QMMMMMb  "MMX       MMMMMMP !MX'':M~   MMM MMM  .oo. XMMM''MMM');
writeln('  `MMMM.  )M> :X!Hk. MMMM   XMM.o"  .  MMMMMMM X?XMMM MMM>!MMP ');
writeln('  ''MMMb.dM!XM M''?M MMMMMX.`MMMMMMMM~ MM MMM XM `" MX MMXXMM ''');
writeln('    ~MMMMM~ XMM. .XM XM`"MMMb.~*?**~ .MMX M t MMbooMM XMMMMMP ');
writeln('     ?MMM>  YMMMMMM! MM   `?MMRb.    `"""   !L"MMMMM XM IMMM ');
writeln('      MMMX   "MMMM"  MM       ~%:           !Mh.""" dMI IMMP ');
writeln('       MMM.                                             IMX ');
writeln('       ~M!M                                             IMP ');

repeat
 gotoxy(30,15);write('Press ENTER!');
 delay(1000);
 gotoxy(30,15);write('            ');
 delay(400);
until keypressed;


for i:=1 to 50 do begin

gotoxy(i,1);write(' :::, ');
gotoxy(i,2);write(   '::::"._ ');
gotoxy(i,3);write('    ".    ".                        __.,,. ');
gotoxy(i,4);write('      ".    ".                _..-'''':::" ');
gotoxy(i,5);write('        \     \,.--""""--.,-''      _:'    );
gotoxy(i,6);write('    /\   \  .               .    .-'       );
gotoxy(i,7);write('   /  \   \                   ":'  );
gotoxy(i,8);write('  /    \  :                     : ');
gotoxy(i,9);write(' /      \:                       : ');
gotoxy(i,10);write('\       :                       : ');
gotoxy(i,11);write(' \      :      ,--,         ,-,  : ');
gotoxy(i,12);write('  \    :      |(_):|       |():| : ');
gotoxy(i,13);write('   \   :     __"--"   __    "-"_  : ');
gotoxy(i,14);write('    \  :    /  \      \/      / \ : ');
gotoxy(i,15);write('     \  :  (    )             \_/ : ');
gotoxy(i,16);write('  .-'' . :  \__/   "--''--"      : ');
gotoxy(i,17);write('  \  . .-:".                   .: ');
gotoxy(i,18);write('   \" :| :  "-.__      ___...-" : ');
gotoxy(i,19);write('    \::|:        ''''''          ". ');
gotoxy(i,20);write('  .,:::":  :                       ". ');
gotoxy(i,21);write('   \::\:   :                         "._ ');
gotoxy(i,22);write('    \::    :     /             "-._     ". ');
gotoxy(i,23);write('     \:    :    /              .   :-._ :-' );
gotoxy(i,24);write('      :    :   /               :   :  '' ');
gotoxy(i,25);write('      :   ."   ) .             :   : ');
gotoxy(i,26);write('       :  :  ."   ".          :   : ');
gotoxy(i,27);write('        : ".."      :      _." _.: ');
gotoxy(i,28);write('         "._        :..---"\"""  _) ');
gotoxy(i,29);write('            '':---''_)      "-"-' );
gotoxy(i,30);write('               "-"-'   );

end;

readln;

end.

Vopred díky :) 

Nahlásit jako SPAM
IP: 80.87.209.–
Reklama
Reklama
Mircosoft+1
Věrný člen
2. 12. 2014   #2
-
0
-

Takže co nám to dělá. Nejdřív to vypíše nějakou změť písmen. Potom to bliká nápisem "press enter", dokud se nezmáčkne libovolná klávesa. A pak to vykreslí Pikačua postupně od xové souřadnice 1 po 50, ale v tom cyklu není zařazené žádné čekání, takže ujede doprava tak rychle, že ho ani neuvidíš v pohybu. Zkus dát před konec cyklu třeba delay(50). Pohyb dolů je pravděpodobně způsobený přetékáním řádků u pravého okraje obrazovky: Pikaču je široký cca 40 px, k tomu přičti x=50, vyjde ti 90. Obrazovka má na šířku standardně jenom 80, takže se řádky budou zalamovat a pravá půlka obrázku vykoukne z levého okraje monitoru. Navíc přetečení posledního řádku obrazovky způsobení automatické scrollnutí celé obrazovky o jeden řádek nahoru. Jestli jedeš v textovém režimu 80x25, bude to dělat hned pět řádků v každé iteraci.

Řešit by se to dalo oříznutím jednotlivých řádků, aby nemohly přetékat - nastuduj si funkce Length a Copy.

Nahlásit jako SPAM
IP: 212.79.106.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
jancijen
~ Anonymní uživatel
4 příspěvky
3. 12. 2014   #3
-
0
-

Dík za odpoveď :) Na delay som tam zabudol :) Skúšal som študovať o týchto príkazoch ale moc som im nechápal :D Nemohol by niekto kto má čas (neviem posúdiť či je s tým veľa roboty, alebo nie). Pozrieť a napísať čo by som tam mal pridať a vysvetliť mi to? Ide o to že tam vyskočí nápis "Pokémon" :D a pod ním bliká "Press Enter!" stlačí sa tlačítko a pikaču ide šikmo dolu a vedľa neho je kopu zátvoriek a iných znakov (neviem prečo to robí). O to že bude pretŕčať na druhej strane viem, to mi robili aj keď som podobný program robil s autíčkom. Ale kľudne sa aj s tým pohrám, len neviem ako dalej :) 

Nahlásit jako SPAM
IP: 80.87.209.–
KIIV+42
God of flame
3. 12. 2014   #4
-
0
-

v linuxu s tim problem neni, dokud nezacnes vypisovat vic radku nez mas obrazovku. Maximalne delaj problemy prvni znaky u  i,2 a i,10  tam to chce aspon jednu mezeru, aby se to pri posunu neretezilo na obrazovce (prepisovalo se to mezerama)

takze ti staci zvetsit terminal (ve windows je to relativne slozity (oproti linuxu, kde proste staci roztahnout obrazovku terminalu))

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mircosoft+1
Věrný člen
3. 12. 2014   #5
-
0
-

#3 jancijen
Na vypsání řetězce na obecných souřadnicích bych si napsal procedurku, třeba: procedure Writexy(x,y:integer; retezec:string); (resp. už ji mám napsanou, ale místo standardního Write používá přímý přístup do VRAM, což nevím jestli by na tvém systému chodilo). Uvnitř by vypadala nějak takhle:

1) Jestli je y nad horním nebo pod spodním okrajem obrazovky nebo jestli x je za pravým nebo x+length(retezec) před levým okrajem, nemá cenu pokoušet se o kreslení => konec (třeba exitem).

2) Jestli ti text vyčuhuje vlevo (tj. x je menší než 1), spočítej si, kolik znaků ze začátku řetězce budeš muset uříznout, a index prvního viditelného znaku si ulož do proměnné (třeba Zacatek). Je to jenom jednoduché odečtení, jestli to nevidíš na první pohled, nakresli si to (taky to tak dělám). Souřadnici x nastav na 1.
Jestli text vlevo nečouhá, tak Zacatek:=1 (první znak řetězce) a x nech být.

3) Jestli text vyčuhuje vpravo (tj. x+length(retezec)>sirka_obrazovky nebo sirka_obrazovky-1, pokud je y=vyska_obrazovky), spočítej, kolik znaků budeš muset oříznout zprava, a index posledního viditelného znaku si ulož do další proměnné (třeba Konec). Jestli vpravo nečouhá, tak Konec=length(retezec) (poslední znak).

4) Jestli Konec>=Zacatek, je to dobré, na obrazovce nám aspoň kus textu zbyl. Takže Gotoxy(x,y); Write(x,y,Copy(Retezec,Zacatek,Konec-Zacatek+1));. Čili česky: vypiš úsek z daného řetězce od indexu Zacatek, o délce rovné počtu znaků mezi Začátkem a Koncem. Jestli nevidíš, na co je to +1, tak si to zase zkus nakreslit :-).

Jakmile tuhle proceduru rozchodíš, můžeš kreslit texty kamkoli a nemusíš se bát přetékání.

Nahlásit jako SPAM
IP: 212.79.106.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
jancijen
~ Anonymní uživatel
4 příspěvky
4. 12. 2014   #6
-
0
-

Dík za obsiahlu odpoveď :D možno si povieš že som debil, ale asi som tomu poriadne nepochopil... "text sa prelína z vrchu a zo spodu (os y), ale neviem ako to upraviť ten program. Absolútne neviem ako zadefinovať začiatok, koniec a čo sa týka retazca (string), tak doň mám vopchať pikachua? :D

Pripájam, niečo čo som "doplnil" (ale asi zle :D)

 

program Pikachu;
uses crt,dos;
var i:integer;
procedure Writexy(x,y:integer; retazec:string);


begin
clrscr;
x:=1;
Zaciatok:=1;
Koniec:=length(retazec);

writeln('                                .::. ');
writeln('                              .;:**');
writeln('                              `');
writeln('  .:XHHHHk.              db.   .;;.     dH  MX   ');
writeln('oMMMMMMMMMMM       ~MM  dMMP :MMMMMR   MMM  MR      ~MRMN ');
writeln('QMMMMMb  "MMX       MMMMMMP !MX'':M~   MMM MMM  .oo. XMMM''MMM');
writeln('  `MMMM.  )M> :X!Hk. MMMM   XMM.o"  .  MMMMMMM X?XMMM MMM>!MMP ');
writeln('  ''MMMb.dM!XM M''?M MMMMMX.`MMMMMMMM~ MM MMM XM `" MX MMXXMM ''');
writeln('    ~MMMMM~ XMM. .XM XM`"MMMb.~*?**~ .MMX M t MMbooMM XMMMMMP ');
writeln('     ?MMM>  YMMMMMM! MM   `?MMRb.    `"""   !L"MMMMM XM IMMM ');
writeln('      MMMX   "MMMM"  MM       ~%:           !Mh.""" dMI IMMP ');
writeln('       MMM.                                             IMX ');
writeln('       ~M!M                                             IMP ');

repeat
 gotoxy(30,15);write('Press ENTER!');
 delay(1000);
 gotoxy(30,15);write('            ');
 delay(400);
until keypressed;


for i:=1 to 50 do begin

gotoxy(i,1);write(' :::, ');
gotoxy(i,2);write(   '::::"._ ');
gotoxy(i,3);write('    ".    ".                        __.,,. ');
gotoxy(i,4);write('      ".    ".                _..-'''':::" ');
gotoxy(i,5);write('        \     \,.--""""--.,-''      _:'    );
gotoxy(i,6);write('    /\   \  .               .    .-'       );
gotoxy(i,7);write('   /  \   \                   ":'  );
gotoxy(i,8);write('  /    \  :                     : ');
gotoxy(i,9);write(' /      \:                       : ');
gotoxy(i,10);write('\       :                       : ');
gotoxy(i,11);write(' \      :      ,--,         ,-,  : ');
gotoxy(i,12);write('  \    :      |(_):|       |():| : ');
gotoxy(i,13);write('   \   :     __"--"   __    "-"_  : ');
gotoxy(i,14);write('    \  :    /  \      \/      / \ : ');
gotoxy(i,15);write('     \  :  (    )             \_/ : ');
gotoxy(i,16);write('  .-'' . :  \__/   "--''--"      : ');
gotoxy(i,17);write('  \  . .-:".                   .: ');
gotoxy(i,18);write('   \" :| :  "-.__      ___...-" : ');
gotoxy(i,19);write('    \::|:        ''''''          ". ');
gotoxy(i,20);write('  .,:::":  :                       ". ');
gotoxy(i,21);write('   \::\:   :                         "._ ');
gotoxy(i,22);write('    \::    :     /             "-._     ". ');
gotoxy(i,23);write('     \:    :    /              .   :-._ :-' );
gotoxy(i,24);write('      :    :   /               :   :  '' ');
gotoxy(i,25);write('      :   ."   ) .             :   : ');
gotoxy(i,26);write('       :  :  ."   ".          :   : ');
gotoxy(i,27);write('        : ".."      :      _." _.: ');
gotoxy(i,28);write('         "._        :..---"\"""  _) ');
gotoxy(i,29);write('            '':---''_)      "-"-' );
gotoxy(i,30);write('               "-"-'   );

delay(70);


end;

readln;

end.

Nahlásit jako SPAM
IP: 80.87.209.–
Mircosoft+1
Věrný člen
4. 12. 2014   #7
-
0
-

Tak jsem si ten tvůj zdroják vykopíroval do širšího okna a konečně jsem pochopil, co znamená ta divná změť písmen na začátku :-D.

Nepoviem, že jsi debil, jenom že nevíš, jak se definuje procedura :-). Asi takhle:

program Pikachu;
 uses crt,dos;
 var i:integer;

procedure Writexy(x,y:integer; retazec:string);
var zaciatok,koniec:integer;
Begin
if (y<1) or (y>VyskaObrazovky) or (x>SirkaObrazovky) or (x+length(retazec)<1)
  then exit;
if ... then zaciatok:=...
       else zaciatok:=1;
...
gotoxy(...);
write(...);
End;

BEGIN
clrscr;

writeln('                                .::. ');
writeln('                              .;:**');
writeln('                              `');
writeln('  .:XHHHHk.              db.   .;;.     dH  MX   ');
writeln('oMMMMMMMMMMM       ~MM  dMMP :MMMMMR   MMM  MR      ~MRMN ');
writeln('QMMMMMb  "MMX       MMMMMMP !MX'':M~   MMM MMM  .oo. XMMM''MMM')

...atd...

for i:=1 to 50 do begin

 writexy(i,1,' :::, ');
 writexy(i,2,'::::"._ ');
 writexy(i,3,'    ".    ".                        __.,,. ');
 writexy(i,4,'      ".    ".                _..-'''':::" ');
 ...atd...

Místo ... si zkus něco doplnit.

P.S.: Zkusil jsem si ten program spustit tady v Turbo pascalu pod Windows XP. Režim obrazovky byl nejspíš 80x50, takže Pikaču proběhl zleva doprava bez problémů (jenom se ho nakonec půlka objevila vlevo). Zkus se mrknout do helpu na příkaz Textmode (jednotka Crt), pro takovéhle animace je vždycky dobré nastavit si velikost obrazovky ručně a nespoléhat na defaulty.

Nahlásit jako SPAM
IP: 212.79.106.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
jancijen
~ Anonymní uživatel
4 příspěvky
6. 12. 2014   #8
-
0
-

Ďakujem za pomoc zase :)
Dostal som sa po tadeto a neviem čo dopĺnať dalej :D aby ste si nemysleli že som si iba stiahol pascal a snažím sa robiť podla tutorialov, ale v škole nás máločo naučia (nič v zlom :D), tak sa snažím učiť aj sám :)

 

program Pikachu;
uses crt,dos;
var i:integer;

procedure Writexy(x,y:integer; retazec:string);
var zaciatok, koniec:integer;
Begin
if (y<1) or (y>50) or (x>80) or (x+length(string)<1) then exit;
if  then zaciatok:=
   else zaciatok:=1;

gotoxy();
write();

end;

begin
clrscr;

writeln('                                .::. ');
writeln('                              .;:**');
writeln('                              `');
writeln('  .:XHHHHk.              db.   .;;.     dH  MX   ');
writeln('oMMMMMMMMMMM       ~MM  dMMP :MMMMMR   MMM  MR      ~MRMN ');
writeln('QMMMMMb  "MMX       MMMMMMP !MX'':M~   MMM MMM  .oo. XMMM''MMM');
writeln('  `MMMM.  )M> :X!Hk. MMMM   XMM.o"  .  MMMMMMM X?XMMM MMM>!MMP ');
writeln('  ''MMMb.dM!XM M''?M MMMMMX.`MMMMMMMM~ MM MMM XM `" MX MMXXMM ''');
writeln('    ~MMMMM~ XMM. .XM XM`"MMMb.~*?**~ .MMX M t MMbooMM XMMMMMP ');
writeln('     ?MMM>  YMMMMMM! MM   `?MMRb.    `"""   !L"MMMMM XM IMMM ');
writeln('      MMMX   "MMMM"  MM       ~%:           !Mh.""" dMI IMMP ');
writeln('       MMM.                                             IMX ');
writeln('       ~M!M                                             IMP ');

repeat
 gotoxy(30,15);write('Press ENTER!');
 delay(1000);
 gotoxy(30,15);write('            ');
 delay(400);
until keypressed;


for i:=1 to 50 do begin

gotoxy(i,1);write(' :::, ');
gotoxy(i,2);write(   '::::"._ ');
gotoxy(i,3);write('    ".    ".                        __.,,. ');
gotoxy(i,4);write('      ".    ".                _..-'''':::" ');
gotoxy(i,5);write('        \     \,.--""""--.,-''      _:'    );
gotoxy(i,6);write('    /\   \  .               .    .-'       );
gotoxy(i,7);write('   /  \   \                   ":'  );
gotoxy(i,8);write('  /    \  :                     : ');
gotoxy(i,9);write(' /      \:                       : ');
gotoxy(i,10);write('\       :                       : ');
gotoxy(i,11);write(' \      :      ,--,         ,-,  : ');
gotoxy(i,12);write('  \    :      |(_):|       |():| : ');
gotoxy(i,13);write('   \   :     __"--"   __    "-"_  : ');
gotoxy(i,14);write('    \  :    /  \      \/      / \ : ');
gotoxy(i,15);write('     \  :  (    )             \_/ : ');
gotoxy(i,16);write('  .-'' . :  \__/   "--''--"      : ');
gotoxy(i,17);write('  \  . .-:".                   .: ');
gotoxy(i,18);write('   \" :| :  "-.__      ___...-" : ');
gotoxy(i,19);write('    \::|:        ''''''          ". ');
gotoxy(i,20);write('  .,:::":  :                       ". ');
gotoxy(i,21);write('   \::\:   :                         "._ ');
gotoxy(i,22);write('    \::    :     /             "-._     ". ');
gotoxy(i,23);write('     \:    :    /              .   :-._ :-' );
gotoxy(i,24);write('      :    :   /               :   :  '' ');
gotoxy(i,25);write('      :   ."   ) .             :   : ');
gotoxy(i,26);write('       :  :  ."   ".          :   : ');
gotoxy(i,27);write('        : ".."      :      _." _.: ');
gotoxy(i,28);write('         "._        :..---"\"""  _) ');
gotoxy(i,29);write('            '':---''_)      "-"-' );
gotoxy(i,30);write('               "-"-'   );

delay(70);


end;

readln;

end.

Nahlásit jako SPAM
IP: 80.87.209.–
Mircosoft+1
Věrný člen
8. 12. 2014   #9
-
0
-

Výborně, copy a paste ti jde. Teď by to chtělo trochu vlastní iniciativy, ne? :-)

Malá nápověda - situace u levého okraje obrazovky:

     +-------------------
     |
 -1 0|1 2 3 4 5 6 ...  <-souradnice na obrazovce
     |
  P I|K A Č U  <--retezec, ktery chces zobrazit
  1 2|3 4 5 6  <--indexy znaku v tom retezci
     |

Xová souřadnice zobrazovaného textu je -1, délka textu je 6 znaků. Z nákresu vidíš, že je potřeba nastavit se na souřadnici 1 a text začít vypisovat od indexu 3 dál (tj. write(copy(retazec,3,6));). Teď zkus vymyslet:
1) Za jakých okolností (tj. při jakých hodnotách x) budeš muset místo gotoxy(x,y) použít gotoxy(1,y)?
2) Jak z x vypočítáš index (v tomto příkladě z čísla -1 číslo 3)? Nápověda: bude v tom nějaké odčítání, jde v podstatě o vzdálenost dvou bodů na číselné ose. A dva mínusy dávají plus...

Příklad č. 2 - situace u pravého okraje:

---------------+
               |
... 77 78 79 80|81 82
               |
     P  I  K  A| Č  U
     1  2  3  4| 5  6
               |

X je 77, délka zase 6. Otázky:
1) Jak ze souřadnice x, délky řetězce (length(retazec)) a šířky obrazovky (pravděpodobně 80) poznáš, že máš vypsat jenom část řetězce a ne všechno?
2) A jak z těch souřadnic a délek spočítáš, kolik písmen máš vypsat?

Nahlásit jako SPAM
IP: 94.113.255.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 40 hostů

Podobná vlákna

Gotoxy — založil Fugii

POMOC - Funkce GotoXY,kbhit() — založil Hanmir1

Problém — založil Já

Problém — založil Ma.ty

Problem s VS C# — založil Mrakoplas

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý