readkey a keypressed v pascale

Programovacie jazyky, rady, poradňa...
antenka
Novice
Novice
Príspevky: 7
Registrovaný: 09 jan 2010, 19:57
Bydlisko: Martin

readkey a keypressed v pascale

Príspevok od používateľa antenka »

Ahojte, mam problem. Mam spravit seminarku na ivt. Mam v pascale naprogramovat hru. Neviem, ako presne sa to vola, ale ide o to, ze na nahodnom mieste sa zobrazi gulicka (v mojom pripade o) a pada diagonalne. ja hybem palickou, ktora je dole a odrazam ju.
Uz mi gulicka lieta po obrazovke, uz si viem zobrazit palicku a odrazanie, ale na to, abysom s nou mohla hybat mucim nacitat nieco z klavesnice. Tak som si myslela, ze na koniec procedury, ktora posuva gulicku o jeden dielik, dam if keypressed a ak bolo nieco stlacene, tak pojdem do procedury, ktora zisti co bolo stlacene tak, ze do premennej priradi readkey, ale readkey nenacita klavesu ktora uz bola stlacena, ale caka na stlacenie. takze ked som stlacila klaves, program sa zastavil a cakal, kym som neco stlacila znovu.
ako by sa to dalo vyriesit?
dakujem.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Príspevok od používateľa harrison314 »

Mohla by si sem napisat zdrojak.
antenka
Novice
Novice
Príspevky: 7
Registrovaný: 09 jan 2010, 19:57
Bydlisko: Martin

Príspevok od používateľa antenka »

