Kezdőoldal » Számítástechnika » Programozás » Pascal játék segítség?

Pascal játék segítség?

Figyelt kérdés

Elkezdtem pascalban az amőba játékot csinálni de vannak benne hibák(meghát biztos van elég sok hülyeség is a kódban), és nem tudom megcsinálni hogy normálisan működjön.

Még nagyon kezdő vagyok úgyhogy ha írtam valami bődületet ne oltsatok inkább normálisan mondjátok el mi a baj.Előre is köszönöm a normális válaszokat.



2012. jún. 18. 18:49
1 2
 1/13 A kérdező kommentje:

Itt a kód:

uses Graph,crt;

var d,m,i,c,k,n,l:Integer;

t:array[1..9] of integer;

a:array[1..9] of integer;


procedure x(Ix1,Ix2,Iy1,Iy2,Jx1,Jx2,Jy1,Jy2:integer);

begin

Line(Ix1,Ix2,Iy1,Iy2);

Line(Jx1,Jx2,Jy1,Jy2);

end;


procedure o(x,y,r:integer);

begin

circle(x,y,r);

end;


procedure rand;

var j,n:byte;

begin

j:=1;

randomize;

k:=random(9);

t[j]:=k; inc(j);

if k=0 then

rand;

end;


procedure g;

var j:byte;

begin

{readln(c);

if t[j]=c then begin

writeln('A negyzet foglalt'); g(j); end else inc(j); }

for j:=1 to 9 do begin

for l:=1 to 9 do

begin

if (t[j]=k) and (a[l]=k) then

rand else n:=1;

end; end;

end;


Begin

InitGraph(d,m,' ');

setcolor(red);


rectangle(100,100,400,400);

rectangle(100,100,200,200);

rectangle(200,200,400,400);

rectangle(200,200,300,300);

rectangle(100,100,300,300);

rectangle(300,300,400,400);


n:=1; l:=1;

for i:=1 to 5 do begin

readln(c);

a[l]:=c; inc(l);

rand;

if n=2 then

g;

case c of

1: x(100,100,200,200,200,100,100,200);

2: x(200,100,300,200,300,100,200,200);

3: x(300,100,400,200,400,100,300,200);

4: x(100,200,200,300,200,200,100,300);

5: x(200,200,300,300,300,200,200,300);

6: x(300,200,400,300,400,200,300,300);

7: x(100,300,200,400,200,300,100,400);

8: x(200,300,300,400,300,300,200,400);

9: x(300,300,400,400,400,300,300,400);

end;

{setfillstyle(1,blue);

floodfill(101,101,red): }

case k of

1: o(150,150,30);

2: o(250,150,30);

3: o(350,150,30);

4: o(150,250,30);

5: o(250,250,30);

6: o(350,250,30);

7: o(150,350,30);

8: o(250,350,30);

9: o(350,350,30);

end;

end;

readln;

CloseGraph;

End.

2012. jún. 18. 18:50
 2/13 anonim ***** válasza:

Ha magadtól írtad, kifejezetten ügyes:)


Néhány javítás:

ha további felhasználásra szánod a kódot (vagy más is értse meg) érdemes beszélő nevű változókat és rengeteg commentet ( // vagy {} ) hagyni a kódban.

a readln nem jó grafikus nézetben, helyette wincrt és readkey (readkey char-ba olvas, onnan val-lal alakíthatod számmá)

Érdemes lenne 1 tömbben tárolni a tábla jeleit, és tabla[k]:='x' ilyesmivel írni bele - megkönnyíti a felülírás ellenőrzését

k:=random(8)+1 és akkor nem kell a 0-val külön vacakolni

n-et nem használod sehol, így magára pakolja

a rand nem vizsgálja sehol hogy üres-e a mező

rand-on belül a t[j] mindig 1-re mutat, mert 1-re állítod az elején.

2012. jún. 18. 20:25
Hasznos számodra ez a válasz?
 3/13 A kérdező kommentje:

Kösz :)

Javítottam bizonyos dolgokat:

Iskolába csinálom mint egy projekt amire utolsó jegyet kapom, ez dönti el hogy átmegyek-e infóból.Mi így tanultuk használni a változókat tehát sztem a tanárnő és más is az osztályból érteni fogja.

Tudom hogy readkey-el jobb lenne csak így nekem érthetőbb, előbb megcsinálom a lényeget aztán utolsó símításként javítom az ilyen kisebb dolgokat.

