Kezdőoldal » Számítástechnika » Programozás » Milyen játékot vagy projektet...

Milyen játékot vagy projektet készítsek (pascal)?

Figyelt kérdés
Pascalban tanulunk programozni és nemrég elkezdtük a grafikát, még csak az alapokat tanultuk de már kéne készítsünk egy kis játékot vagy akármilyen projektet aminek van valami értelme, és jegyet kapunk érte, de nem tudom hogy mit csináljak, ötleteket várok.Grafikából amit tanultunk:Alakzatok rajzolása(kör, téglalap,háromszög),háttérszín és alakzatszín, alakzatok mozgatása(akár billentyűkkel).Kérlek segítsetek fontos.

2012. jún. 14. 22:02
1 2 3 4 5
 21/45 Srapnel ***** válasza:

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.

2012. jún. 19. 08:11
Hasznos számodra ez a válasz?
 22/45 Srapnel ***** válasza:

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.

2012. jún. 19. 08:38
Hasznos számodra ez a válasz?
 23/45 Srapnel ***** válasza:

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)

2012. jún. 19. 08:41
Hasznos számodra ez a válasz?
 24/45 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:23
 25/45 tabaki ***** válasza:

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:


[link]

2012. jún. 20. 19:38
Hasznos számodra ez a válasz?
 26/45 A kérdező kommentje:
Kösz a választ, viszont nem tudom letölteni a progit.
2012. jún. 21. 11:31
 27/45 tabaki ***** válasza:

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ó:


[link]

2012. jún. 22. 17:34
Hasznos számodra ez a válasz?
 28/45 tabaki ***** válasza:
Most, hogy újraolvasom a fentieket, nyilvánvalónak látszik a stack owerflow oka: A programod nem kezeli a döntetlent, ezért teli tábla esetén a COM rutinod végtelen ciklusban, rekurzívan hívja magát, és ezzel túlterheli a vermet. Bővebben a progidat elemző oldalon.
2012. jún. 22. 17:45
Hasznos számodra ez a válasz?
 29/45 tabaki ***** válasza:

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:


[link]

2012. jún. 27. 21:38
Hasznos számodra ez a válasz?
 30/45 A kérdező kommentje:
Vége van a sulinak, végülis rosszabra számítottam de végül megkaptam a kívánt jegyet, a lényeg hogy nem szeretném abbahagyni természetesen érdekel még a játék és természetesen a programozás.Kösz az oldalakat, még nem néztem át teljesen csak belenéztem de ígérem hogy át fogom fésülni.Előre is kösz hogy ennyit fáradtál értem.Ment a zöldkéz :)
2012. jún. 29. 19:49
1 2 3 4 5

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!