tak som si myslela, ze uz to pojde a nejde to vobec. neviem, kde je chyba, lebo mi vypise iba compilation abroted, takze vobec neviem, co s tym teraz. :( ak by sa niekomu nahodou chcelo pozriet sa na to, tak by som bola veeeelmi vdacna

Kód: Vybrať všetko

program skuska;
uses crt;
var lvl,max,may,odrazy:integer;
    cosi:char;

 procedure boardlevel(lvl,b:integer);(*vykresli palicku posla prislusneho levelu*)
 var i:integer
 begin
  gotoxy(1,may);
  for i:=1 to b do write (#219);
 end;

 procedure gamestarted;(*Zobrazi uvodnu obrazovku*)
 begin
  clrscr;
  writeln('GAME STARTED');
  writeln('pohyb dolava=F');
  writeln('pohyb doprava=J');
  writeln('koniec=E');
  writeln('Press any key.');
  readln;
  clrscr;
 end;

 procedure koniec(lvl,odrazy:integer);(*vypise game over a skore*)
 begin
  clrscr;
  writeln('GAME OVER');
  writeln('Tvoje skore je ',(lvl-1)*10+odrazy);
  writeln('Press any key.');
  readln;
 end;

 procedure left(lvl,b:integer);(*Posunie palicku dolava*)
 begin
  if (b+lvl-10)>1 then begin
   goto(b+lvl-11,may);
   write(#219);
   goto(b,may);
   b:=b-1;
  end;
 end;

 procedure lvlup(lvl:integer);(*vypise level up, hra s zacne odznova s o jedno policko kratsou palickou*)
 begin
  clrscr;
  writeln('LEVEL UP');
  writeln('Press any key.');
  readln;
  zakladna(lvl);
 end;

 procedure move(xx,yy:integer);(*hybe gulickou*)
  while cosi<>'e'do begin

   if (xx=max) then x:=-1;
   if(yy=may)then y:=-1;
   if(xx=1)then x:=1;
   if(yy=1)then y:=1;

   xx:=xx+x;
   yy:=yy+y;
   gotoxy(xx,yy);
   write('o');

   delay(100);

   gotoxy(xx,yy);
   write(' ');

   zistovacka(lvl,b);
   padam(xx,yy,b,lvl);
  end;
 end;

 procedure padam(xx,yy,b,lvl:integer); (*zisti, ci sa gulicka pri dopade dotkla palicky alebo nie*)
 begin
  if yy=may then
    if(xx>b)or (xx<(b-11-lvl))then koniec(lvl,odrazy)
      elseodrazy?=odrazy+1;
  if odrazy=10 then lvlup(lvl);
 end;

 procedure right(lvl,b:integer);(*posuva palicku doprava*)
 begin
  if b<max then begin
   goto(b+1,may);
   write(#219);
   goto(b+lvl-10);
   write(' ');
   b:=b+1;
  end;
 end;

 procedure zakladna(lvl:integer);(*zakladna procedura, ktora vyvolava ostatne a zabezpecuje prvotne zobrazenie gulicky*)
 var x,y,xx,yy:integer;
 begin
  odrazy:=0;
  lvl:=lvl+1;
  if lvl=9 then won(lvl,odrazy);
  x:=1;
  y:=1;

  xx:=random(max+1);
  yy:=random(may+1);

  gotoxy(xx,yy);
  write('o');

  boardlvl(lvl);

  gotoxy(xx,yy);
  write('o');

  move(xx,yy);
 end;

 procedure zistovacka(var lvl,b:integer);(*zisti ci a co bolo stlacene na klavesnici*)
 var cosi:char;
 begin
  if keypressed then begin
   cosi:=readkey;
   if cosi='f'then left(lvl,b)else
   if cosi='j'the right(lvl,b)else
   if cosi='e' then koniec(lvl,odrazy);
  end;
 end;

 procedure won(var lvl,odrazy);(*zaverecna vitazna obrazovka*)
 begin
  clrscr;
  witeln('YOU WON');
  writeln('CONGRATULATIONS');
  writeln('Tvoje skore je',(lvl-1)*10+odrazy);
  readln;
 end;



begin
 clrscr;
 randomize;
 gamestarted;
 lever:=0;
 max:=80;
 may:=50;
 odrazy:=0;
 b:=11-lvl;
 zakladna(lvl);
end.
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Príspevok od používateľa juho »

nevola sa to nahodou ping-puong? alebo (s)table tennis?

Kód: Vybrať všetko

var lvl,max,may,odrazy:integer;
    cosi:char; 
pridaj si tam este to b

Kód: Vybrať všetko

elseodrazy?=odrazy+1; 
to je chybne napisane

Kód: Vybrať všetko

procedure zistovacka(var lvl,b:integer);(*zisti ci a co bolo stlacene na klavesnici*)
 var cosi:char;
 begin 
tu ti lokalna premenna prekryva globalnu => cyklus while nikdy neskonci
pred kompilovanim pouzi kontrolu chyb alebo debugger
antenka
Novice
Novice
Príspevky: 7
Registrovaný: 09 jan 2010, 19:57
Bydlisko: Martin

Príspevok od používateľa antenka »

uz mi to ide spustit, ale prejde procedura gamestarted a program sa potom vypne. tu je kod.

Kód: Vybrať všetko

program skuska;
uses crt;
var b,lvl,max,may,odrazy:integer;
    cosi:char;

 procedure boardlvl(lvl,b:integer);(*vykresli palicku posla prislusneho levelu*)
 var i:integer;
 begin
  gotoxy(1,may);
  for i:=1 to b do write (#219);
 end;

 procedure gamestarted;(*Zobrazi uvodnu obrazovku*)
 begin
  clrscr;
  writeln('GAME STARTED');
  writeln('pohyb dolava=F');
  writeln('pohyb doprava=J');
  writeln('koniec=E');
  delay(5000);
  clrscr;
 end;

 procedure koniec(lvl,odrazy:integer);(*vypise game over a skore*)
 begin
  clrscr;
  writeln('GAME OVER');
  writeln('Tvoje skore je ',(lvl-1)*10+odrazy);
  writeln('Press any key.');
  readln;
 end;

 procedure left(lvl,b:integer);(*Posunie palicku dolava*)
 begin
  if (b+lvl-10)>1 then begin
   gotoxy(b+lvl-11,may);
   write(#219);
   gotoxy(b,may);
   b:=b-1;
  end;
 end;

 procedure won(lvl,odrazy:integer);(*zaverecna vitazna obrazovka*)
 begin
  clrscr;
  writeln('YOU WON');
  writeln('CONGRATULATIONS');
  writeln('Tvoje skore je',(lvl*10+odrazy-10));
  readln;
 end;

  procedure right(lvl,b:integer);(*posuva palicku doprava*)
 begin
  if b<max then begin
   gotoxy(b+1,may);
   write(#219);
   gotoxy(b+lvl-10,may);
   write(' ');
   b:=b+1;
  end;
 end;

  procedure zistovacka(var lvl,b:integer);(*zisti ci a co bolo stlacene na klavesnici*)
 var cosi:char;
 begin
  if keypressed then begin
   cosi:=readkey;
   if cosi='f'then left(lvl,b)else
   if cosi='j'then right(lvl,b)else
   if cosi='e' then koniec(lvl,odrazy);
  end;
 end;

  procedure zakladna(lvl,b:integer);(*zakladna procedura, ktora vyvolava ostatne a zabezpecuje prvotne zobrazenie gulicky*)
 var x,y,xx,yy:integer;
 begin
  odrazy:=0;
  lvl:=lvl+1;
  if lvl=9 then won(lvl,odrazy);
  x:=1;
  y:=1;

  xx:=random(max+1);
  yy:=random(may+1);

  gotoxy(xx,yy);
  write('o');

  boardlvl(lvl,b);

  gotoxy(xx,yy);
  write('o');

  move(x,y,b);
 end;


  procedure lvlup(lvl:integer);(*vypise level up, hra s zacne odznova s o jedno policko kratsou palickou*)
 begin
  clrscr;
  writeln('LEVEL UP');
  writeln('Press any key.');
  readln;
  zakladna(lvl,b);
 end;


  procedure padam(xx,yy,b,lvl:integer); (*zisti, ci sa gulicka pri dopade dotkla palicky alebo nie*)
 begin
  if yy=may then
    if(xx>b)or (xx<(b-11-lvl))then koniec(lvl,odrazy)
      else odrazy:=odrazy+1;
  if odrazy=10 then lvlup(lvl);
 end;


 procedure move(xx,yy,x,y,b:integer);(*hybe gulickou*)
  begin
  while cosi<>'e'do begin

   if (xx=max) then x:=-1;
   if(yy=may)then y:=-1;
   if(xx=1)then x:=1;
   if(yy=1)then y:=1;

   xx:=xx+x;
   yy:=yy+y;
   gotoxy(xx,yy);
   write('o');

   delay(100);

   gotoxy(xx,yy);
   write(' ');

   zistovacka(lvl,b);
   padam(xx,yy,b,lvl);
  end;
 end;














begin
 clrscr;
 randomize;
 gamestarted;
 lvl:=0;
 max:=80;
 may:=50;
 odrazy:=0;
 b:=11-lvl;
 zakladna(lvl,b);
end.
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Príspevok od používateľa juho »

nepise nahodou ze nevie najst move proceduru? az by bola chyba v tom tak pred proceduru zakladna by sa nejak malo dat ze procedure move(tie parametre) forward; alebo nieco takeho pozri si pascalovsky forwarding a ktomu je tam nesulad vo volani a deklaracii
antenka
Novice
Novice
Príspevky: 7
Registrovaný: 09 jan 2010, 19:57
Bydlisko: Martin

Príspevok od používateľa antenka »

nie, nie, nepise nic. spusti program, ukraze mi uvodnu obrazovku (gamestarted) a potom nic.
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Príspevok od používateľa juho »

presun tu proceduru zakladna az za proceduru move a az nepojde tak je chyba v niecom inom ale aj tak te parametre by mali byt chybne no podla toho ze aku verziu packalu pouzivas a jak to mas nastavene
antenka
Novice
Novice
Príspevky: 7
Registrovaný: 09 jan 2010, 19:57
Bydlisko: Martin

Príspevok od používateľa antenka »

spravila som to s forwardom a uz to ide. ale stale to nerobi to, co to ma robit. palicka so zobrazuje niekde inde a neda sa s nou hybat

Kód: Vybrať všetko

program skuska;
uses crt;
var b,lvl,max,may,odrazy:integer;
    cosi:char;

 procedure boardlvl(lvl,b:integer);(*vykresli palicku posla prislusneho levelu*)
 var i:integer;
 begin
  gotoxy(1,may);
  for i:=1 to b do write (#219);
 end;

 procedure gamestarted;(*Zobrazi uvodnu obrazovku*)
 begin
  clrscr;
  writeln('GAME STARTED');
  writeln('pohyb dolava=F');
  writeln('pohyb doprava=J');
  writeln('koniec=E');
  delay(5000);
  clrscr;
 end;

 procedure koniec(lvl,odrazy:integer);(*vypise game over a skore*)
 begin
  clrscr;
  writeln('GAME OVER');
  writeln('Tvoje skore je ',(lvl-1)*10+odrazy);
  writeln('Press any key.');
  readln;
 end;

 procedure left(lvl,b:integer);(*Posunie palicku dolava*)
 begin
  if (b+lvl-10)>1 then begin
   gotoxy(b+lvl-11,may);
   write(#219);
   gotoxy(b,may);
   b:=b-1;
  end;
 end;

 procedure won(lvl,odrazy:integer);(*zaverecna vitazna obrazovka*)
 begin
  clrscr;
  writeln('YOU WON');
  writeln('CONGRATULATIONS');
  writeln('Tvoje skore je',(lvl*10+odrazy-10));
  readln;
 end;

  procedure right(lvl,b:integer);(*posuva palicku doprava*)
 begin
  if b<max then begin
   gotoxy(b+1,may);
   write(#219);
   gotoxy(b+lvl-10,may);
   write(' ');
   b:=b+1;
  end;
 end;

  procedure zistovacka(var lvl,b:integer);(*zisti ci a co bolo stlacene na klavesnici*)
 var cosi:char;
 begin
  if keypressed then begin
   cosi:=readkey;
   if cosi='f'then left(lvl,b)else
   if cosi='j'then right(lvl,b)else
   if cosi='e' then koniec(lvl,odrazy);
  end;
 end;

 procedure zakladna(lvl,b:integer);
 forward;


  procedure lvlup(lvl:integer);(*vypise level up, hra s zacne odznova s o jedno policko kratsou palickou*)
 begin
  clrscr;
  writeln('LEVEL UP');
  writeln('Press any key.');
  readln;
  zakladna(lvl,b);
 end;


  procedure padam(xx,yy,b,lvl:integer); (*zisti, ci sa gulicka pri dopade dotkla palicky alebo nie*)
 begin
  if yy=may then
    if(xx>b)or (xx<(b-11-lvl))then koniec(lvl,odrazy)
      else odrazy:=odrazy+1;
  if odrazy=10 then lvlup(lvl);
 end;


 procedure move(xx,yy,x,y,b:integer);(*hybe gulickou*)
  begin
  while cosi<>'e'do begin

   if (xx=max) then x:=-1;
   if(yy=may)then y:=-1;
   if(xx=1)then x:=1;
   if(yy=1)then y:=1;

   xx:=xx+x;
   yy:=yy+y;
   gotoxy(xx,yy);
   write('o');

   delay(100);

   gotoxy(xx,yy);
   write(' ');

   zistovacka(lvl,b);
   padam(xx,yy,b,lvl);
  end;
 end;


   procedure zakladna(lvl,b:integer);(*zakladna procedura, ktora vyvolava ostatne a zabezpecuje prvotne zobrazenie gulicky*)
 var x,y,xx,yy:integer;
 begin
  odrazy:=0;
  lvl:=lvl+1;
  if lvl=9 then won(lvl,odrazy);
  x:=1;
  y:=1;

  xx:=random(max+1);
  yy:=random(may+1);

  gotoxy(xx,yy);
  write('o');

  boardlvl(lvl,b);

  gotoxy(xx,yy);
  write('o');

  move(xx,yy,x,y,b);
 end;



begin
 clrscr;
 randomize;
 gamestarted;
 lvl:=0;
 max:=80;
 may:=50;
 odrazy:=0;
 b:=11-lvl;
 zakladna(lvl,b);
end.
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Príspevok od používateľa juho »

napriklad preto ze ked sa ma zmenit to b tak by malo byt globalne alebo aspon odkazom napr procedura left(var b,lvl:integer)
Napísať odpoveď