Pascal játék segítség?
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.
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.
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.
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.
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).
-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
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.
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.
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!