Kezdőoldal » Számítástechnika » Programozás » Írtam egy Snake-t pascalban....

Írtam egy Snake-t pascalban. Elvileg működnie kéne, de nem jó. Mi lehet a baj?

Figyelt kérdés

Azt leszögezem, hogy tudom, hogy folyamatosan nyomni kell a gombot, hogy menjen a kígyó, és kanyarodásnál nyomot hagy maga után. Ezeket5 majd később megpróbálom megoldani, de a legnagyobb probléma az, hogy az elején letesz egy kaját (amit ha felvesz a kígyó, akkor nő), és miután "megette" azt a kaját, nem jön újabb kaja. Pedig többször is ellenőriztem és kéne működjön. Leírom az algoritmust, elmondanátok mi a baj vele?


program snake;


uses crt;

var x,y,x2,y2:integer;

gomb:char;

irany:integer;

hossz:integer;


begin

clrscr;

x:=random(74); y:=random(74); gotoxy(x,y); write('*'); x2:=x; y2:=y;

x:=30; y:=30; hossz:=3;

gotoxy(30,30); write('***');


repeat


gomb:=readkey;


if gomb='s' then irany:=2;


if gomb='w' then irany:=4;


if gomb='a' then irany:=1;


if gomb='d' then irany:=3;


case irany of

1:begin

x:=x-1;

gotoxy(x,y);

write('*');

gotoxy(x+hossz,y);

write(' ');

gotoxy(x,y);

delay(100);

end;


2:begin

y:=y+1;

gotoxy(x,y);

write('*');

gotoxy(x,y-hossz);

write(' ');

gotoxy(x,y);

delay(100);

end;


3:begin

x:=x+1;

gotoxy(x,y);

write('*');

gotoxy(x-hossz,y);

write(' ');

gotoxy(x,y);

delay(100);

end;


4:begin

y:=y-1;

gotoxy(x,y);

write('*');

gotoxy(x,y+hossz);

write(' ');

gotoxy(x,y);

delay(100);

end;

end;


if (x2=x) and (y2=y) then begin

hossz:=hossz+1;

x2:=random(74); y2:=random(74); gotoxy(x2,y2); write('*'); gotoxy(x,y);

end;


if x>75 then gomb:=#27;

if x<1 then gomb:=#27;

if y>75 then gomb:=#27;

if y<1 then gomb:=#27;


until gomb=#27;


end.


2011. aug. 27. 13:25
1 2
 1/17 anonim ***** válasza:
A random függvényt inicializálni kell. Talán itt lesz a hiba.
2011. aug. 27. 13:47
Hasznos számodra ez a válasz?
 2/17 A kérdező kommentje:
ŐŐ, bocs kezdő vagyok. elmondanád, mi az az inicializálás? Vagy hogy hogy kell csinálni?
2011. aug. 27. 13:48
 3/17 anonim ***** válasza:

Ha szépen megkérsz és írsz nekem egy mailt, akkor igyekszem majd megkeresni az én snake verziómat.


Abban lehetett a gép ellen is játszani, nem kellett folyamatosan gombot nyomni, számolta a pontokat és na jól elszórakoztam a megírásával 15 évesen. :D

2011. aug. 27. 13:57
Hasznos számodra ez a válasz?
 4/17 anonim ***** válasza:

A program elején futtasd le a randomize eljárást:

randomize;


Remélem, ez megoldja a problémát.

2011. aug. 27. 14:17
Hasznos számodra ez a válasz?
 5/17 tabaki ***** válasza:

Kedves Kérdező!



A programod első pillantásra is ezer sebből vérzik. Előrebocsátom, hogy én magam is dilettáns vagyok, és még ennél is sokkal bénábban kezdtem, tehát nem bántásként mondom, de egyelőre hülyeségek tárháza. Például, figyelembe véve, hogy a kígyó el tud görbülni, mit érsz azzal, hogy az aktuális irányban számolva törlöd a farkát, ahol ebben az esetben üres kocka van? Emiatt minden kanyarodáskor leszakadó darabok maradnak utána. Induláskor miért az x,y változóknak adsz véletlen értéket, és másolod át x2,y2-be? Miért nem rögtön azok kapják? Elegáns az, hogy x=30; y=30; gotoxy(30,30);? Hiszen beállítás után a változókkal intézed a pozícionálást! Legyen x=30; y=30; gotoxy(x,y); Nem?



A feldobott problémára az egyik lehetséges válasz: Miből gondolod, hogy létezik mondjuk y=68 érték? Turbo Pascalban (arról van szó?) a legnagyobb felbontású karakteres képernyő 80x50-es, mellesleg ezt sem állítod be korrekt módon. Egy y=50-nél nagyobb érték vagy képernyőn kívülre esik és nem látszik, vagy a képernyő bal felső sarkában jelenik meg (nem tudom, melyik az igaz), de a kígyó amúgyis ott jár, hiszen az általad közölt változatban már az első kaja is kötelezően oda kerül, így a megjelenése észrevétlen marad.


Anélkül, hogy komolyabban megpróbálnám gatyába rázni a programodat, javaslom az első begin után a következő két sor beszúrását:


Randomize; (*Véletlen kezdöérték a Random() függvény számára*)


TextMode(258); (*A legnagyobb felbontású színes képernyő*)


Ezután a y=Random(74) helyett legyen mondjuk y=Random(49)+1 (a GotoXY elvileg 1 kezdőpozícióval indul, az esetleg keletkező 0 érték ugyanide ír, de tisztázatlan helyzetet jelent).


Nem ártana, ha a kaja más karakter lenne, mint a kígyó, mert így nem látszik, ha ugyanoda kerül (mellesleg ez is egy kikerülendő probléma).


A fentieken túl is bőven lesz még javítani való a programodon. Privátban elküldhetnéd a fejlesztés során alakuló változatokat, ha tudok, szívesen segítek. Sok sikert!

2011. aug. 28. 11:57
Hasznos számodra ez a válasz?
 6/17 tabaki ***** válasza:
Ja, bocs, az értékadásoknál természetesen mindenhol a kettőspontos egyenlőségjel használandó. De régen paszkáloztam...
2011. aug. 28. 12:01
Hasznos számodra ez a válasz?
 7/17 tabaki ***** válasza:

(*

Mindig ráfaragok a segítőkészségemmel.Azt gondoltam volna pedig, hogy érdekel. Na mindegy, azért küldök egy módosított változatot. Pont olyan messze van még a késztől, mint a tied, csak működik.

*)


program snake;



uses crt;



const


balszele=2;


jobbszele=78;


teteje=2;


alja=49;


keretbalszele=balszele-1;


keretjobbszele=jobbszele+1;


keretteteje=teteje-1;


keretalja=alja+1;


hosszmax=100;



var x,y,x2,y2,i:integer;


gomb:char;


irany:integer;


hossz:integer;


kukac:array[0..hosszmax,0..1] of word;



begin


Randomize;


TextMode(258);


TextBackground(2);


clrscr;



gotoxy(keretbalszele,keretteteje);


for x:=keretbalszele to keretjobbszele do write(#178);


gotoxy(keretbalszele,keretalja);


for x:=keretbalszele to keretjobbszele do write(#178);


for y:=teteje to alja do begin


gotoxy(keretbalszele,y); write(#178);


gotoxy(keretjobbszele,y); write(#178);


end;



x2:=random(jobbszele-balszele)+balszele; y2:=random(alja-teteje)+teteje;


gotoxy(x2,y2); write(#3);


x:=(jobbszele-balszele) div 2+balszele; y:=(alja-teteje) div 2+teteje;


hossz:=2;


for i:=0 to hosszmax do


begin


kukac[i,0]:=0; kukac[i,1]:=0;


end;


gotoxy(x,y); write(#2#219#219);


kukac[0,0]:=x; kukac[0,1]:=y;


kukac[1,0]:=x+1; kukac[1,1]:=y;


kukac[2,0]:=x+2; kukac[2,1]:=y;



repeat



if (readkey=#0) then begin


gomb:=readkey;



case gomb of


#75:begin (*balra*)


x:=x-1;


end;



#80:begin (*le*)


y:=y+1;


end;



#77:begin (*jobbra*)


x:=x+1;


end;



#72:begin (*fel*)


y:=y-1;


end


end;



gotoxy(kukac[hossz,0],kukac[hossz,1]);


write(' ');


for i:=hossz downto 1 do


begin


kukac[i,0]:=kukac[i-1,0];


kukac[i,1]:=kukac[i-1,1];


gotoxy(kukac[i,0],kukac[i,1]);


write(#219);


end;


kukac[0,0]:=x; kukac[0,1]:=y;


gotoxy(x,y);


write(#2);


delay(100);



if (x2=x) and (y2=y) and (hossz<hosszmax) then


begin


hossz:=hossz+1;


x2:=random(jobbszele-balszele)+balszele;


y2:=random(alja-teteje)+teteje;


gotoxy(x2,y2); write(#3); gotoxy(x,y);


end;



end;



if


(x>jobbszele) or (x<balszele)


or (y>alja) or (y<teteje)


then gomb:=#27;



until gomb=#27;



end.

2011. szept. 1. 00:41
Hasznos számodra ez a válasz?
 8/17 tabaki ***** válasza:
Hm. Érdekesen írja ki a becopyzott szöveget, remélem, kimásoláskor meg összesűríti...
2011. szept. 1. 00:46
Hasznos számodra ez a válasz?
 9/17 A kérdező kommentje:

Szia!

Persze hogy érdekel, azért kérdeztem, csak nem voltam egy ideje a neten, azért nem tudtam megnézni a válaszod és reagálni rá.


Ha az nem jó, hogy a kígyó hosszából adódóan törlöm vissza a képernyőt, mert kanyarkor nyomot hagy (ez nálam a megoldandó problémák közé tartozott), akkor hogy javaslod a kéretlen *-ok törlését?

2011. szept. 2. 14:40
 10/17 A kérdező kommentje:
Ja, és amúgy nem turbo, hanem freepascalt használok.
2011. szept. 2. 14:41
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!