Milyen játékot vagy projektet készítsek (pascal)?
Csak hogy segítsek valami konkrétat.
Amőba játék elemei:
1. Belső adat/állapot - Minden pillanatban tartalmazza a tábla állapotát.
Ez lehet egy 2d tömb, ahol pl. az alábbi kódolással van az infó eltárolva:
0: üres mező
1: Játékos#1 jele
-1: Játékos#2 jele
2: Játékos#1 kigyűlt 5-ösének jele
-2: Játékos#2 kigyűlt 5-ösének jele
Mik kellhetnek még?
- Egy metódus/függvény, amely egy adott koordinátapárra lekérdezi a tábla mezőjét
- Egy metódus/függvény, amely egy adott koordinátapárra beállítja a tábla mezőjét
- Egy metódus/függvény, amely egy adott koordinátapárra megmondja, hogy a táblán belül van-e
- Egy metódus/függvény, amely egy adott koordinátapárra megnézi, hogy abból a mezőből kiindulva van-e kigyűlt 5-ös [*]
Ha kigyűlt, akkor be is jelöli az 5-ös jeleit (ld. előző felsorolás)
- Esetleg két függyény, ami megmondja a tábla méretét
Ezt így be lehet csomagolni egy egységbe (vagy fejben, vagy egy osztályba, ha objektumorientáltan programozol).
2. Megjelenítés
Semmi mást nem csinál, mint hogy felrajzolja az előző, belső állapotnak megfelelően a táblát
3. Vezérlés
Fogadja a felhasználói inputot, ami jelen esetben max. 3 dolog lehet:
- Új játék kezdeményezése (pl. ha épp győzött valaki, vagy az elején, vagy bármikor)
- Lépés
- Kilépés (akár bármikor is)
A lépésnél annyit kell tenni, hogy az inputból kikövetkeztetni a lépés táblakoordunátáit:
a. Egérnél a tábla méreteiből (koordinátageo) és helyéből kiszámolható (görcsölj vele, gondolkozz)
b. Billentyűnél közvetlenül adott
Ezután az adattárolóban beállítod az akt. játékos jelét, ha üres helyre kattintott. Egyben meg is nézed, hogy kigyűlt-e az 5.
Tábla újrarajzolása (benne lesz a kigyűlt 5 megjelenítése is, mert az előbbi beállítja).
Ha 5 kigyűlt, akkor nyerési szöveg kiírása.
Nagyjából ennyi (vázlatosan).
[*] Az 5 kigyűlésének megnézése koordináta és vektoralgebra:
Igazából 4 egyenes mentén kell nézni: "-", "/", "|", "\". Ehhez tartozhatnak irányvektorok (táblakoordunátákban, ahol az X tengely jobbra, az Y lefelé néz és a bal felső sarok az origó): (1, 0), (1, -1), (0, 1), (1, 1). Másik négyes is lehetne, ugyanis a -1-szeresek is használva lesznek.
Ha a kiinduló pont (x, y), akkor egy adott irányvektor (v_i, i = 1..4) esetén:
- Ha (x, y) üres, akkor nincs kigyűlés
- Ha (x, y) nem üres (1 v. 2), akkor azt meg kell jegyezni, legyen ez "p", és megvan az 5-ösből 1 darab, ez legyen "n"
[A]:
- Az (x, y) + k*v_i helyen kell megnézni, hogy a tábla tartalma megegyezik-e p-vel, ha igen, akkor n = n + 1. k-t 1-től növeljük max. 4-ig, ÉS (!) addig, amíg az egész kifejezés ki nem lóg a táblából (ld. az elején a táblán való kívülesés függvényét, ami pont ehhez (is) kell). Lehet úgy is, hogy k-t nem korlátozod és akkor 5-ösök helyett többeseket is talál majd.
- Az előző pontot megcsinálni k = -1..-4 esetére is. Egy (a, b) vektor k-szorosa = (ak, bk). De az n annyiról indul, amennyi az előbb lett.
- Ha n >= 5, akkor van találat, akkor meg kell jelölni a táblában (hasonló a függvény, mint ez az egész, csak nem számol, hanem jelöl)
- Az egész cuccot [A]-tól meg kell csinálni v_1, v_2, v_3, v_4-re is, mert egy irányvektor az azt jelenti, hogy a kiinduló pontból egy adott irányban és átellenes irányban vizsgálódik.
Az egészet már csak össze kell kombinálni. Mindegy, milyen nyelven, a lényeg ez.
Tessék pszeudokódban az utóbbi:
f1(t, x, y, vx, vy, j) : { // t: tábla, (x, y): kiindulópont, (vx, vy): irányvektor, j: igen, ha át kell színezni
k = 0
p = 0
Csináld-a-végtelenségig {
ax = x + vx * k // aktuális x poz
ay = y + vy * k // aktuális y poz
Ha (ax, ay) kívül esik a táblán, akkor kilép(k)
w = t(ax, ay) // Olvas táblából, -2..+2 az eredmény
Ha w = 0, akkor kilép(k) // üres mezőhöz érkeztünk, kilép
Ha p = 0, akkor p = w // az első lépésben a p megkapja az első pont értékét
Ha p != w, akkor kilép(k) // a többi lépésben ha különbözőhöz érkeztünk, akkor kilép
Ha j, akkor t(ax, ay) = t(ax, ay) * 2 // ha jelölni kell, akkor jelölünk, így lesz az 1-ből 2, a -1-ből -2
k = k + 1
}
}
f2(t, x, y, vx, vy, j) {
k1 = f1(t, x, y, vx, vy, j)
k2 = f1(t, x, y, -vx, -vy, j)
kilép(k1 + k2) // visszaadja, hogy hányat talált egymás mellett
}
csekkol5ost(t, x, y) {
// visszaadja, hogy hányat talált egymás mellett és jelöl, ha 5, vagy annál több:
Ha f2(t, x, y, 1, 0, false) >= 5, akkor kilép(f2(t, x, y, 1, 0, true))
Ha f2(t, x, y, 1, -1, false) >= 5, akkor kilép(f2(t, x, y, 1, -1, true))
Ha f2(t, x, y, 0, 1, false) >= 5, akkor kilép(f2(t, x, y, 0, 1, true))
Ha f2(t, x, y, 1, 1, false) >= 5, akkor kilép(f2(t, x, y, 1, 1, true))
kilép(0)
}
Az utóbbit kell hívni, ha talált 5-öst, akkor beszínezi és egy 4-nél nagyobb számot ad vissza, ha nem talált, akkor 0-t.
Annyi kiegészítés, hogy f2-ben a "kilép(k1 + k2)" elé még kell ez:
Ha 0 < k2, akkor k2 = k2 - 1
(hogy a kiindulópontot ne számoljuk 2x)
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.
Hm, a crt használatából azt gondolom, hogy te is linux alatt matatsz. Sajna, az én ős-UHUs gépemen a grafika valamiért nem fordul le, ha windowsoson ki tudom próbálni, megnézem a progidat, egyelőre egy kukkot se értek belőle.
Ami a döntetlent illeti, minden lépés után számold össze, hogy hány kitöltetlen kocka van még (vagy léptess egy számlálót). Ha nincs több, ne akarjon lépni.
Az én próbálkozásom nemigen hasonlít a tiédre, de hátha éppen amiatt találsz benne valami hasznosat:
Aha! A szerver kissé rigorózus a kisbetű/nagybetűt illetően, igaza is van. Átjavítottam, már menni fog.
Némileg kiveséztem a te programodat, a förmedvényem itt olvasható:
Gondolom, a suli miatt már nem fontos, de végül mire jutottál? Elkezdtem egy újabb oldalt, némiképpen még a témához kapcsolódva:
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!