Hogy csináljam meg?
Az a feledat hogy a képernyő tetejé van 1 tank( 'v' betű) és a képernyő alján a második.Tudnak mozogni és lőni is.De valamiért csak az első tankot rajzolja ki.
program motor;
uses crt;
var q:char;
ido:word;
tvx,tvx2,Lx,lx2,Ly,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;
end;
until q=chr(27);
//2.tank
begin
//univerzális motor:
ido:=0;
tvx2:=23;
lottem:=false;
//torpedóvető kezdőhelyzet
gotoxy(tvx2,14);
write('v');
//eseményvezérlő:
q:='%'; //q semleges értéke
case q of
'h','H':begin
if tvx2>1 then
begin
gotoxy (tvx2,14);
write(' ');
tvx:=tvx-1;
gotoxy (tvx2,14);
write('v');
end;
end;
'j','J': begin
if tvx2<80 then
begin
gotoxy (tvx2,14);
write(' ');
tvx2:=tvx2+1;
gotoxy (tvx2,14);
write('v');
end;
lottem:=true;
end;
' ': begin
Ly2:=13;
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;
end;
end;
end.
@SimkoL:
Egy követőd mindenesetre akad... Bocs, suli van, a programodat majd később megnézem.
@SimkoL:
Pöpec lett az új oldalad.
Off:
@tabaki:
Még töltögetem a régi cuccokat és ami újonnan felmerült - C, C++ - hoz még nem értem el -. Nulláról írtam az egészet, ezért kicsit lassan halad és merülnek még fel pici problémák.
Igyekeztem egy számomra és mások számára is elfogadható színvilágot megálmodni és értelemszerűen szétbontani a tartalmat.
Örülök, hogy tetszik, akkor tovább folytatom :)
„Nem értem miért kell leköpködni csak azért mert nem értek valamit.”
Bocs, de ez a való tények számodra tetszetősebb olvasata. A (tapintatosan szólván) korholást nem azért kaptad, mert a kódod egyelőre működésképtelen. Ettől még látszik rajta, hogy rengeteget kínlódtál vele, és sok részlete nem is nevezhető rossznak. Viszont két nappal ezelőtt kaptál egy csomó hasznos útmutatást, ehhez képest úgy jössz vissza, mint a Bourbonok a forradalom után, akik „semmit se tanultak, és semmit se felejtettek” (Talleyrand). Körülbelül semmit sem fogadtál meg a tanácsokból, viszont ugyanazokat a hibákat módszeresen újra elköveted. Van, akinél ez már kiveri a biztosítékot.
Nem értem, hogy ugyanazt a témát miért kellett egy újabb kérdésbe raknod, ráadásul ugyanazzal az otromba melléfogással, amire már az első kérdésnél is nyomatékosan figyelmeztettünk. A végtelenségbe nyúló kérdés rendkívül kényelmetlenné teszi a válaszadást, ráadásul, mint tapasztalhattad,
ezen az oldalon
nem megoldható
a sorok behúzása,
ezért mindenki, aki foglalkozna a problémáddal, előbb kénytelen átszerkeszteni az egész kódodat, hogy lássa, miről van szó egyáltalán. Ezek után inkább kisebb világcsodája, hogy akad, aki megteszi.
„a tanárom nem a legsegítőkészebb”
Itt viszont azok vagyunk -- egy okkal több, hogy ne szomorítsd az életünket. Például én is megírtam azt a programot, amit SimkoL, csak ő jobban, ezért nem közlöm. Ettől még egyrészt rengeteget matattam vele, másrészt továbbra is valószínűsítem, hogy te nem pont ezt akartad, de az idomtalan méretű kérdésbe még mindig nem fért bele, hogy pontosan mit. Az előző javaslatokat nem ismétlem meg, azokat leszel szíves amott elolvasni, de egy dologra fölhívnám a figyelmedet: Nem szerencsés munkamódszer, hogy írsz egy baromi hosszú kódot, amelynek a felét sem gondoltad át, utána meg csodálkozol, hogy nem működik. A pascal nagyon alkalmas arra, hogy apró részletekben oldd meg a feladatot. Például ezt szeretnéd:
'A' esetén a felső tank balra megy
'D' esetén a felső tank jobbra megy
'J' esetén a alsó tank balra megy
'K' esetén a alsó tank jobbra megy
A program megfelelő helyén megírod a választást a kívánt eljárások nevével:
case muvelet of
'A': FelsoTankBalra;
'D': FelsoTankJobbra;
'J': AlsoTankBalra;
'K': AlsoTankJobbra;
end;
A programtörzs előtt megcsinálod hozzá ezeket az eljárásokat, amelyeknek még semmit sem kell tudniuk, például:
procedure FelsoTankBalra;
begin
end;
...stb. Mikor kész, lefordítod. Lefordul? Ha igen, van egy semmit sem csináló, de kerek egész programod, nem pedig egy félkész össze-vissza valami, amiről kérdéses, hogy majd három és fél óra múlva mint fog viselkedni az első próba alkalmával. Vagyis arra törekedj, hogy a programod minden fejlődési stádiumában lefordítható és futtatható legyen.
Elkezdheted kidolgozni, mondjuk mindegyik eljárás írja ki, hogy mit csinál:
procedure FelsoTankBalra;
begin
WriteLn('A felső tank balra megy.');
end;
Fordítás után megint van egy kész programod, amellyel tesztelni tudod, hogy a billentyűparancsok tényleg azt teszik-e, amit elképzeltél. Ha a programod szerkezete jó, megírhatod a tényleges teendőket, eljárásonként, külön-külön. Lehet, hogy még csak az egyik tank mozgatását írtad meg, azt is csak balra, de a programod többi részével addig sem kell foglalkoznod, mert az csírájában, de készen van. Tehát, ha valami nem stimmel, akár a fordításnál, akár a működéskor, tudni fogod, hogy hol keresd a hibát.
Megeshet, hogy az eljárásokat még nem tanultátok, de ezeket a programrészeket közvetlenül az elágazásokba írva is ugyanígy fejlesztheted. Igaz, így a beszélő eljárásnevek elmaradnak, tehát ezeken a helyeket érdemes kommentelni -- mégpedig azt közölve, hogy az adott részlet mit csinál, nem pedig olyan jól hangzó, de haszontalan dolgokat, mint „univerzális motor”, „időfüggő vezérlő”, vagy „space eset”. Az utóbbi különösen tetszik: A vak is láthatja, hogy a space művel valamit, de hogy mit... Ez kábé annyira hasznos, mintha lelkiismeretesen megmagyaráznád a sorok után, hogy „matematikai művelet”, vagy „értékadás”. Azt írd oda, hogy a program szempontjából milyen feladatot lát el.
SimkoL programja eljárásokkal és kisebb módosításokkal:
Automata tankok küzdelme (ehm, van még rajta csiszolgatni való):
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!