Mi a hiba a programomban?
A feladatom hogy 2 darab tank lövi egymást.Az egyik a képernyő tetején a másik az alján van és tudnak lőni és mozogni.
program motor;
uses crt;
var q:char;
ido:word;
tvx,tvx2,Lx,Ly,Lx2,Ly2:byte;
lottem:boolean;
begin
//univerzális motor:
ido:=0;
tvx:=40;
lottem:=false;
//torpedóvető kezdőhelyzet
gotoxy(tvx,24);
write('v');
repeat
//eseményvezérlő:
q:='%'; //q semleges értéke
if keypressed then q:= readkey;
case q of
'a','A':begin
if tvx>1 then
begin
gotoxy (tvx,24);
write(' ');
tvx:=tvx-1;
gotoxy (tvx,24);
write('v');
end;
end;
'd','D': begin
if tvx<80 then
begin
gotoxy (tvx,24);
write(' ');
tvx:=tvx+1;
gotoxy (tvx,24);
write('v');
end;
end;
' ': begin
lottem:=true;
Ly:=23;
Lx:=tvx;
end; //space eset
end; //case
//időfüggő vezérlő
ido:=ido+1;
if ido=4000 then
begin
ido:=0;
if lottem then
begin
gotoxy (Lx,Ly);
write(' ');
Ly:=Ly-1;
gotoxy (Lx,Ly);
write('*');
writeln(' ');
end;
gotoxy(tvx2,10);
write('v');
repeat
//eseményvezérlő:
q:='%'; //q semleges értéke
if keypressed then q:= readkey;
case q of
'k','K':begin
if tvx2>1 then
begin
gotoxy (tvx2,24);
write(' ');
tvx:=tvx-1;
gotoxy (tvx2,24);
write('v');
end;
end;
'j','J': begin
if tvx2<80 then
begin
gotoxy (tvx2,24);
write(' ');
tvx2:=tvx2+1;
gotoxy (tvx2,24);
write('v');
end;
end;
(' '): begin
lottem:=true;
Ly2:=23;
Lx2:=tvx2;
end; //space eset
end; //case
//időfüggő vezérlő
ido:=ido+1;
if ido=4000 then
begin
ido:=0;
if lottem then
begin
gotoxy (Lx2,Ly2);
write(' ');
Ly2:=Ly2-1;
gotoxy (Lx2,Ly2);
write('*');
writeln(' ');
end;
until q=chr(27);
end.
1. Indentáld (szóval a ciklusmagokat, a függvény-/eljárástörzseket és a feltételek bekövetkeztekor végrehajtandó részeket kezdd bentebb) és struktúráld a kódot, mert így nehezen áttekinthető.
2. Használj valamilyen kódmegosztó oldalt (pastebin .com, pastie.org), mert hozzászólásba illesztve a kód olvashatatlan.
3. A 2. "időfüggő vezérlő" külső feltétele nincs lezárva.
4. A belső hátultesztelő ciklus sincs lezárva.
Elképesztő ötlet volt a kérdésbe írni egy százsoros programot. Így minden egyes válasz vagy csak megnézés előtt óriás műlesiklást kell végeznie a GYK-közösség boldogtalan tagjainak.
Egy kiadós indentálási munkafolyamaton már túl vagyok, de annyi erőm már nem maradt, hogy meg is értsem a szándékot. Mindenesetre úgy tűnik, a blokkok lezárásával időnként gondjaid akadnak, de ezen túl sem világos minden. Ha már tudod, hogy hasznosak a beszélő változónevek, miért nem tartod magad következetesen ehhez a dicséretes gyakorlathoz? Mit csinál az IDO változó (nyilván idő, de hogy működik, mert valódi időmérést nem látok)? Az állandóan ismétlődő feladatokat miért nem rakod beszédes nevű eljárásokba? Gondolom, ezzel is gyorsítani akarod, de igazán hasznosnak nem tűnik, cserébe viszont így jóformán átláthatatlan az ökörh*gyozás módjára kanyargó kód. Mi haszna van a kommentjeidnek (a blokkvégek helyénvaló azonosításán kívül), ha kínosan ügyelsz arra, hogy még véletlenül se áruld el, mi a talányos nevű változók szerepe, és a gombnyomások milyen műveletet hajtanának végre. Ha a programod működne, mindez nyilván kiderülne, de egyelőre még nem állt be ez a kedvező állapot, némi módosítással is csak 'v' betűk kiírását és végtelenbe rohanó pluszjeleket sikerült kicsiholnom belőle. Ráadásul engem már megfertőzött SimkoL a korrekt kisbetűs/nagybetűs utasításnevek használatával is, ez még külön kellemetlenné teszi a programod olvasgatását. Igen, a pascal erre nem érzékeny, de ha valaha más nyelvvel is próbálkozol, sokat szívsz majd, ha most megszokod ezt a lezser stílust.
Na jó, mára több mint eleget küzdöttem. Kiszerveztem eljárásokba, ami vélekedésem szerint oda való, de az továbbra is homályos, hogy az IDO változóval mit csinálsz; Valami sejtelem azt súgja, hogy végtelen ciklust eredményez. Nem látom a SPACE hatására beállított és soha vissza nem álló LOTTEM változó feladatát sem, de azt sem, hogy miért vonatkozik minden mozgatás az alsó sorra -- nem, mintha eljutottam volna addig, hogy az A/D bármit is megmoccantott volna nekem a képernyőn, csak a GotoXY-értékek alapján gondolom. Fogalmam sincs, hogy mi vetné végét a vélhetőleg lövedéket jelentő pluszjelek kiírásának, holott erre egy a képernyő magasságának megfelelő kötött hosszúságú for-ciklus elegendőnek tűnik. Elég furcsán hat a GotoXY utasításokkal menedzselt képernyőn a WriteLn, nem értem, miért a jobbra eső K billentyű mozgat balra, a J pedig jobbra, TVX2 mozgatásakor miért TVX értéke csökken, és valahol az egész képernyőpozícionálás kisiklik valami disznóság miatt, aminek a detektálásához már fáradt vagyok.
Szerintem dolgozz még rajta...
Mit kéne, hogy csináljon a Space megnyomása?
Vesztemre néztem bele most reggel is, mert belefájdult a fejem. Estig más dolgom van, de kíváncsian várom, mi sül ki ebből az egészből.
Annyira jó ezt visszanézni :D
Szerencsére jóó távol maradtam az informatikától. Az akkor tanárom pedig egy szemétláda volt, és semmi távpontot nem adott nekünk a feladat elkészítésére, és ezért fordultam az internet népéhez.
Utólag is köszönöm a segítséget mindenkinek.
A privátban engem ócsároló embereknek pedig külön köszönet illeti!
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!