Írtam egy Snake-t pascalban. Elvileg működnie kéne, de nem jó. Mi lehet a baj?
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.
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
A program elején futtasd le a randomize eljárást:
randomize;
Remélem, ez megoldja a problémát.
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!
(*
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.
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?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!