Lapoztam egy kicsit a régebbi füzetemben és rájöttem hogy meg lehetne oldani kétdimenziós tömbbel(mátrix) és megpróbáltam átírni, bizonyos változókat is átírtam.

2012. jún. 18. 21:03
 4/13 A kérdező kommentje:

Itt az új kód:

uses Graph,crt;

const n=3;

var d,m,c,k,i,j:Integer;

t:array[1..3,1..3] of integer;


procedure x(Ix1,Ix2,Iy1,Iy2,Jx1,Jx2,Jy1,Jy2:integer);

begin

Line(Ix1,Ix2,Iy1,Iy2);

Line(Jx1,Jx2,Jy1,Jy2);

end;


procedure o(x,y,r:integer);

begin

circle(x,y,r);

end;


procedure rand;

begin

k:=random(9)+1;

{if k=0 then

rand; }

end;


procedure user;

begin

for i:=1 to n do begin

for j:=1 to n do begin

case c of

1: if t[1,1]=0 then t[1,1]:=1 else t[1,1]:=2;

2: if t[1,2]=0 then t[1,2]:=1 else t[1,2]:=2;

3: if t[1,3]=0 then t[1,3]:=1 else t[1,3]:=2;

4: if t[2,1]=0 then t[2,1]:=1 else t[2,1]:=2;

5: if t[2,2]=0 then t[2,2]:=1 else t[2,2]:=2;

6: if t[2,3]=0 then t[2,3]:=1 else t[2,3]:=2;

7: if t[3,1]=0 then t[3,1]:=1 else t[3,1]:=2;

8: if t[3,2]=0 then t[3,2]:=1 else t[3,2]:=2;

9: if t[3,3]=0 then t[3,3]:=1 else t[3,3]:=2;

end;

end; end;

end;


procedure com;

begin

for i:=1 to n do begin

for j:=1 to n do begin

case k of

1: if t[1,1]=0 then t[1,1]:=2 else t[1,1]:=1;

2: if t[1,2]=0 then t[1,2]:=2 else t[1,2]:=1;

3: if t[1,3]=0 then t[1,3]:=2 else t[1,3]:=1;

4: if t[2,1]=0 then t[2,1]:=2 else t[2,1]:=1;

5: if t[2,2]=0 then t[2,2]:=2 else t[2,2]:=1;

6: if t[2,3]=0 then t[2,3]:=2 else t[2,3]:=1;

7: if t[3,1]=0 then t[3,1]:=2 else t[3,1]:=1;

8: if t[3,2]=0 then t[3,2]:=2 else t[3,2]:=1;

9: if t[3,3]=0 then t[3,3]:=2 else t[3,3]:=1;

end;

end; end;

end;


Begin

randomize;

InitGraph(d,m,' ');

setcolor(red);


rectangle(100,100,400,400);

rectangle(100,100,200,200);

rectangle(200,200,400,400);

rectangle(200,200,300,300);

rectangle(100,100,300,300);

rectangle(300,300,400,400);


for i:=1 to n do

for j:=1 to n do

t[i,j]:=0;


for i:=1 to 5 do begin

readln(c);

user;

rand;

com;

case c of

1: x(100,100,200,200,200,100,100,200);

2: x(200,100,300,200,300,100,200,200);

3: x(300,100,400,200,400,100,300,200);

4: x(100,200,200,300,200,200,100,300);

5: x(200,200,300,300,300,200,200,300);

6: x(300,200,400,300,400,200,300,300);

7: x(100,300,200,400,200,300,100,400);

8: x(200,300,300,400,300,300,200,400);

9: x(300,300,400,400,400,300,300,400);

end;

{setfillstyle(1,blue);

floodfill(101,101,red): }

case k of

1: o(150,150,30);

2: o(250,150,30);

3: o(350,150,30);

4: o(150,250,30);

5: o(250,250,30);

6: o(350,250,30);

7: o(150,350,30);

8: o(250,350,30);

9: o(350,350,30);

end;

end;

readln;

CloseGraph;

End.


Szóval még annyi lenne hogy a matrix-ban ellenőrzi hogy ne legyen 2x ugyanaz a jel viszont ezt hogyan oldjam meg hogy grafikusan is működjön(remélem érthetően fogalmaztam).

2012. jún. 18. 21:03
 5/13 anonim ***** válasza:

-Az alapprogramban ugyanaz az i számolja az 5 kört ami a 'user'ben az oszlopokat, ezért sosem fog megállni.

-A 'user'ben miért jó, hogy ha x ban lent akkor kört tesz rá? Inkább addig kellene bekéregetni 'c'-t, amíg üres helyre nem teszi - ugyanez a randomgenerálással is - ez lesz a megoldás a grafikus részére is

