2048 3D Csapatnév: kurkomisi Név: Kurkó Mihály-Zsolt Elérhetőség: e-mail:
[email protected] telefon: 0756538916 Iskola: Márton Áron Gimnázium Felkészítő: Demeter István-Hunor Az én projektem egy játék, amelyet egy nem rég megjelent, felkapott internetes játék, a 2048 ihletett. A 2048 egy 4x4-es négyzetrácson játszódik, és lényege, hogy a rácson megjelenő számok tologatásával a 2 hatványaiból kirakjunk 2048-at. Az egész rácsot mozgatjuk négy irányban, a mozgatás során az azonos értékek összecsúsznak, és összeadódnak. Az én verzióm hasonló tulajdonságokkal rendelkezik, csupán bevezettem egy harmadik dimenziót és a négyzeteket kockákkal helyettesítettem, a kockákat pedig nem csak fel, le és oldalra lehet mozgatni, hanem hátra és előre is. A ‘Z’ dimenzió megjelenésével megnő az üres helyek száma, ezért elég, ha a kocka-rács mérete 3x3x3. A kockák felgyűlésével a hátul elhelyezkedő kockák nem látszanak jól, ezért lehetővé tettem a nézőpont változtatását. A játék a Unity 4.3 nevű fejlesztői környezetben készült, a C# nyelv felhasználásával. Az interneten való megosztás még nincsen kész, de terveim szerint a Notepad++ kódszerkesztőben fogok rajta dolgozni PHP, HTML és Javascript nyelvek segítségével.
A 2048 3D bemutatása programozóknak A 2048 3D alapja egy main camera, amely a Unity felhasználóbarát részében van létrehozva. Maga a játék egy ehhez a kamerához csatlakozó C# alapú fájlban van kódolva. A játék indulásakor a program érzékeli a kamerához csatolt forráskódot, és futtatja a kód Start() függvényét, a továbbiakban ez a forráskód határozza meg a játékot. A Start() függvény memóriát foglal a globálisan létrehozott kockákat (cube[,,]), és a kockák értékeit tároló tömböknek (value[,,]), értéket ad nekik, beállítja a kamera állását, még végrehajt néhány fontos értékadást, és két kockát felkészít a játékra.
Új kocka felkészítésére a NewCube() függvény hívódik meg, itt megvizsgálódik, hogy lehetséges-e új kocka berakása: akkor lehetséges, ha a legutóbbi mozdítás óta történt változás a kockák pozícióját illetően, illetve ha nincs betelve az összes üres hely, vagy ha be van telve és lehet mozdítani valamelyik kockát. A kockák csak egyszer inicializálódnak, helyük állandó, egy kocka elmozdításakor a kiindulási pontban levő kocka eltűnik, mig a célpontban levő kocka megjelenik. Az értékek mozgásáról a value tömb felel, abban cserélnek helyet az értékek.
A mozdíthatóságot a Movable() függvény vizsgálja, minden kockára megnézi, hogy a 6 irányban van-e a kockával azonos értékű kocka. A 6 irány a dx, dy és dz tömbökben tárolódik: dx: {0,0,0,0,1,-1} dy: {1,-1,0,0,0,0} dz: {0,0,1,-1,0,0} egy-egy irányt ezen tömbök azonos pozícióján találunk meg, a viszonyítási alap, azaz a vizsgálandó kocka x koordinátájához a dx egyik indexén található értéket, az y-hoz a dy, a z-hez pedig dz ugyanazon indexein található értékeket hozzáadva megkapjuk egy bizonyos irányban elhelyezkedő kocka koordinátáit a cube és a value tömbben. Pl. az (1,1,1) pozíción elhelyezkedő kockától jobbra elhelyezkedő kocka koordinátái (1+dx[5], 1+dy[5],1+dz[5]), azaz (2,1,1), így általánosan tudjuk kezelni az irányokat. A kódrész: bool Movable(){ for (int i=1; i<=n; ++i) for(int j=1;j<=n;++j) for(int k=1;k<=n;++k) for(int l=0;l<6;++l) if(value[i,j,k]==value[i+dx[l],j+dy[l],k+dz[l]]) return true; return false; } A külső három ciklus a kockákon megy végig egyenként, a belső pedig a hat irányon, vagyis az előbb említett 3 tömbön, majd minden kockára megvizsgálódik, hogy a szomszédja egyenlő-e vele. A példából kitűnik, hogy a szélső kockáknak nem kell minden irányt vizsgálni (az (1,1,1) kockának csak felfele, befele és jobbra lehet szomszédja). Hogy ne kelljen letárgyalni a szélső eseteket, és ne történjen kihivatkozás, a value tömb körbe van véve -1 értékekkel, így a függvény a szélső kockákat is belsőknek tekinti. A kockák véletlenszerű pozíción jelennek meg a játékban, a véletlenszerűségről a Rand() függvény gondoskodik, amely a játékidő függvényében számol. Továbbá a Rand() függvény segítségével dől el, hogy az új kocka értéke 2, vagy 4 legyen. Egy 4-es érték felbukkanásának valószinűsége 20:1, ez úgy oldható meg, hogy a függvény 1 és 20 között generál, és ha a generált érték egy meghatározott érték (esetünkben 4, de lehetne ez akármelyik másik is 1 és 20 között), akkor a kocka értéke 4 lesz, különben 2.
A bemenetet az Update() függvény kezeli. 7 lehetséges bemenetet vesz figyelembe: A fel, le, jobbra, balra, hátra és előre mozgatás a felfele, a lefele, a jobbra, a balra nyilak, az ’a’ és a ’d’ gombok lenyovásával lehetséges ebben a sorrendben. Ezeknek megfelelően meghívódnak az Up(), a Down(), a Right(), a Left(), a Back() és a Front() függvények, melyek mindenike megvizsgálja, hogy az illető irányba melyik kockát meddig lehet elmozdítani, és elmozdítja azt. Egy hátra, jobbra és lefele tolás egymás után a következőképpen néz ki:
Az ’s’ gomb lenyomása lehetővé teszi a kamera pozíciójának mozgatását a középpont körül az ’Y’ tengelyen. Miután a felhasználó lenyomta az ’s’ gombot, az ’a’ gomb és a balra mutató nyíl lenyomása a balra, illetve a ’d’ gomb és a jobbra mutató nyíl lenyomása a jobbra forgatást teszi lehetővé. A forgatásra vonatkozó kódrész: transform.RotateAround (center,new Vector3(0.0f,-1.0f*speed,0.0f),1.0f); center – a középpont, ami körül forog speed – a forgatás sebessége Egy ’Y’ tengely körüli forgatás a következő képeken figyelhető meg:
Az OnGUI() függvény felel a menüpontokért, itt formázodik a New Game gomb, a betűstílus, és itt íródik ki az összegyűjtött pont.
A 2048 3D bemutatása felhasználóknak A 2048 3D egy egyszerű játék, amely egy 3x3x3-as kockarácson játszódik, és lényege, hogy a rácson megjelenő számok tologatásával 2 hatványaiból kirakjunk 2048-at. Az egész rácsot mozgatjuk hat irányban: fel, le, jobbra, balra, hátra és előre a felfele, a lefele, a balra, és a jobbra néző nyilak, valamint az ’a’ és ’d’ gombok lenyomásával. A mozgatás során az azonos értékek összecsúsznak, és összeadódnak. Ahhoz, hogy az összes kocka értéke látható legyen, meg lehet változtatni a nézőpontot, az ’s’ gomb lenyomása után, az ’a’ gomb és a balra mutató nyíl lenyomása a balra, illetve a ’d’ gomb és a jobbra mutató nyíl lenyomása a jobbra forgatást teszi lehetővé. Ilyenkor a kockákat nem
lehet mozgatni. Ha az ’s’ gombot még egyszer lenyomjuk, a forgathatóség ismét megszünik, és folytathatjuk a játékot. A bal felső sarokban található New Game gomb megnyomásával új játékot kezdhetünk. A játékban összegyűjtött pontok a bal alsó sarokban jelennek meg.
Jó Szórakozást! ;)