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
 11/17 A kérdező kommentje:

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.

2011. szept. 2. 14:51
 12/17 tabaki ***** válasza:
100%

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é.

2011. szept. 2. 18:01
Hasznos számodra ez a válasz?
 13/17 tabaki ***** válasza:
100%

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.

2011. szept. 2. 18:07
Hasznos számodra ez a válasz?
 14/17 A kérdező kommentje:

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?

2011. szept. 3. 15:02
 15/17 tabaki ***** válasza:

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.


[link]


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.

2011. szept. 5. 20:36
Hasznos számodra ez a válasz?
 16/17 tabaki ***** válasza:
100%
Hát, a magyarázatot azóta sem folytattam,de két újabb próbaváltozatot raktam a [link] lapra. Futtatáskor a Windows konzolablakát a képernyő méretére kell igazgatni, mert nagyobb a pálya (igazad volt, valóban lehet y>50). Az utolsó mutat egy megoldást a folyamatosan menő kígyóra.
2011. szept. 7. 01:00
Hasznos számodra ez a válasz?
 17/17 tabaki ***** válasza:

A tömbkezelés ismertetése után hozzákezdtem az én programváltozatom elemzéséhez:


[link]


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.

2011. szept. 11. 10:33
Hasznos számodra ez a válasz?
1 2

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

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!