-Kicsit egyszerűbbnek tűnt nekem az egydimenziós tömb, mert nem kellett két változóval végigmenni

-Felhasználónak valami instrukció, x-re kilépés, egyéb finomhangolások

2012. jún. 18. 22:02
Hasznos számodra ez a válasz?
 6/13 anonim ***** válasza:
Ja és random(8)+1, mert 0->8 generálja, a +1-el lesz 1->9
2012. jún. 18. 22:03
Hasznos számodra ez a válasz?
 7/13 Srapnel ***** válasza:

Azért a mező sorszáma és koordináták közötti átszámolás nem olyan bonyolult és megspórolja a case-eket.

Ha n = 1..9 (sorszám) és (x, y) a táblában koordináták, ahol x, y = 1..3, akkor:


n = ((x-1) + (y-1) * 3) + 1

(x, y) = ( (n-1)%3 + 1, (n-1)/3 + 1 )


Ahol "/" egész osztás (div), "%" maradékképzés (modulo).


Ha n = 0..8, (x,y)=(0..2, 0..2) lenne, akkor a "-1"-ek és "+1"-ek elhagyhatók a képletekből.

2012. jún. 19. 07:46
Hasznos számodra ez a válasz?
 8/13 A kérdező kommentje:

Elkészült a program az én hülye módszeremmel viszont volna pár hibám:

-Hogyan csináljam meg hogyha betelik a tábla és nem nyert senki akkor írja ki hogy döntetlen és ezzel állítsa le a "com" alprogram hívásait mert külömben stack overflow error lesz.

-Az "iras" alprogram vmiért nem működik rendesen de nem tudom miért, előre is köszönöm a válaszokat.

Itt a kód:

uses Graph,crt;

const n=3;

var d,m,c,k,i,j,l:Integer;

s:char; ok:boolean;

t:array[1..3,1..3] of integer;


procedure x(Ix1,Ix2,Iy1,Iy2,Jx1,Jx2,Jy1,Jy2:integer);

begin

Line(Ix1,Ix2,Iy1,Iy2);

Line(Jx1,Jx2,Jy1,Jy2);

end;


procedure o(x,y,r:integer);

begin

circle(x,y,r);

end;


procedure nyer;

begin

ok:=false;

if

(t[1,1]=1) and ((t[1,1]=t[1,2]) and (t[1,2]=t[1,3])) or

(t[2,1]=1) and ((t[2,1]=t[2,2]) and (t[2,2]=t[2,3])) or

(t[3,1]=1) and ((t[3,1]=t[3,2]) and (t[3,2]=t[3,3])) or

(t[1,1]=1) and ((t[1,1]=t[2,1]) and (t[2,1]=t[3,1])) or

(t[1,2]=1) and ((t[1,2]=t[2,2]) and (t[2,2]=t[3,2])) or

(t[1,3]=1) and ((t[1,3]=t[2,3]) and (t[2,3]=t[3,3])) or

(t[1,1]=1) and ((t[1,1]=t[2,2]) and (t[2,2]=t[3,3])) or

(t[1,3]=1) and ((t[1,3]=t[2,2]) and (t[2,2]=t[3,1]))

then

begin

ok:=true;

outtextxy(450,450,'Nyertel') end

else ok:=false;

end;


procedure veszt;

begin

ok:=false;

if

(t[1,1]=2) and ((t[1,1]=t[1,2]) and (t[1,2]=t[1,3])) or

(t[2,1]=2) and ((t[2,1]=t[2,2]) and (t[2,2]=t[2,3])) or

(t[3,1]=2) and ((t[3,1]=t[3,2]) and (t[3,2]=t[3,3])) or

(t[1,1]=2) and ((t[1,1]=t[2,1]) and (t[2,1]=t[3,1])) or

(t[1,2]=2) and ((t[1,2]=t[2,2]) and (t[2,2]=t[3,2])) or

(t[1,3]=2) and ((t[1,3]=t[2,3]) and (t[2,3]=t[3,3])) or

(t[1,1]=2) and ((t[1,1]=t[2,2]) and (t[2,2]=t[3,3])) or

(t[1,3]=2) and ((t[1,3]=t[2,2]) and (t[2,2]=t[3,1]))

then

begin

ok:=true;

outtextxy(450,450,'Vesztettel') end

else ok:=false;

end;


procedure user;

begin

readln(c);

case c of

