Í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.
Nos, végigfutottam azon a verzión, amit írtál és bevallom őszintén, hogy nagy részét nem fogtam fel. Nem tudtam kiigazodni a sok zárójelen meg az ilyeneken kukac[0,i].
Na mindegy kösz a segítséget. Végülis nem az a lényeg, hogy megcsinálják helyettem, csak hogy előrébb zökkentsenek.
Kösz.
Free Pascalban csak linux alatt próbáltam ki, ott a spéci karakterek nem voltak jók, de a program nagyjából működött, remélem nálad is megy majd. A kukac-tömbről: nem tudom, hogy ténylegesen hogyan szokás megoldani a dolgot. de szerintem mindenképpen tárolni kell a kukac minden darabkájának XY koordinátáit, hogy értelmesen tudjon kanyarogni. Ezt egy hosszú kétdimenziós tömbben könyvelem, a következőképpen:
0 1
0 X0 X0
1 X1 X1
2 X2 X2
3 X3 X3
.
.
n Xn Yn
Tehát szépen párosával eltárolja az egymást követő darabok X és Y koordinátáit. A tömbnek elvileg olyan hosszúnak kéne lennie, hogy beleférjen egy egész képernyőt betöltő kukac minden darabja, de egyszerre nem mozgatjuk az egészet, csak addig, amit a HOSSZ változó mutat. Mozgáskor tehát először is megkeresi a kukac farkának X és Y koordinátáit (KUKAC[HOSSZ, 0] és KUKAC[HOSSZ, 1]), és ott törli a karaktert. Ezután visszafelé számolva egy ciklus az öszes darab koordinátapárjába az eggyel kisebb elem koordinátáit tölti, és nyomban fel is rajzolja oda az elemeket. Magyarán: A kukac farka oda fog kerülni, ahol előzőleg az előtte levő darab volt, az előtte lévő oda fog kerülni, ahol a kettővel előbbi volt, és így tovább, egészen a kukac nyakáig, amely arra a helyre kerül, ahol az imént a feje volt. A feje -- vagyis a 0. bejegyzéspár -- pedig a billentyűzetről kapott új X és Y értékeket tárolja, illetve GOTOXYval ezekre a koordinátákra rajzolódik ki.
Ha a magyarázat nem világos, játszd le mondjuk egy sakktáblán parasztokkal a folyamatot, az ilyen szemléletes megoldások sokszor érthetőbbek a szóbeli magyarázatnál.
A sok zárójeles kifejezéssel általában a keret felrajzolását bonyolítottam meg. Tudom, hogy az eredetihez semmi szükség keretre, de gondoltam, nem árt, ha a működtetési próbák során le tudod szűkíteni a pályát, nem kell ungot-berket bejárnod a túlsó ficakban megjelenő falatért. Bátran játszadozz a BALSZELE, JOBBSZELE, TETEJE, ALJA konstansokkal, hogy lásd az eredményt.
Az irányítás is bonyolultabbnak tűnhet, de bocs, a harmadik évezred elején használjunk inkább nyílbillentyűket. Eggyel többször kell beolvasni őket, különben dettó.
Nem bánnám, ha arról is beszámolnál, hogy nálad mit csinál a program (akár érted, akár nem), én meg esetleg bővebben is kifejtem a problémás részeket. Közben valószínűleg megpróbálom Windows alatt is a FP-t, rajta van a gépen, csak én Lazarusból szoktam használni, közvetlenül nemigen került még a szemem elé.
0 1
*Megint nem úsztam meg baromság nélkül!
A táblázat helyesen:
0 X0 Y0
1 X1 Y1
2 X2 Y2
3 X3 Y3
.
.
n Xn Yn
Vagyis minden elemhez egy X meg egy Y érték tartozik.
Nálam mit csinált? Volt egy keret, amit el lehetett tüntetni, ha azon mentem a kígyóval. (ezt nehéz elkerülni).
Azon kívűl pedig jó volt, ha ettem nőtt, és jól kanyarodott.
Csak azt hogy lehetne megcsinálni, hogy ne kelljen mindig nyomni a gombot a menéshez?
Nnna, Windows alá is telepítettem a Free Pascalt, tehát végre megláthattam élesben, mit végeztem. Mondhatom, nem voltam különösebben megelégedve magammal. A Turbo olyasmiket is elfogadott, amiket nem lett volna szabad, ez áttéve széjjelzilálta a képernyőt. A mostani változatot már FP-ban javítgattam, tehát elvileg jól kéne mennie. A tökéletességtől még fényévnyire van, de legalább a Windows-alakban tűrhetően jelenik meg.
A továbbiakban nem áll szándékomban a többszáz soros programocskát válasz formájában küldözgetni, hanem fölraktam egy lapra, ahonnan letöltheted, illetve a megoldásaimat illető magyarázatokat is találhatnál mellé. Sajnos, az utóbbi az áldatlan időhiány okán egyelőre nemcsak torzóban, de egyenesen töredékben maradt, ám majd apránként kiegészítgetem.
Ami a folyamatos menést illeti, a sima ReadKey helyett valószínűleg a KeyPressed-et kéne használni, a ReadKey csak akkor jönne, amikor már biztos, hogy megnyomtad a gombot, különben várakozni fog. Így viszont, ha nem nyomtál gombot, mehet magától tovább a legutolsó irányba, ha viszont igen, akkor nem kell várakoznia, hanem rögtön be tudja olvasni. Mindez azonban kisebb gondnak tűnik bizonyos egyebek mellett (például, hogy a kígyó ne keresztezhesse saját magát, vagy, hogy a kaja ne jelenhessen meg a kígyóban), úgyhogy szerintem ráér akkorra, amikor már minden egyéb rendben megy. Így legalább jól vizsgálható, hogy mi történik.
A tömbkezelés ismertetése után hozzákezdtem az én programváltozatom elemzéséhez:
Nem bánnám, ha visszajeleznél, hogy egyáltalán elolvasod-e ezeket a szösszeneteimet, vagy álljak le nyugodtan. Kíváncsi lennék a te megoldásaidra is -- ha névtelen akarsz maradni, te is tedd fel valahova, és csak linket küldj.
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!