1: if t[1,1]=0 then t[1,1]:=1 else begin outtextxy(10,10,'A negyzet foglalt'); user; end;

2: if t[1,2]=0 then t[1,2]:=1 else begin outtextxy(10,18,'A negyzet foglalt'); user; end;

3: if t[1,3]=0 then t[1,3]:=1 else begin outtextxy(10,23,'A negyzet foglalt'); user; end;

4: if t[2,1]=0 then t[2,1]:=1 else begin outtextxy(10,28,'A negyzet foglalt'); user; end;

5: if t[2,2]=0 then t[2,2]:=1 else begin outtextxy(10,33,'A negyzet foglalt'); user; end;

6: if t[2,3]=0 then t[2,3]:=1 else begin outtextxy(10,38,'A negyzet foglalt'); user; end;

7: if t[3,1]=0 then t[3,1]:=1 else begin outtextxy(10,43,'A negyzet foglalt'); user; end;

8: if t[3,2]=0 then t[3,2]:=1 else begin outtextxy(10,48,'A negyzet foglalt'); user; end;

9: if t[3,3]=0 then t[3,3]:=1 else begin outtextxy(10,53,'A negyzet foglalt'); user; end;

end;

end;


procedure com;

begin

k:=random(8)+1;

case k of

1: if t[1,1]=0 then t[1,1]:=2 else com;

2: if t[1,2]=0 then t[1,2]:=2 else com;

3: if t[1,3]=0 then t[1,3]:=2 else com;

4: if t[2,1]=0 then t[2,1]:=2 else com;

5: if t[2,2]=0 then t[2,2]:=2 else com;

6: if t[2,3]=0 then t[2,3]:=2 else com;

7: if t[3,1]=0 then t[3,1]:=2 else com;

8: if t[3,2]=0 then t[3,2]:=2 else com;

9: if t[3,3]=0 then t[3,3]:=2 else com;

end;

end;


procedure szor1;

begin

case c of

1: if t[1,1]=1 then x(100,100,200,200,200,100,100,200);

2: if t[1,2]=1 then x(200,100,300,200,300,100,200,200);

3: if t[1,3]=1 then x(300,100,400,200,400,100,300,200);

4: if t[2,1]=1 then x(100,200,200,300,200,200,100,300);

5: if t[2,2]=1 then x(200,200,300,300,300,200,200,300);

6: if t[2,3]=1 then x(300,200,400,300,400,200,300,300);

7: if t[3,1]=1 then x(100,300,200,400,200,300,100,400);

8: if t[3,2]=1 then x(200,300,300,400,300,300,200,400);

9: if t[3,3]=1 then x(300,300,400,400,400,300,300,400);

end;

end;


procedure szor2;

begin

case k of

1: if t[1,1]=2 then o(150,150,30);

2: if t[1,2]=2 then o(250,150,30);

3: if t[1,3]=2 then o(350,150,30);

4: if t[2,1]=2 then o(150,250,30);

5: if t[2,2]=2 then o(250,250,30);

6: if t[2,3]=2 then o(350,250,30);

7: if t[3,1]=2 then o(150,350,30);

8: if t[3,2]=2 then o(250,350,30);

9: if t[3,3]=2 then o(350,350,30);

end;

end;


procedure iras;

begin

if ok=true then begin

delay(1000);

cleardevice;

outtextxy(320,230,'Uj jatek?(I/N)');

outtextxy(320,250,'Esc a kilepeshez');

s:=readkey;

if (s=#73) or (s=#105) then

l:=1 else if (s=#78) or (s=#110) then

l:=6;

if (s=#27) then l:=6;

end;

end;


Begin

randomize;

InitGraph(d,m,' ');

setcolor(red);


rectangle(100,100,400,400);

rectangle(100,100,200,200);

rectangle(200,200,400,400);

rectangle(200,200,300,300);

rectangle(100,100,300,300);

rectangle(300,300,400,400);


for i:=1 to n do

for j:=1 to n do

t[i,j]:=0;


repeat

user;

szor1;

nyer;

iras;

com;

szor2;

veszt;

iras;

until ok=true;

readln;

CloseGraph;

End.

2012. jún. 19. 20:25
 9/13 anonim ***** válasza:
Jajj, irgalmatlanul túlbonyolítottad, így nem programozást hanem esetkezelést tanulsz meg.
2012. jún. 19. 21:52
Hasznos számodra ez a válasz?
 10/13 anonim válasza:
nézetek meg itt vannak információk [link]
2012. jún. 22. 22:23
Hasznos számodra ez a válasz?
1 2

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

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!