SZAKDOLGOZAT. Dajka Ferenc

Hasonló dokumentumok
GráfRajz fejlesztői dokumentáció

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Space Invaders Dokumenta cio

A Windows az összetartozó adatokat (fájlokat) mappákban (könyvtárakban) tárolja. A mappák egymásba ágyazottak.

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

A dokumentáció felépítése

Magyar Nemzeti Bank - Elektronikus Rendszer Hitelesített Adatok Fogadásához ERA. Elektronikus aláírás - felhasználói dokumentáció

ContractTray program Leírás

VII. Appletek, grafika

A TERC VIP költségvetés-készítő program telepítése, Interneten keresztül, manuálisan

FELHASZNÁLÓI ÚTMUTATÓ

EDInet Connector telepítési segédlet

DebitTray program Leírás

Image Processor BarCode Service. Felhasználói és üzemeltetői kézikönyv

Mechatronika segédlet 3. gyakorlat

13. óra op. rendszer ECDL alapok

3D koordináta-rendszerek

Operációs rendszerek. Tanmenet

Thermo1 Graph. Felhasználói segédlet

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

ServiceTray program Leírás

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05 Geodéziai Feldolgozó Program

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Szimulációs technikák

TERC V.I.P. hardverkulcs regisztráció

Telepítési útmutató. 1.1 lépés : Telepítés típusa - ablak :

Táblázatok. Táblázatok beszúrása. Cellák kijelölése

VARIO Face 2.0 Felhasználói kézikönyv

CabMap hálózat-dokumentáló rendszer

Transzformációk. Grafikus játékok fejlesztése Szécsi László t05-transform

A program telepítése

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05+ Geodéziai Feldolgozó Program

Ablak és ablakműveletek

Lakóház tervezés ADT 3.3-al. Segédlet

Programozási technológia

FELHASZNÁLÓI KÉZIKÖNYV XMAP (EXTENDED MAP) KEZELÉSI ÚTMUTATÓ (TATABÁNYA VÁROS KÖZLEKEDÉSE)

Tartalom Képernyő részei... 2

KIRA. KIRA rendszer. Telepítési útmutató v1

Mobil Partner telepítési és használati útmutató

Kalandjáték dokumentáció

Swing GUI készítése NetBeans IDE segítségével

Felhasználói kézikönyv - Android kliens

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

POSZEIDON dokumentáció (1.2)

Szia Ferikém! Készítek neked egy leírást mert bánt, hogy nem sikerült személyesen megoldani a youtube problémát. Bízom benne, hogy segít majd.

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

ReszlAd fájl, kitöltési útmutató:

Kirakós játék. Döntő február 22. Alakzatok (katalógus) DUSZA ÁRPÁD ORSZÁGOS PROGRAMOZÓI EMLÉKVERSENY 2013/2014

I. VEKTOROK, MÁTRIXOK

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

A Novitax ügyviteli programrendszer első telepítése

Java telepítése és beállítása

2. Beadandó feladat dokumentáció

PLC Versenyfeladat. XIV. Országos Irányítástechnikai Programozó Verseny Budapest, március Összeállította az EvoPro Kft.

Választó lekérdezés létrehozása

Netlock Kft. által kibocsátott elektronikus aláírás telepítése Windows XP SP3 Internet Explorer 8 böngészőbe

QGIS tanfolyam (ver.2.0)

E-Freight beállítási segédlet

CMS videó megjelenítő szoftver használata

A számítógép beállításainak megváltoztatása

Java telepítése és beállítása

4. Használati útmutatás

RIEL Elektronikai Kft v1.0

ivms-4200 kliensszoftver

* Az eszköztáron látható menüpontok közül csak a felsoroltak esetén használható a Ctrl.

ClicXoft programtálca Leírás

Gyakorlati vizsgatevékenység A

Készítette:

KATRO-FL rendszer 4CH MOBIL DVR. PC-s visszatekintő program használati utasítása

Hardver és szoftver követelmények

Megjegyzés: A programnak tartalmaznia kell legalább egy felhasználói alprogramot. Példa:

Dokumentum létrehozása/módosítása a portálon:

A Java nyelv. Dialógus ablakok. Elek Tibor

Órarendkészítő szoftver

Távolléti díj kezelése a Novitax programban

Raszter georeferálás QGIS-ben Összeállította: dr. Siki Zoltán verzióra aktualizálta: Jáky András

Programozási technológia

Operációs rendszerek. Tanmenet

OpenGL és a mátrixok

x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs mátrixa 3D-ben?

ELSŐ LÉPÉSEK A SZÁMÍTÓGÉPEK RODALMÁBA AMIT A SZÁMÍTÓGÉPEKRŐL TUDNI ÉRDEMES


Kormányzati Elektronikus Aláíró és Aláírás-ellenőrző Szoftver

Minőségellenőrzési kérdőív kitöltő program Felhasználói kézikönyv

A PowerMill egy hatékony alámarásmentes CAM rendszer, amellyel 3D-s szerszámpályákat tudunk generálni, importált CAD modellek alapján.

Mesh generálás. IványiPéter

WINDOWS TELEPÍTÉSI ÉS AKTIVÁLÁSI ÚTMUTATÓ A FOTOBETYAR.HU - PHOTOSHOP PLUGINJEIHEZ

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

Vodafone Mobile Connect telepítése

Java és web programozás

Digitális aláíró program telepítése az ERA rendszeren

Bevezető. Mi is az a GeoGebra? Tények

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

3. Osztályok II. Programozás II

A LOGO MOTION TANÍTÁSA

Teljesítményprognosztizáló program FELHASZNÁLÓI KÉZIKÖNYV

BaBér bérügyviteli rendszer telepítési segédlete év

MÁV-START Tudáspróba Felhasználói kéziköny

Szövegszerkesztés alapok WORD Formázások

Átírás:

SZAKDOLGOZAT Dajka Ferenc 2012

EÖTVÖS LORÁND TUDOMÁNYEGYETEM INFORMATIKAI KAR KOMPUTERALGEBRA TANSZÉK Egy logikai játék algoritmikus kérdései Témavezető: Szerző: Burcsi Péter Dajka Ferenc egyetemi adjunktus Programtervező ELTE IK Informatikus Bsc Budapest 2012

Tartalomjegyzék Bevezetés, a probléma leírása... - 3 - A cél röviden... - 3 - Mi a mesekocka3d... - 3 - A Rubik kocka... - 3 - A Floppy Cube... - 4 - A Mesekockáról... - 4 - A Meskocka3D... - 4 - Alapprobléma... - 5 - Az alkalmazott algoritmusok bemutatása... - 7 - Egy kocka állapotreprezentációja... - 7 - Indexelések... - 7 - Brute Force... - 8 - Fa algoritmus... - 10 - Számítógépes megvalósítás... - 11 - Fejlesztői dokumentáció... - 14 - A programtól elvért alapvető követelmények... - 14 - Szótár... - 14 - Fejlesztési környezet és felhasznált eszközök... - 18 - Felhasznált technológiák és elméletek... - 19 - A programszövegben használt konvenciók... - 22 - A program fázisai... - 23 - Használati esetek... - 25 - A program felépítése... - 28 - mesekocka3d csomag... - 28 - mesekocka3d.userinterface csomag... - 30 - mesekocka3d.graphics csomag... - 37 - mesekocka3d.threedimension csomag... - 39 - mesekocka3d.help csomag... - 45 - mesekocka3d.algorithms csomag... - 48 - mesekocka3d.adapters csomag... - 53 - Az egyes osztályok kapcsolata működés közben... - 55 - Továbbfejlesztési lehetőségek... - 56 - Tesztelés... - 57 -

Interfész tesztelése... - 57 - Hiányzó fájlok tesztelése... - 65 - Perifériák tesztelése... - 67 - Programműködés... - 70 - Felhasználói dokumentáció... - 72-1. A program rövid leírása... - 72-2. Rendszerkövetelmények... - 74 - Minimális hardver követelmények:... - 74 - Minimális szoftver követelmények... - 74-3. Telepítés, futtatás... - 74 - A Java futtatókörnyezet (JRE) telepítése... - 74 - A program telepítése, eltávolítása... - 75 - A program indítása... - 75-4. A program fogalmai... - 76-5. A képernyő részei... - 79 - A. Célkép panel... - 79 - B. 3D Játéktér... - 79 - C. Kezelőfelület és státuszinformációk... - 80 - D. Menüsor... - 80-6. Általános használat... - 80 - Játékfázisok... - 80 - Játékmódok... - 81 - Nézőpont beállítások... - 82 - Kockamozgatások, kijelölések... - 83 - Kezelőfelület használata... - 85-7. A program funkciói... - 88-8. Hibaüzenetek... - 93-9. Kapcsolat a készítőkkel... - 94 - Idézett forrásmunkák... - 94 -

Bevezetés, a probléma leírása A cél röviden A program a mesekocka néven ismert gyermekjáték számítógépes megvalósítása, a Rubik kocka egy változatának elemeivel ötvözve. A játék célja a kapott kockák megfelelő forgatással való kirakása, ehhez a program a felhasználónak egy grafikus, háromdimenziós felületet biztosít. A fejlesztés másik célja olyan algoritmusok implementálása, amelyek a kapott állapottér alapján önállóan befejező állapotba tudják juttatni a kockákat. Mi a mesekocka3d A Rubik kocka A Rubik-kocka (másként Bűvös kocka, a szabadalmi leírásban térbeli logikai játék) mechanikus, egyéni logikai játék. A kocka oldalai különféle színűek és elforgathatók a lap középpontja körül. A forgatás során a szomszédos oldalak színe megváltozik. A rendszertelen forgatással az oldalak színösszeállítása összekeverhető. (Összesen 43 252 003 274 489 856 000-féle (leírva; negyvenháromtrillió-kétszázötvenkettőbilliárdhárombillió-kettőszázhetvennégymilliárd-négyszáznyolcvankilencmilliónyolcsszázötvenhatezer) (kb. 4,3 10 19 ) eltérő állás hozható létre.) A játék célja, hogy egy előzetesen összekevert kockából forgatással visszaállítsuk az eredeti, rendezett színösszeállítást, vagyis minden oldalon azonos színű lapocskák legyenek. Rubik Ernő eleinte a 2 2 2-es kockát szerette volna megalkotni. Az első problémába akkor ütközött, amikor nem tudta, hogy hogyan lehetne úgy összeállítani ezt a kockát, hogy mind a három tengelye körül elforgatható legyen. Rubik először gumigyűrűkkel próbálta egymáshoz rögzíteni a kis kockákat, de ez így nem sikerült, mivel egy idő után a gumiszalagok elszakadtak, majd próbálkozott mágnesekkel is, de úgy meg könnyen szétesett a kocka, ezért a problémát úgy oldotta meg, hogy a kockaelemeket olyan alakúra faragta ki, hogy azok az alakjuknál fogva tartsák össze magukat. Később különböző színekkel jelölte meg az oldalakat, hogy jobban lássa, hogyan mozognak egymáshoz képest. Rubik Ernő saját bevallása szerint csak a végleges konstrukciós - 3 -

és formai kidolgozás után ismerte fel, hogy a kocka nemcsak a térbeli mozgások szemléltetésére alkalmas (mivel ezért alkotta meg), hanem jó játék, és így értékesíthető is. A kocka színezésre Rubik Ernő külön gondot fordított; ezért a kocka szabványos színezése olyan, hogy két-két átellenes (párhuzamos) oldal színei a sárga komponensben különböznek; tehát így lesz a fehérből a vele átellenes sárga, a pirosból a narancssárga, a kékből a zöld. Sikerét leginkább annak köszönheti, hogy 3 dimenziós, és akárhogy is mozgatjuk, a játék egy darabban marad. ([1]) A Floppy Cube A Rubik kockának a kitalálása óta eltelt közel negyven év alatt számtalan változata elkészült. Vannak nem csak kocka alakú, hanem téglalap, tetraéder alakú fajtái is, sőt a kockának létezik 1x1x1-es változata is. Ezek egyik fajtája a Floppy Cube néven ismert kocka, amelyben 1x3x3-as elrendezésben találhatók az elemek. A játéknak lévén, hogy eggyel kevesebb dimenziója van, sokkal kevesebb állapotba is hozható. A Floppy Cube felső és alsó sora, illetve a két szélső oszlopa forgatásával hozható a kívánt állapotba. A Mesekockáról A Mesekocka nevű játékban téglalap alakú elrendezésben találhatók festett kockák, az oldalaikon általában gyermekeknek való mesékből vett képek részleteivel. Az egyes kockákon lévő képrészletek a kockák megfelelő forgatásával, majd egymás mellé helyezésével kiadják az eredeti képet, a játék célja ennek az állapotnak az elérése. A Meskocka3D A programban az említett Floppy Cube, illetve a Mesekocka ötvözetének megvalósítása. A Floppy Cube-hoz hasonlóan kilenc darab kockánk van, ezeken képek részletei helyezkednek, a helyes célállapot, az előre kiválasztott kép kirakása. A képrészletek a kockákon úgy helyezkednek el, hogy egy kép kirakása után, minden kockán legfeljebb néhány megfelelő forgatással akármelyik másik képet megkaphatjuk. A Floppy Cube-al megegyezően itt is kockahármasokat tudunk mozgatni, de vele ellentétben a középső oszlopot és sort is tudjuk forgatni, valamint nem a hármasok közepén lévő kocka belső tengelye körül, hanem a kockák saját - oszlopok esetén mélységi, sorok esetén szélességi - tengelye körül. - 4 -

A programban háromféle játékmódot különböztetünk meg: Egyéni Egyéni módban a felhasználó feladata megfejteni a rejtvényt. A kockákat a billentyűzet segítségével rakhatja ki. Brute Force A Brute Force, más néven Nyers Erő algoritmus a nevéből is adódóan a számítógép erejét használja ki gondolkodás helyett. A kapott problémát egy adott egyszerű lépés által úgy próbálja megoldani, hogy szisztematikusan az összes lehetséges állapotot kipróbálja, és megvizsgálja, hogy az helyes-e. Ebben a játékmódban a felhasználónak semmilyen beleszólása nincs a játékmenetbe. A számítógép a Brute Force algoritmus módszerével végig próbálgatja a kocka összes lehetséges állapotát addig, amíg el nem jut a megfelelőbe. Ez előtt a program beforgatja a kockákat a megfelelő piros vagy kék állapotokba (ld. lejjebb), így az algoritmus nem teljesen Brute Force. Fa algoritmus A Fa algoritmus játékmódban a program a kockák aktuális helyzetéből állapotot generál, majd ezeket egy gráfba téve és végig vizsgálva megkeresi a lehetséges megoldást. Memóriahiány miatt csak a felső 3x2-es részre alkalmazzuk ezt a megoldást, az alsó három kockát a Brute Force algoritmus segítségével forgatjuk a megfelelő állapotba. Alapprobléma A programmal kapcsolatos alapvető probléma a gép általi kirakásokban jelentkezik, ugyanis amit az emberi szem könnyen átlát, azt a számítógép lehet, hogy több órás számítással tudja megoldani, ez a gondolatmenet fordítva is igaz, mivel az emberi és gépi logika, gondolkodás nem egyezik. Ennek egy példája, ha egy olyan állapotot veszünk, ahol egy bizonyos kép ki van rakva, de nem a kívánt, ekkor egy felhasználó könnyedén ki tudja rakni a megfelelő állapotot az emlékezetére hagyatkozva (ugyanis a helyesen elforgatott képrészletek a kockán, a többi oldalon is helyesen helyezkednek - 5 -

el). Ilyen esetben a Brute Force algoritmus száznál is több forgatást is elvégezhet szerencsétlen állapotból kiindulva. - 6 -

Az alkalmazott algoritmusok bemutatása Egy kocka állapotreprezentációja Egy kocka 24 állapotot vehet fel, 6x4, azaz a 6 kockaoldal mindegyike 4 különböző állapotban lehet, a 90 fokos forgatásokat figyelembe véve. Az állapotok számozását 0- tól indítottam, a programnyelvi indexeléssel megegyezően, egy kockán megfelelően van elforgatva az adott képrészlet, ha az állapota a négy többszöröse (0,4,8,12,16,20). Az egyes állapotátmeneteket egy előre beégetett táblázatból tudhatjuk meg, ezt korábban manuálisan, egy kockamodell alapján számoltam ki, majd vittem be a programba. Az aktuális állapotot megkaphatjuk az előző állapotból és a kockán elvégzett forgatásból. A kockák állapotaihoz tartozik még egy szín is, amely a permutációk paritását adja meg, a programban a piros színhez a 0-ás, a kékhez az 1-es szám tartozik. Színekre a Brute Force algoritmusnál van szükség. A kockák alapjáraton a 0-ás állapotba vannak forgatva, a textúrák úgy vannak elhelyezve, hogy ebből az állapotból könnyedén el lehessen jutni a többi nyerő állapotba. A keverés során a kockákat nem egyesével forgatja a program, hanem legális lépések sorozatát végzi el, így biztosítva, hogy a játék mindig befejezhető legyen. Indexelések A játékban a kockák indexelése balról jobbra, fentről lefelé történik, tehát a következőképpen néz ki: o első sor balról jobbra: 0, 1, 2 o második sor balról jobbra: 3, 4, 5 o harmadik sor balról jobbra: 6, 7, 8 Az egyes kockahármasokhoz tartozó indexeket egy tömbbe téve tároltam, ez a következőképpen néz ki: 0, 3, 6 1, 4, 7 2, 5, 8 0, 1, 2 3, 4, 5 6, 7, 8 A Fa algoritmus játékmódhoz szükség van még egy tömbre, mely az egyes kockaindexeket, és a rajtuk végezhető forgatásokat reprezentáló számokat tartalmazza: - 7 -

0,3,0 0,3,1 1,4,0 1,4,1 2, 5,0 2, 5, 1 0,1,2,2 0,1,2,3 3,4,5,2 3,4,5,3 Ahol az irányok: Brute Force o 0: BAL o 1: JOBB o 2: FEL o 3: LE A Brute Force algoritmus során a cél az összes lehetséges állapot végigjárása kockánként addig, amíg megfelelőt nem találunk, majd továbblépünk a következőre, amíg az összes kocka a helyére nem kerül. Az alapötlet az volt, hogy forgassuk ki az aktuális kockára illeszkedő sort és oszlopot, majd végezzük el a forgatások inverzeit megcserélt sorrendben, azaz ha előbb a sort forgattuk, majd az oszlopot, akkor a sor inverz műveletét végezzük el előbb, majd az oszlopét. Ezen lépések sorozatával csak az aktuális kockán végzünk módosítást, ugyanis a többi kockára csak egy forgatás, és annak egy inverz lépése hat, ami visszaforgatja azt az eredeti állapotba. Ám az ilyen forgatások a kirakandó kockát is csak három különböző állapotba hozzák. Ennek egyik oka, hogy a kocka állapotai a rajta végzett forgatások permutációjának paritása alapján is két osztályba sorolhatók ([2]). A kockán végzett páros számú forgatás más paritású permutációhoz vezet, mint a páratlan számú forgatások. Ezek alapján könnyű volt a már meglévő állapottáblázathoz hozzárendelni a megfelelő paritásokat, amelyeket egyébként a - 8-1. ábra - A keret színbeforgatása

könnyebb érthetőségért a piros és kék színekkel azonosítottam. A nullás, kezdőállapotot kéknek vettem, és az innen elvégezett összes páros lépésben elérhető állapot szintén kék lett, a többi pedig piros. A fent említett forgatás-négyessel vagy csak piros, vagy csak kék állapotokat járhatunk be, ezért az algoritmus előbb megnézi a célállapot színét, majd az összes kockát ilyen színű állapotba forgatja. Egy elmélet szerint, ha egy a játékban lévő öt kocka által alkotott keret, (azaz egy külső sor és egy külső oszlop,) színe megegyezik, akkor az azon belül lévő négy kocka színe is ilyen. A közös szín kirakása így egyszerű, a keretben előbb kirakjuk a sor és az oszlop közös kockáját a kívánt színre, majd a másik négy kockát, ha kell, át tudjuk forgatni egy-egy megfelelő művelettel a kívánt állapotba, anélkül, hogy hatással lennének egymásra. A programban a keretként a felső sort, és a bal oszlopot választottam. A korábban említett négy forgatás az aktuális kockánkon egy eldöntés és a lapján egy 90 fokos forgatást eredményez az eredeti állapothoz képest, ezzel a kocka három oldalát járjuk be, mindig ugyanazzal a három állapottal. A teljes tizenkét, azonos színű állapot bejárásához ezért a forgatásokat a következő módon végezzük: BALRA, FEL, JOBBRA, LE, BALRA, FEL, JOBBRA, LE, JOBBRA, FEL, BALRA, LE, JOBBRA, FEL, BALRA, LE. Ezáltal az összes lehetséges állapotot bejárjuk, ezt addig végezzük, amíg a kívánt kocka megfelelő állapotba nem jut. - 9 -

2. ábra a helyes állapotba hozás algoritmusa Fa algoritmus A gépi kirakás másik módja a gráfelméleten alapszik. A kockák együttes állapotát feljegyezzük, majd ebből az összes lehetséges elforgatást is, ezt a műveletet aztán elvégezzük az újonnan kreált csúcsokra is, és ezt rekurzívan végezzük olyan mélységig, amelyben már biztosan benne van a kívánt végállapot. A gráf létrejötte után bejárjuk azt, és megkeressük a kirakandó állapothoz tartozó csúcsot, ezt aztán összekötjük egy úttal, amely a kezdőállapotból a végállapotba vezető állapotok sorozatát fogja tartalmazni. A csúcsok között súlyként szerepel az előző állapotból a következőbe vivő forgatás, ezeket a forgatásokat elvégezzük egymás után, így a megfelelő végállapotba jutunk. - 10 -

3. ábra -A csúcsok generálása Egy ilyen gráf tárolásához egy átlagos számítógép sem processzor, sem memóriahasználat szempontjából nem megfelelő. A Fa algoritmus során ezért nem csak a kezdőállapotból építjük fel a gráfot, hanem mivel a végállapot is ismert, innen is indítunk egyet, ezzel lényegesen leredukálva a csúcsok számát. Egy n mélységű gráf esetén, ha az egyes csúcsok gyerekeinek száma x, akkor x n csúcsszám helyett, így 2*x n/2 csúcsot kapunk. A két gráfot egy bizonyos mélységig építjük, majd a vesszük azok metszetét, azaz két olyan csúcsot választunk ki, amely ugyanazt az állapotot tartalmazza, így a gráfunk összefüggő lesz, és elvégezhetjük benne az útkeresést. A gyakorlatban a két gráfot 7 mélységig generáltam, azonban az esetek nagy részében még így sem kaptam megoldást, ezért az algoritmus csak a játék felső 3x2-es részére működik. Minden állapotból így kétszer két sor -, illetve kétszer három oszlopműveletet, azaz összesen tíz műveletet tudunk végrehajtani, a csúcsok száma így nagyjából: 208000. Számítógépes megvalósítás A kézenfekvő ötlet, hogy az állapotokat egy hat hosszú tömbben tároljuk, a későbbi keresés és a tárolás szempontjából is sokkal költségesebb. Csúcsonként ezért hat új - 11 -

változó létrehozása helyett az egyes állapotokat egyetlen változóban tároljuk a következő módon: Az így kapott 24-es számrendszerbeli számokat aztán osztások segítségével könnyen visszaszámíthatjuk, a keres során pedig elég egy számot összehasonlítani hat helyett. ([3]) A metszet keresése viszont még így is számításigényes, így szükséges a megfelelő adatszerkezet megválasztása is. A döntés a Java által implementált hashmapre ([4]) jutott, amely kulcs érték párokat tartalmaz. A kulcsok itt a csúcsok állapotai, amelyek eleve rendezetten helyezkednek el, illetve egy kulcs csak egyszer szerepelhet benne, ez pont kapóra jön, mivel a gráfban rengeteg egyforma állapot található, de ezekből ugyanazok az új állapotok képezhetőek, így elég egyszer eltárulnunk azokat, ez jelentősen leredukálja a csúcsok 4. ábra - A csúcsok tárolókba tétele számát, és ezzel felgyorsítja a keresést. Az állapotok mellett tároljuk a kockákon elvégzett forgatásokat is értékként, ez alapján rakjuk ki később a megfelelő állapotot. - 12 -

5. ábra - A metszet keresés - 13 -

Fejlesztői dokumentáció KissDraw alapján ([5]) A programtól elvért alapvető követelmények A program legyen könnyen kezelhető, jól átlátható, felhasználóbarát. Tudjon mentést és betöltést végezni, adjon vissza információkat a játékról, és az eddigi eredményekről, ezeket és a lehetséges beállításokat grafikus felületen Jelenítse meg. Az irányítás legyen egyszerű, könnyen megérthető. Az alkalmazás ablakos módban fusson. Szótár Fogalom Jelentés Egy adott probléma programmatikus megoldását jelentő, elemi lépések véges számú halmaza által alkotott műveletsor. Az algoritmusok különböző nyelveken - Algoritmus programozási vagy akár természetes, emberi nyelven is készülhetnek, de mindenképpen egyértelműnek kell lenniük minden kérdés tekintetében, és jól meghatározott bemeneti valamint kimeneti pont(okk)al kell rendelkezniük. Egy táblázat mely tartalmazza, hogy az Állapottáblázat egyes állapotokból, egy adott irányba elforgatva a kockát, milyen új állapotot kapunk. Betöltés A Fájl menü eleme, az elmentett állapotok betöltését végzi. A Brute Force az algoritmusok egy fajtája, Brute Force amely egy bizonyos egyszerű lépéssorozatot hajt végre a probléma megoldásáig. Brute Force mód Egy játékstílus, melyben a számítógép - 14 -

végzi a kockák kirakását. A Kezelőfelületen elhelyezkedő legördülő Célkép legördülő menü menü, amelyen kiválasztatjuk a kirakandó képet. Az Információk menü része, Eddigi eredmények Egyéni mód Egységmátrix Fa Faalgoritmus mód Fájl menü információkat ad az eddigi befejezett játékokról. Egy játékstílus, melyben a játékos végzi a kockák kirakását. Olyan négyzetes mátrix, amely a főátlója egyesekből, a többi eleme nullából áll. Az összefüggő körmentes gráfokat fának nevezzük. Egy játékstílus, melyben a számítógép végzi a kockák kirakását. A Menüsor első menüje. Egy kockahármas mélységi, vagy Forgatás szélességi tengelyen való forgatása 90 fokkal pozitív, vagy negatív irányba. A gráf a matematikai gráfelmélet és a számítógép-tudomány egyik alapvető fogalma. A gráf dolgok (csomópontok, csúcsok) és rajtuk értelmezett összeköttetések (élek) halmaza. Egy Gráf gráfot megadhatunk csúcsainak és éleinek felsorolásával, vagy szemléletesebben egy diagram formájában, ahol a pontok felelnek meg a gráf csúcsainak, az őket összekötő ívek pedig az éleknek. A két megadási mód ekvivalens, azaz a gráf pusztán egy - 15 -

struktúra, semmilyen megjelenítési információt nem tartalmaz, így különböző diagramok is tartozhatnak ugyanahhoz a gráfhoz. ([6]) Időmérő Információk menü Játék fázis A Kezelőfelület része, játék közben az eltelt időről ad információt. A Menüsor második menüje. A program Keverési fázis utáni állapota, amikor a tényleges játék folyik. Az Információk menü része, Játékleírás információkat ad a játék szabályairól, használatáról. A Kezelőfelületen elhelyezkedő legördülő Játékmód választó legördülő menü menü, melyen kiválaszthatjuk az indítás előtti játékmódot. Egy háromdimenziós megjelenítő, mely a Játéktér Készítők Keverési fázis Kezdő fázis képernyő nagy részét képezi, a játék folyamata itt látható. Az Információk menü része, információkat ad a játék készítőjéről. A program azon állapota, amikor a kockák keverése történik. A program indulása utáni állapot. A képernyő jobb szélén elhelyezkedő panel, amelyen az indítás előtti Kezelőfelület beállításokat lehet elvégezni, illetve a játékról tudhatunk meg információkat játék közben. Egy kockahármast pirosra színez a Kijelölés program, ezzel jelezve, hogy ezt tudjuk majd elforgatni. - 16 -

Kilépés A Fájl menü része, a programból való kilépést végzi. A kilépéskor megjelenő üzenet, amely a Kilépés beleegyező dialógus. felhasználó beleegyezését kéri a program leállítására. A képernyő bal felső sarkában elhelyezkedő panel, amely a játék közben Kirakandó kép panel Körmentes gráf azt a képet jeleníti meg, amelyet a felhasználónak, vagy a gépnek ki kell raknia. A gráf egyetlen v csúcsából sem vezet v- ben végződő út. A Kezelőfelület része, játék közben a Lépésnapló Lépésszámláló Mentés Menüsor Nem termináló hibaüzenet Nézett pont megtett lépésekről ad információt: mely kockákat, milyen irányba, hányadik lépésben forgattuk el. A Kezelőfelület része, játék közben a megtett lépések számáról ad információt. A Fájl menü eleme, Egyéni módban az aktuális állapot elmentésére szolgál. A képernyő felső sorában a címsor alatt elhelyezkedő panel, amelyen a felhasználó a mentést, betöltés, kilépést végezheti el, illetve információkat tudhat meg a játékról. Egy felugró, hibát jelző ablak, amely nem állítja le a programot. A középső kocka közepe. Az a pont a világkoordináta rendszerben, Nézőpont ahonnan a felhasználó az eseményeket látja, a kamera helye. - 17 -

Nézőpontváltás Nyert fázis A nézőpont elmozgatása a középső kocka középpontja körüli gömb pontjain. A Játék fázis után a kockák helyre forgatásakor létrejövő állapot. A gráf bármely csúcsából el tudunk jutni Összefüggő gráf Projekciós mátrix bármely másik csúcsába az éleken keresztül. A világ-koordinátarendszert a képernyőre leképező transzformációs mátrix. Additív színmodell, mely a vörös, a zöld, RGB színtér Start gomb Termináló hibaüzenet Út Világ-koordinátarendszer és a kék fénykülönböző erősségű keverésével adja meg az egyes színeket. A játék indítását kezdeményezhetjük vele. Egy felugró, hibát jelző ablak, amely leállítja a programot. Egy csúcsból egy másikba vezető él sorozatot útnak nevezünk. A geometriai alakzatok egyes pontjait tárolja. Fejlesztési környezet és felhasznált eszközök Fejlesztési környezet: Windows 7, 64 bit Java jdk 1.6.0_25, jre6 A használt hardver: Processzor: AMD Athlon II P340 Dual-Core Processor 2.20 GHz Memória (RAM): 3GB Videókártya: ATI Mobility Radeon HD 5650-18 -

A használt fejlesztőeszköz: NetBeans IDE 7.0 A használt CASE eszköz: Microsoft Visio 2010 NetBeans IDE 6.9 UML plugin Structorizer 3.22 Egyéb eszközök: Adobe Photoshop CS5, a textúrák létrehozásához Autodesk 3ds max, a 3D objektum elkészítéséhez Felhasznált technológiák és elméletek Java A program teljes egészében Java nyelven lett írva, ennek egyik oka a nyelv függetlensége: a Java kódot bármely rendszeren, ahol a JVM telepítve van, futtatni tudjuk, függetlenül operációs rendszertől, vagy platformtól. Persze ez a program nem mobil eszközökre készült, de az OpenGL használata miatt így is csak megfelelő videokártyával rendelkező gépeken lehet futtatni. A Javaban írt programok könnyen is hordozhatók, esetünkben a játék nem igényel semmiféle telepítést, közvetlenül futtatható a főkönyvtárból, amelyet bárhol elhelyezhetünk a gépünkön. Fontos szempont még a nyelv megbízhatósága, illetve a hozzátartozó ingyenes fejlesztőeszközök, mint például a Netbeans IDE. A Java objektum orientált, ezáltal a kód nem az elvégzendő feladatok alapján, hanem a benne lévő objektumok alapján van csoportosítva, ezáltal rövidebb és átláthatóbb illetve tartósabb kódokat készíthetünk. OpenGL Az OpenGL (Open Graphics Library) egy részletesen kidolgozott szabvány, melyet a Silicon Graphics nevű amerikai cég fejlesztett ki 1992-ben. Olyan API-t takar, amely segítségével egy egyszerű, szabványos felületen keresztül valósítható meg a grafikus - 19 -

kártya kezelése és a háromdimenziós grafika programozása. Az interfész több ezer különböző függvényhívásból áll, melynek segítségével a programozók szinte közvetlenül vezérelhetik a grafikus kártyát, segítségükkel 3 dimenziós alakzatokat rajzolhatnak ki, és a kirajzolás módját szabályozhatják. Széleskörűen használják a számítógéppel segített tervezésben/gépészetben/gyártásban, a virtuális valóság létrehozatalában, a tudományos élet különböző területein, és szimulátorok esetében is. Ezenkívül használják a különféle videojátékokban, Windows, Linux, BSD platformokon (ez a,,desktop avagy hagyományos OpenGL) illetve mobiltelefonokon, játékkonzolokon (OpenGL ES). ([7]) JOGL A JOGL (Java OpenGL) egy olyan javás csomag, amely OpenGL-es utasítások használatát teszi lehetővé, alkalmazható vele a legtöbb C-ben is használható hagyományos GL utasít, illetve a GLU utasítások is. A GLUT utasítások azonban nem használhatók windowsos környezetben, ugyanis a Javanak meg van a saját ablakkezelő rendszere (awt, swing). Az utasítások használatához Javaban előbb létre kell hoznunk egy GL objektumot, amely objektum metódusain keresztül végezhetünk OpenGL-es hívásokat. A GL objektumot egy GLCanvas kontextusában kell meghívnunk. JAMA OpenGlben a forgatásokat a glrotated(double angle, double x, double y, double z) függvénnyel adhatjuk meg, ennek első paramétere a forgatás szöge, a következő paraméter, pedig az egyes tengelyeken való forgatások mértékét határozza meg. A függvény használatakor az OpenGL létrehoz egy forgatási mátrixot, amellyel beszorozza az éppen aktuális mátrixot, esetünkben az egyes háromdimenziós objektumok modellmátrixát. A modellmátrixot elmentjük, hogy az objektum legközelebb már elforgatva jelenjen meg, azonban a forgatással az X, Y, Z tengelyek is elfordulnak, ezáltal egy újabb forgatás esetén már az új X, Y, Z tengelyek körül fog az objektumunk mozogni, ami nem a szükséges mozgatást eredményezi. - 20 -

Egy megoldás lehetne, hogy minden új forgatás esetén elvégezzük az eddigi forgatásokat, az új információkat is belevéve, sorban az X, Y, Z tengelyeken, így az objektum megfelelően lenne elforgatva, ám a forgatások sorrendje sem mindegy, ugyanis egy kockát kétszer balra, majd felfelé elforgatva nem ugyanazt az állapotot kapjuk, mintha egyszer balra, egyszer fel, majd egyszer balra forgatnánk el. A probléma kiküszöbölésére a forgatás előtt, a forgatási mátrixot megszorozzuk a modellmátrix inverzével, az így kapott új mátrixszal beszorozva már megfelelően tudjuk a kockáinkat elforgatni. Ezen számítások elvégzésére ezért mátrixokra van szükségünk, amit az alap Java jdk nem tartalmaz. A JAMA (Java Matrix) egy javás csomag, amely az alapvető lineáris algebrai műveletek megvalósítását szolgálja. A csomag segítségével létrehozhatunk mátrixokat és ezeken módosításokat végezhetünk: inverz számítás, mátrixszorzás, skalárral való szorzás, LU -, QR felbontás, stb. Képfeldolgozó A programhoz a képek feldarabolását az egyes textúrákhoz egy külön programmal végeztem, a program továbbfejlesztéséhez (saját képek megadása), ezt fel lehet használni. A program a bemenetként megadott képeket 9 részre vágja, és a darabokat 9 külön mappában helyezi el..obj kiterjesztés Az obj kiterjesztés a Wavefront Technologies által fejlesztett fájl formátum, amelyben háromdimenziós objektumok adatait tárolhatjuk. A fájl sorai v, vt, vn vagy f betűvel (betűkkel) kezdődhetnek, ezek rendre pont koordináták, felületi normális adatai, textúra koordináták, illetve az egyes primitívek pontjainak sorrendje. Az oldaldefiníciónak négyféle megadási módja van: Vertex: f v1 v2 v3... Vertex/normal - 21 -

f v1/vt1 v2/vt2 v3/vt3... Vertex/normal f v1//n1 v2//n2 v3//n3... Vertex/texture/normal f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3... Az elméletre szükség volt a programban, ugyanis az objektumbeolvasást megírt metódusok híján nekem kellett elkészítenem. [(8)] Gömbi polárkoordináta rendszer A gömbfelület pontjait a felületi koordináta-rendszerekben adhatjuk meg. A koordináták mérőszáma a kör alakú koordinátavonalak ívének középponti szöge. Az elméleti vizsgálatokra használt rendszerekben ezeket a szögeket ívmértékben (radián) mérjük. Az R sugarú gömb centrumát derékszögű rendszer origójába helyezve adjuk meg a felületi pontok térbeli helyzetét. A [λ;β] koordináta-rendszer konstans vonalait a Descartes koordináta-rendszer Oz tengelyére illeszkedő illetve a rá merőleges síkok metszik ki a gömbfelületből. A pólus = (0; 0; R)= [?;0]. A λ felületi koordináta határozatlan. A koordináták értékkészlete: λ:= 0..2π; β:= 0..π. ([9]) Az egyes koordinátákat a következőképpen adhatjuk meg: x = R * sin(β) * cos(λ) y = R * sin(β) * sin(λ) z = R * cos(β). A programszövegben használt konvenciók A programban használt konvenciók a Java nyelvvel megegyezőek, azaz: o A változónevek beszédesek, utalnak a szerepükre. Minden változónév kisbetűvel kezdődik, majd új szó esetén az új szó első betűje nagy. - 22 -

o A metódusnevek beszédesek, utalnak a szerepükre. Minden metódusnév kisbetűvel kezdődik, majd új szó esetén az új szó első betűje nagy. o Az osztály adattagjait beállító metódusok set előtaggal kezdődnek, az azokat lekérők get előtaggal, valamint boolean típusú változók esetén has, vagy is előtaggal. o Az osztály konstruktorok nagybetűvel kezdődnek. o Az osztályok neve nagybetűvel kezdődik, és minden új szó esetén a szó első betűje nagy. A nevek utalnak a szerepükre. o A konstans változók minden betűje nagy, új szó esetén _ (alsóvonal)-al vannak elválasztva. o a programszövegben a változók, osztályok, metódusok nevei angolul vannak. A program fázisai 6. ábra Leírás: Kezdési fázis: A játék indításkor Kezdési fázisban van, ebben az állapotban a kockák helyköz nélkül helyezkednek el egymástól, nincsenek információk a játékmenetről, a kockákat nem lehet se kijelölni, sem mozgatni, a Mentés menüpont le van tiltva. - 23 -

Keverési fázis A játék indításakor a kockákat megkeveri a program, ebben a fázisban a Betöltés és a Mentés menüpontok is le vannak tiltva, a státuszinformációk alapállapotot mutatnak. A kockákat nem lehet sem mozgatni sem kijelölni, új játékot sem indíthatunk. Játék fázis Játék fázisban a felhasználó, vagy a számítógép feladata kirakni a kockákat, a forgatásokról, az eltelt időről és a lépésszámról már kapunk információkat, Játék fázisban már indíthatunk új játékot a Betöltés menüponttal, vagy a Start gombbal, Egyéni módban menthetünk is. Nyerési fázis Ha a kockák a játékindítás után megfelelő állapotba kerülnek, a program leállítja az időmérőt, a lépésszámlálót, letiltja a billentyűzetet és a kockákat egymástól helyköz nélkül helyezi el. Kijelöléseket és forgatásokat sem végezhetünk. Új játékot indíthatunk ebből a fázisból. - 24 -

Használati esetek 7. ábra Leírás Új játékot indít Új játék indítása esetén a program Keverési fázisba lép, majd játékfázisba, az előzetesen kiválasztott játékmódnak megfelelően. - 25 -

Kirakandó képet beállít Játék indítása előtt a felhasználó kiválasztja a kirakandó képet, a játék indításakor a Kirakandó kép panelen, a kiválasztott kép jelenik meg. Játékmódot beállít Játék indítása előtt a felhasználó kiválasztja a kívánt játékmódot, a játék indításakor ebben a módban fog a játékfázis futni. Információt lekérdez Az Információk menüben az egyes menüpontokat kiválasztva egy új ablakot jelenít meg a program, a megfelelő információval, az ablakon az OK, vagy az X gombra kattintva eltűntethetjük azt. Ha a megfelelő információt tartalmazó fájl nem létezik, a program hibaüzenetet dob egy új ablakban. Ment A Fájl menüből a Mentés menüpontot kiválasztva a program felkínál egy fájldialógust, itt a felhasználó beír egy új fájlnevet, vagy kiválaszt egy fájlt, amelybe a mentést szeretné elvégezni. A mappák között nem lehet navigálni, csak a program save könyvtárába tudunk új fájlt létrehozni. A Ment gombra kattintva megtörténik a mentés, a Mégse gombra kattintva nem történik semmi. Betölt A Fájl menüből a Betöltés menüpontot kiválasztva a program felkínál egy fájldialógust, itt a felhasználó beír egy új fájlnevet, vagy kiválaszt egy fájlt, amelyből a betöltést szeretné elvégezni. A mappák között nem lehet navigálni, csak a program save könyvtárából tudunk betöltést végezni. A Betölt gombra kattintva megtörténik a betöltés, a Mégse gombra kattintva nem történik semmi. Hibás fájl esetén a program feldob egy hibaüzenetet új ablakban. - 26 -

Kilép A Fájl menü kilépés menüpontját kiválasztva megjelenik egy ablak, melyben a felhasználó eldönti, hogy valóban ki akar-e lépni. Az Igen gombra kattintva a program működése leáll, a Nem gomb hatására nem történik semmi. 8. ábra Kockát forgat A felhasználó a billentyűzet segítségével a kockákat tudja forgatni, ennek hatására a kijelölt kockahármas a megfelelő irányba fordul. Ha a kockák helyes állapotba kerülnek, a játéknak vége. - 27 -

Kockát kijelöl A billentyűzet segítségével a felhasználó kiválaszt egy kockahármast, ekkor a megfelelő kockák a játéktéren pirosas színűvé változnak. Nézőpontot vált Az egér görgőjének segítségével a felhasználó változtathatja a nézőpont távolságát, ekkor a középső kocka közepére fókuszáló nézett pont közeledik vagy távolodik. Az egér mozgatásával, a jobb egérgomb lenyomása mellett a nézőpontot forgatni is lehet a nézett pont körül, a nézőpont ekkor átkerül a megfelelő pontba. A pontok egy a nézőpont és a nézett pont távolságú gömböt alkotnak a nézett pont középpontjával, a gömb tetején lévő pontba nem lehet eljutni. A program felépítése A program 7 fő csomagra bontható. mesekocka3d csomag 9. ábra - az osztályok közti statikus kapcsolatok A program főcsomagja, a többi hat csomag ennek az alcsomagja. - 28 -

10. ábra - mesekocka3d csomag osztályai Main.java Ősosztály: Object Az osztály egyetlen feladata, hogy létrehozzon egy új MainFrame objektumot, ezáltal elindítsa a programot. - 29 -

mesekocka3d.userinterface csomag A csomag tartalma minden olyan osztály, amely lehetőséget biztosít a felhasználónak módosítások végrehajtására a programon. Errormessage.java Ősosztály: JOptionPane 11. ábra - mesekocka3d.userinterface csomag osztályai - 30 -

Az egyes hibaüzenetek megjelenítésére szolgál, általában hiányzó fájlokról ad információt, nem függ egyéb osztálytól, akárhol meghívható a kódban, az üzenet az ablakban lévő OK gombbal eltűntethető. Konstruktor: ErrorMessage(String messagestr, boolean exitornot) messagestr: a kiírni kívánt hibaüzenetet adhatjuk meg. exitornot: igaz érték esetén leállítja a program futását. ExitMessage.java Ősosztály: JOptionPane A menü Kilépés funkciójának, illetve a főablak X gombjának megnyomásakor felugró ablak, ahol a felhasználó eldöntheti, hogy valóban ki szeretne-e lépni. Az ablak tartalma egy Igen és egy Nem gomb, alapból a Nem van kiválasztva. Credits.java Ősosztály: JOptionPane Egy új ablakot hoz létre az ősosztály showmessagedialog() metódusának felhasználásával, a készítőkről ad információt. Az ablak tartalma egy OK gomb, erre kattintva eltűntethetjük azt. FileChooser.java Ősosztály: JFileChooser Az Egyéni módban elkezdett játékok betöltéséhez, illetve mentéséhez biztosít grafikus felhasználói felületet. Fontosabb adattagok: serializator: ObjectSerializator A mentett állapotok fájlba írását és onnan való beolvasását végzi el. Fontosabb metódusok: - 31 -

load(): SerializableObject A mentett fájlban található adatokat adja vissza, a serializator segítségével. save(serializableobject serobj): void Kimenti az adatokat a serializator segítségével. setchoosersui( Container container ): void Az osztály konstruktorában hívódik meg, letiltja a dialógusablak egyes elemeit (Új mappa, Egyet fel), hogy a felhasználó csak a save mappába tudjon menteni, illetve onnan betölteni. InfoFromFile.java Ősosztály: JOptionPane Egy új ablakot hoz létre egy OK gombbal, valamint egy adott fájlból beolvasott szöveggel, az ősosztály showmessagedialog() metódusának segítségével. Konstruktor: InfoFromFile(String filepath, boolean totextarea) filepath: a beolvasandó fájl útvonala totextarea: ha igaz, a szöveget egy TextArea-ba teszi bele, amin csúszkák is vannak. Menu.java Ősosztály: JMenuBar A főablak menüsorát adja meg, a Menüben található egyes opciókat hajthatjuk végre, a menüsor két fő menüből áll: a Fájl és az Információk menü. Fontosabb adattagok: saveitem A Fájl menü Mentés eleme, a főablak save() metódusát hívja meg. loaditem A Fájl menü Betöltés eleme, a főablak load() metódusát hívja meg. - 32 -

exititem A Fájl menü Kilépés eleme, egy új ExitMessage ablakot dob fel. howtoitem Az Információk menü Játékleírás eleme, egy új InfoFromFile ablakot dob fel, a játék rövid leírásával. highscoreitem Az Információk menü Eddigi eredmények eleme, egy új InfoFromFile ablakot dob fel, amely az eddig eredményeket tartalmazza. creditsitem Az Információk menü Készítők eleme, egy új Credits ablakot dob fel. Fontosabb metódusok setsaveitemenabled(boolean isenabled):void A saveitem csak Egyéni módban engedélyezett, ennek a beállítására szolgál. setloaditemenabled(boolean isenabled):void A loaditem keverés közben nem engedélyezett, ennek a beállítására szolgál. Mainframe.java Az osztály a főablak létrehozásáért felelős, tartalma a háromdimenziós játéktér, a státuszinformációkat, beállításokat tartalmazó interfész, illetve a menüsor is itt található. Konstruktor: MainFrame() A konstruktor hívásakor létrejön egy új ablak a képernyőhöz igazított, 4:3-as arányú méretben, felkerülnek az interfész elemei: a program elindul, kezdőfázisba lép. Fontosabb adattagok: glc: GlCanvas A háromdimenziós játéktér. movesmade: JTextArea - 33 -

A lépésnaplót megjelenítő elem. gamestylescombobox: JComboBox A játékmódválasztó legördülő menü. pictofiniscombobox: JComboBox A kirakandó képet választhatjuk ki ebben a legördülő menüben. winnerstatetochange: int A pictofinishcombobox-ban kiválasztott elem alapján megjegyzi a kirakandó kép által meghatározott kockaállapotot, amely a játék indításakor átadódik a glc-nek. startbtn: JButton A játék indításáért felelős gomb. movenumcaption: JLabel A Lépésszám feliratot jeleníti meg. movenumactual: JLabel Az aktuális lépésszámot rajzolja ki. movenum: int A játék indítása óta megtett lépésszámot tartja számon. timecaption: JLabel Az Eltelt idő feliratot jeleníti meg. timeactual: JLabel Az eltelt időt rajzolja ki. timechanger: TimeChanger Az eltelt időt tárolja, illetve a timeactual kirajzolását frissíti. timer: Timer A timechanger actionperformed() metódusát hívja meg másodpercenként. pictofin: PictureToFinish A Start gomb megnyomása után a legutóbb kiválasztott kirakandó képet jeleníti meg. winscreen: WinScreen Nyert állapotban megjelenít egy képet. randommoves: RandomMovesGenerator - 34 -

A mixeléshez szükséges lépéseket generálja le. stepsmade: Vector<int[]> A mentéshez tárolja a mixelés lépéseit és az eddig megtett lépéseket. mixerth: MixerThread A játék indítása után a keverésért felelős új szál. MixerThread osztály: Egy privát osztálya a MainFrame osztálynak, a Thread-ből származik. Bemenetként egy int[][] moveslist tömböt vár, amely alapján elvégzi a keverés műveletét, ez idő alatt a Start gomb és a menü Betöltés opciója le van tiltva, a keverés után elindítja az időmérőt. treealgorithm: TreeAlgorithm A játék Fa algoritmus módban való kirakását valósítja meg. bruteforce: BruteForce A játék Brute Force módban való kirakását valósítja meg. Fontosabb metódusok: reset(): void Letiltja a billentyűzetet, eltűnteti a kijelöléseket, törli a stepsmade összes elemét, letiltja a Fájl menü Mentés elemét, ha van futó gép általi kirakás, akkor letiltja azt, vár 250 milliszekundumot, hogy az esetleges folyamatban lévő forgatások végbemenjenek. A kockákat alapállapotba helyezi, a lépésnaplót, a lépésszámlálót, az időmérőt nullázza. start(): void Egyéni játékmód indításához használt metódus. Meghívja a reset() metódust, beállítja a kirakandó képet, és jelzi a glc-nek, hogy melyik állapotot kell kirakni, majd elindít egy keverést. individual(): void Egyéni játékmód indítását végzi: megvárja a keverés végét, majd engedélyezi a billentyűzethasználatot, beállítja a kijelölést az első oszlopra, engedélyezi a Fájl menü Mentés elemét. Ezt egy új szálon teszi, hogy a keverés folyamata látszódjon a képernyőn. bruteforce(): void - 35 -

Brute Force játékmód indítását végzi egy új szálon: megvárja a keverés végét, létrehoz egy új BruteForce objektumot, majd meghívja annak solvegame(final int statetobesolved) metódusát. treealgorithm(): void Megvárja a keverést, majd az adott állapotokat átadva létrehoz egy új TreeAlgorithm osztályt, majd meghívja annak solvegame(mainframe mf) metódusát. save(): void Az adott állás információit belerakja egy új SeralizableObject-be, majd feldob egy save dialógust. load(): void A betöltés folyamatát végzi. Feldob egy új load dialógust, amely visszatérési értékét belehelyezi egy új SerializeableObjectbe. Ha a felhasználó választott ki fájlt, akkor meghívja a reset() metódust, majd elindít egy új keverést, a beolvasott információk alapján beállítja a lépésszámot, a lépésnaplót, az eltelt időt, elindítja az időmérőt. Ezek után beállítja a kirakandó képet, és jelzi a glcnek, hogy melyik állapotot kell kirakni, majd elindít egy új játékot egyéni módban. addhighscore(string strtofile): void A kapott strtofile szöveget beírja az externals/highscores.txt fájlba. Ha a fájl nem található hibaüzenetet dob. winstate(): void A glc változó segítségével eltolja a kockákat, hogy ne legyen köztük térköz, leveszi a kijelöléseket, letiltja a billentyűzetet, leállítja az időmérőt, megjeleníti a winscreen-t, meghívja az addhighscore() metódust a kapott eredményekre. - 36 -

mesekocka3d.graphics csomag Elemei a kétdimenziós grafikát megjelenítő osztályok. 12. ábra - mesekocka3d.graphics csomag osztályai Processing.java Ősosztály: JFrame Megjelenít egy új JFrame-et a játéktér közepén, melyen egy gif animációt játszik le folyamatosan, az ablak nem zárható be, nem méretezhető át, amíg jelen van, a főablak blokkolva van. Fontosabb adattagok: mainframe: MainFrame A leblokkolandó főablak. Fontosabb metódusok: dispose(): void Újra engedélyezi a főablakot, majd meghívja az ős dispose() metódusát önmagára. Screen2D.java Ősosztály: JPanel Egy bemenetként megadott képet új panelként megjelenítő absztrakt osztály. - 37 -

Fontosabb adattagok: imgtodraw: BufferedImage A megjelenítendő kép. Fontosabb metódusok: setimg(string imgsrc): void Beállítja a megjelenítendő képet a megadott elérési út alapján. Winscreen.java Ősosztály: Screen2D A nyerési fázisban megjelenő képet rajzolja ki a játéktér közepére. PictureToFinish.java Ősosztály: Screen2D A játéktéren a kirakandó képet mutatja kicsiben, a bal felső sarokba, egy 2 képpontos szegéllyel. A főablak kezelőfelületén megadható célkép legördülő menü hatására a megjelenítendő kép változik, a játék elindítása után. Fontosabb metódusok: showpic(): void Egy új szálon elindítva vár egy másodpercet, majd megjeleníti a képet három másodpercig, majd eltűnteti azt. - 38 -

mesekocka3d.threedimension csomag Az egyes háromdimenziós megjelenítéshez szükséges osztályokat tartalmazza. 13. ábra - mesekocka3d.threedimension csomag osztályai Mesh.java Ősosztály: Object Beolvas egy obj fájlt, majd menti annak adatait. Konstruktor: - 39 -

Mesh(String meshfilepath) meshfilepath: A beolvasandó objektum elérési útvonala. Entity.java Ősosztály: Object Megjelenítendő háromdimenziós objektum. Konstruktor: Entity(Mesh mesh, String texturepath) mesh: egy mesh fájl, ami megadja az objektumra vonatkozó adatokat. texturepath: az objektum textúráját tartalmazó fájl elérési útja. Statikus adattagok: ROTATION_TABLE: int[][] Az új állapotok meghatározásához szükséges táblázat, megadja, hogy mely állapotból milyen irányú forgatással melyik új állapotba jut az objektum. RED_BLUE_TABLE: int[][] Az állapotokhoz tartozó színeket adja meg. LEFT: int A balra irányt reprezentálja, értéke 0. RIGHT: int A jobbra irányt reprezentálja, értéke 1. UP: int A fel irányt reprezentálja, értéke 2. DOWN: int A le irányt reprezentálja, értéke 3. Fontosabb adattagok: model: doube[] Az objektum modellmátrixa, betöltéskor a 4x4-es egységmátrix. - 40 -

state: int Az objektum állapotát tárolja (0-23). color: int Az objektum színét tárolja (piros = 0, vagy kék = 1). rgb: int[] A kijelölés megjelenítéséhez határozza meg az RGB értékek mértékét. Fontosabb metódusok: paint(): void Elmenti az aktuális, fő világkoordináta rendszert, majd betölt egy újat, az osztály model adattagja alapján, ezután kirajzolja az objektumot, majd visszatölti a mentett fő világ-koordinátarenszert. translate(double tx, double ty, double tz): void A modellmátrix eltolás értékeit állítja be. rotate(double angle, double rx, double ry, double rz): void Forgatási értékeket állít be a modellmátrixon. calculaterotmtx(double x, double y, double z, double angle): Matrix A forgatási transzformációs mátrixot hozza létre, amellyel a modellmátrixot meg kell szorozni. select(): void Az rgb értékeket állítja be, általa az objektum kicsit pirosas lesz. deselect(): void A select() fordítottja, visszaállítja az eredeti rgb értékeket. setstateandcolorbytable(int direction): void A megadott forgatási irány alapján kiválasztja a ROTATION_TABLE-ből, illetve a RED_BLUE_TALBE-ből az egyes értékeket, amelyek a modell új állapotait reprezentálják. GlCanvas.java Ősosztály: GLCanvas A háromdimenziós játékteret megjelenítő osztály, amely megjelenít kilenc kockát. - 41 -

Statikus adattagok: EXTENDED_TRANSLATIONS_AND_STARTING_STATES: double[][] A játék indításakor az alapállapotban lévő kockák elhelyezkedését adja meg, már egymástól eltávolodott állapotban. LEFT_COL: int[] Az entities tömbben lévő kockák közül a bal oszlopban lévők indexeit adja meg. CENTER_COL: int[] Az entities tömbben lévő kockák közül a középső oszlopban lévők indexeit adja meg. RIGHT_COL: int[] Az entities tömbben lévő kockák közül a jobb oszlopban lévők indexeit adja meg. UPPER_ROW: int[] Az entities tömbben lévő kockák közül a felső sorban lévők indexeit adja meg. CENTER_ROW: int[] Az entities tömbben lévő kockák közül a középső sorban lévők indexeit adja meg. LOWER_ROW: int[] Az entities tömbben lévő kockák közül az alsó sorban lévők indexeit adja meg. ENTITY_INDEXES: int[][] Az előző hat tömböt tartalmazó tömb. FIRST_COL: int Az ENTITY_INDEXES első elemének indexe. SECOND_COL: int Az ENTITY_INDEXES második elemének indexe. THIRD_COL: int Az ENTITY_INDEXES harmadik elemének indexe. FIRST_ROW: int Az ENTITY_INDEXES negyedik elemének indexe. SECOND_ROW: int Az ENTITY_INDEXES ötödik elemének indexe. - 42 -

THIRD_ROW: int Az ENTITY_INDEXES hatodik elemének indexe. Fontosabb adattagok: distance: float A szempozíció távolságát adja meg. eyex: float A szempozíció X koordinátáját adja meg. eyey: float A szempozíció Y koordinátáját adja meg. eyez: float A szempozíció Z koordinátáját adja meg. polargamma: float A szempozíció számításához szükséges gömbi Gamma polárkoordináta. polarbeta: float A szempozíció számításához szükséges gömbi Beta polárkoordináta. actposx: float Az aktuális egérpozíció X koordinátáját tárolja. actposy: float Az aktuális egérpozíció Y koordinátáját tárolja. prevposx: float Az előző egérpozíció X koordinátáját tárolja. prevposy: float Az előző egérpozíció Y koordinátáját tárolja. entities: Entity[] A kirajzolandó kilenc objektumot tartalmazza. winnerstate: int A nyerő állapotot tartalmazza, amelybe a kockákat el kell forgatni. Fontosabb metódusok: init(glautodrawable glad): void - 43 -

Elvégzi a megjelenítéshez szükséges beállításokat (hátlapok eldobása, shadermodel stb.), beállítja a fényeket, létrehozza a kockákat, majd eltolja őket, beállítja a kezdő nézőpont értékeit. display(glautodrawable glad): void Törli a képernyőt, beállítja a nézőpontot, kirajzolja a kockákat. setcamera(gl gl, GLU glu, float distance): void A nézőpont beállítását végzi, a distance, és a két gömbi polárkoordináta alapján (polarbeta, polargamma) beállítja a nézőpont három koordinátáját. rotmultiplecubeslow(int selectionindex, int direction) throws InterruptedException: void Kilenc lépésben elfordítja a selectionindex által meghatározott kockákat direction irányba, 90 fokkal. Ezek után bejegyzést ír a lépésnaplóba, beállítja a kockák új állapotát, felveszi a lépéseket a főablak stepsmade változójába, majd leellenőrzi, hogy a kockák az elérni kívánt állapotban vannak-e. rotmultiplecubequick(int selectionindex, int direction): void Elfordítja a selectionindex által meghatározott kockákat direction irányba egy lépésben, 90 fokkal, majd vár 10 milliszekundumot. setmultiplestateandcolorsbytable(int selectionindex, int direction): void A selecitonindex paraméter által meghatározott kockákra meghívja a setstateandcolorbytable() metódust a direction paraméterrel. void setcubescloser(): void Eltolja a kockákat, hogy ne legyen térköz közöttük. setcubesextendedandstates(): void Minden kockát alapállapotba forgat, helyközökkel köztük, beállítja az állapotukat is alapállapotba. deselectall(): void Az entities összes elemén elvégzi a deselect() műveletet. setselections(int selectionindex): void A bemenő selectionindex paraméter alapján elvégzi a kijelöléseket, az eddig kijelöléseket törli. setmovestext(int selectionindex, int direction): void - 44 -

A főablak lépésnaplójába ír egy bejegyzést. isentitiesright(): void Leellenőrzi az összes kockát, hogy megfelelő állapotban vannak-e, ha igen, meghívja a főablak winstate() metódusát, ezzel a program nyert fázisba ér. mesekocka3d.help csomag A mentéshez, betöltéshez, státuszinformáció megjelenítéséhez, illetve a kockák keveréséhez szükséges segédosztályokat tartalmazza. 14. ábra - mesekocka3d.help csomag osztályai ObjectSerializator.java Ősosztály: Object A mentéshez, illetve a betöltéshez szükséges szerializációs lépéseket végzi. Fontosabb metódusok: tofile(string filepath, SerializableObject serobj): void A megadott fájlelérés alapján a serobj tartalmát menti a fájlba. fromfile(string filepath): SerializableObject - 45 -

A megadott elérési útvonal alapján visszaadja a fájlban lévő szerializált objektumot. SerializableObject.java Ősosztály: Object Mevalósítja: Serializable A mentéshez, illetve a betöltéshez szükséges információkat tárolja. Fontosabb adattagok: stepsmade: Vector<int[]> A mixelés és az utána elvégzett forgatások indexeit és irányait tárolja. time: long A kezdés óta eltelt időt tárolja. steps: int A kezdés óta megtett lépéseket tárolja. winnerstate: int A kezdéskor beállított kirakandó képhez tartozó állapot. steptexts: int A lépésnapló szövegét tárolja. RandomMovesGenerator.java Ősosztály: Object A játék elindulásakor a mixelés lépéseit határozza meg. Forgatandó kockahármasok indexeit, illetve forgatási irányokat határoz meg. Statikus adattagok: TIMES: int A generálandó véletlen lépések számát adja meg. Fontosabb adattagok: moves: int[][] - 46 -

A kockahármasok indexeit és az irányokat tárolja. Fontosabb metódusok: generate: int[][] TIMES számú elemet generál a moves tömbbe, majd visszatér azzal. TimeChanger.java Ősosztály: Object Megvalósítja: ActionListener A főablakon megjelenő eltelt idő változtatásához szükséges osztály. Fontosabb adattagok: time: long A kezdés óta eltelt időt tárolja. labeltoset: JLabel A főablak időt kirajzoló címkéjét tárolja. Fontosabb metódusok: actionperformed(actionevent e): void Megnöveli a time értékét 1000-el, formázza, majd átadja a labeltoset-nek, amely kirajzolja az időt. reset(): void Visszaállítja a time értékét 0-ra. - 47 -

mesekocka3d.algorithms csomag A gép általi kirakásokhoz szükséges osztályok. 15. ábra - mesekocka3d.algorithms csomag osztályai BruteForce.java Ősosztály: Object A játéktér (glc) objektumait forgatja addig, amíg helyes állapotba nem kerülnek. Fontosabb adattagok: terminated: boolean Indításkor az értéke hamis, ha igazzá válik, a SolveGame() metódus működése megszakad. Fontosabb metódusok: solvegame(int statetobesolved): void - 48 -

Elvégzi a megfelelő forgatásokat, a bemenetként kapott állapotba hozza a kockákat. makerotate(int selectionindex, int direction) throws InterruptedException: void Megvizsgálja, hogy a terminated értéke igaz-e, ha nem, elvégzi a forgatást a megadott kockákon, a megadott irányba. terminate(): void A terminated értékét igazra állítja. Node.java Ősosztály: Object Egy gráf csúcsát megvalósító osztály, a Fa algoritmus használatához. Statikus adattagok: INDS_AND_DIRS: int[][] A lehetséges forgatásokhoz tartozó kockák indexeit, és a forgatási irányokat tartalmazza. Fontosabb adattagok: states: int Az adott forgatás után a hat kocka állapotait 24-es számrendszerben tartalmazó változó. rots: int[] A kockákon a kiinduló állapotból elvégzett forgatások indexeit és irányát tartalmazó tömb. children: Vector<Node> A csúcs gyerekeit tartalmazza. depth: int A csúcs mélységét adja meg. Fontosabb metódusok: makenewstates(int[] inandielem): int - 49 -

A kapott INDS_AND_DIRS egy eleme alapján a megfelelő kockák állapotát írja át, majd menti vissza 24-es számrendszerbe, ezzel az értékkel tér vissza, ami a csúcs gyerekének állapota lesz. makenewrots(int index, int dir): int[] A saját rots tömbjét írja hozzá a visszatérési értékhez, majd ehhez hozzáveszi az index és dir paramétereket, mint az új forgatás adatait. makechildren(): void Létrehozza a csúcs új gyerekeit. getstateelement(int index): int A 24-es számrendszerben lévő state változóból az index-edik elemet adja meg. Iterator.java Ősosztály: Object Egy gráfon való végighaladást teszi lehetővé, a Fa algoritmusban való gráfmetszet kereséshez tárolja a két gráfot. Fontosabb adattagok: start: HashMap<Node, int[]> A kezdőcsúcsból indított gráf elemeit tartalmazza. end: HashMap<Node, int[]> A végcsúcsból indított gráf elemeit tartalmazza. Fontosabb metódusok: tostart(node n): void A kapott csúcsból indulva rekurzívan behelyezi a csúcsot és annak gyerekeit a start tárolóba, a csúcsot magát kulcsként, a rots tömbjét értékként. toend(node n): void A kapott csúcsból indulva rekurzívan behelyezi a csúcsot és annak gyerekeit az end tárolóba, a csúcsot magát kulcsként, a rots tömbjét értékként. - 50 -

RoadCalculater.java Ősosztály: Object Két gráf alapján megkeresi azok metszetét, majd menti az egyikből a másikba vezető utat egy vektorba. Az út tartalma a kezdőcsúcstól a végcsúcsig a forgatások indexe és iránya. Konstruktor: RoadCalculater(int[] startstate, int[] endstate) startstate: a kezdőállapotokat tartalmazó tömb. endstate: a végállapotokat tartalmazó tömb A kapott állapotokat átszámítja 24-es számrendszerbe, létrehoz két gráfot a két kezdőcsúcs alapján, egy iterator segítségével behelyezi őket a tárolókba, majd megkeresi a metszetet, végül menti az eredményt a road változóba. Fontosabb adattagok: road: Vector<int[]> Az utat tartalmazó vektor, az egyes elemek: egy forgatási indexet és egy forgatási irányt tartalmazó tömb. Fontosabb metódusok: tovector (int[] temprot): void A road vektorba behelyezi a kapott temprot értékeit. tovectorreverse(int[] temprot): void A road vektorba behelyezi a kapott temprot értékeit, fordított sorrendben. toscale(int[] temparray): int A kapott tömb értékeit átszámítja 24-es számrendszerbe. TreeAlgorithm.java Ősosztály: Object Fontosabb adattagok: - 51 -

terminated: boolean Indításkor az értéke hamis, ha igazzá válik, a SolveGame() metódus működése megszakad. start: int[] A kezdőállapotot tartalmazó tömb, amelyet majd a RoadCalculator objektum kap meg. end: int[] A végállapotot tartalmazó tömb, amelyet majd a RoadCalculator objektum kap meg. bruteforce: BruteForce A felső 6 kocka kirakása után az alsó hármat BruteForce módban számoljuk ki. Fontosabb metódusok: solvegame(mainframe mf): void Egy RoadCalculator segítségével létrehozza az utat, ami alapján aztán végrehajtja a forgatásokat. Ezek után a fennmaradó 3 kockát egy Brute Force módon rakja ki. makerotate(int selectionindex, int direction) throws InterruptedException: void Ha a terminated értéke hamis, akkor elvégi a kapott adatok alapján a forgatást. terminate(): void A terminated értékét igazra állítja, ha a bruteforce éréke nem null, akkor ennek is meghívja a terminated() metódusát. - 52 -

mesekocka3d.adapters csomag Az egyes bemeneti eszközök kezelését megvalósító osztályok. 16. ábra - mesekocka3d.adapters csomag osztályai MyKeyAdapter.java Ősosztály: KeyAdapter A játéktér gombeseményeit kezeli: kiválasztja a megfelelő objektumhármasokat, elvégzi a forgatásokat az objektumokon. Fontosabb adattagok: selectionindex: int A kiválasztott objektumhármasok indexe. lastkeypress: long Az utolsó gombnyomás idejét tárolja, ha azóta nem telt el 250 milliszekundum, akkor nem lehet új forgatást végezni. isabletomove: boolean Ha értéke hamis, nem lehet használni a billentyűzetet a játéktéren. Fontosabb metódusok: keypressed(keyevent e): void A megnyomott billentyű alapján, mely az e változóban tárolódik, az egyes kijelöléseket és forgatásokat végzi el. A forgatások új szálon indulnak. - 53 -

MyMouseAdapter.java Ősosztály: MouseAdapter A játéktér egéreseményeit kezelő osztály. Fontosabb metódusok: mousepressed(final MouseEvent e): void A jobb egérgomb lenyomásakor elmenti az egérkurzor aktuális pozícióját. mousedragged(mouseevent e): void A jobb gomb lenyomása után az akkori pozíciótól való eltérés alapján átállítja a játéktér nézőpontjának gömbi koordinátáit. mousewheelmoved(mousewheelevent e): void Az egér görgőjének hatására a játéktér nézőpontjának távolságát növeli vagy csökkenti. MyWindowAdapter.java Ősosztály: WindowAdapter A főablak X gombjára való kattintást kezeli le, ekkor feldob egy új ExitMessage ablakot. - 54 -

Az egyes osztályok kapcsolata működés közben 17. ábra - forgatás menete Leírás: a felhasználó elforgat egy kockahármast valamely irányba a billentyűzet segítségével, ha a forgatás után a kockák megfelelő állapotban vannak, akkor nyer. - 55 -

18. ábra - betöltés menete Leírás: a felhasználó betölt egy mentett állományt, ha hibás fájlnevet ír be, akkor a program ezt hibaüzenettel jelzi. Továbbfejlesztési lehetőségek Az alap hat darab kép helyett a felhasználó is kiválaszthatná a számára kedvezőbb képeket, ehhez szükség van a képvágó projektre, valamint egy automatikus textúrakészítőt is meg kellene írni. Új menü felvétele a kezelőgombok beállítására, például függőleges irányú invertálható egérmozgás, az indexválasztó, forgatógombok konfigurálása, majd ezt el is kéne menteni, hogy a következő indításnál ne kelljen újra beállítani. Hangok betétele a forgatásokhoz, a mixeléshez, a játék kezdésének, végének jelzésére. A Kirakandó kép panel lekicsinyítésének lehetősége. A játéktér színesebbé tétele, például dombos, füves háttérrel, Nap objektum felvétele, amely fényt sugároz. - 56 -

Közösségi oldalakon lehetőség az eredmények megosztására, onnan való lekérdezés. Tesztelés A tesztelés egy szoftver esetében nagyon fontos, a fejlesztés 80%-át a tesztelés teszi ki. A célja a hibák felfedezése és azok javítása. Interfész tesztelése Mentés menüpont. A következő táblázat az egyes játékmódok egyes fázisaiban a menüpont engedélyezettségét mutatják. Egyéni Brute Force Fa algoritmus Betöltés után Kezdési fázis Letiltva Keverési fázis Letiltva Letiltva Letiltva Letiltva Játék fázis Engedélyezve Letiltva Letiltva Engedélyezve Nyerési fázis Letiltva Letiltva Letiltva Letiltva A következő táblázat a menüponthoz kapcsolódó gombok használatát mutatja. Mit tesztelünk Elvárt eredmény Értékelés A menüpont használata Egyéni módban, az X gombra kattintva. A menüpont használata Egyéni módban, a Mégse gombra kattintva. A menüpont használata Egyéni módban, a Ment gombra kattintva, új fájlnevet beírva. A menüpont használata Egyéni módban, a Ment gombra A program feldobja a mentési ablakot, amely a gomb hatására eltűnik. A program feldobja a mentési ablakot, amely a gomb hatására eltűnik. A program feldobja a mentési ablakot, majd a mentés megtörténik. A program feldobja a mentési ablakot, majd a mentés - 57 -

kattintva, egy a save mappában lévő elemet kiválasztva. A menüpont használata betöltés után, az X gombra kattintva. A menüpont használata betöltés után, a Mégse gombra kattintva. A menüpont használata betöltés után, a Ment gombra kattintva, új fájlnevet beírva. A menüpont használata betöltés után, a Ment gombra kattintva, egy a save mappában lévő elemet kiválasztva. megtörténik, amely felülírja a kiválasztott fájlt. A program feldobja a mentési ablakot, amely a gomb hatására eltűnik. A program feldobja a mentési ablakot, amely a gomb hatására eltűnik. A program feldobja a mentési ablakot, majd a mentés megtörténik. A program feldobja a mentési ablakot, majd a mentés megtörténik, amely felülírja a kiválasztott fájlt. Betöltés menüpont A következő táblázat az egyes játékmódok egyes fázisaiban a menüpont engedélyezettségét mutatják. Egyéni Brute Force Fa algoritmus Betöltés után Kezdési fázis Engedélyezve Keverési fázis Letiltva Letiltva Letiltva Letiltva Játék fázis Engedélyezve Engedélyezve Engedélyezve Engedélyezve Nyerési fázis Letiltva Engedélyezve Engedélyezve Engedélyezve A következő táblázat a menüponthoz kapcsolódó gombok használatát mutatja, a tesztelés minden játékmódra megtörtént. - 58 -

Mit tesztelünk Elvárt eredmény Értékelés A menüpont használata az aktuális játékmódban, módban, az X gombra kattintva. A menüpont használata az aktuális játékmódban, a Mégse gombra kattintva. A menüpont használata az aktuális játékmódban, a Betölt gombra kattintva, új, létező fájlnevet beírva. A menüpont használata az aktuális játékmódban, a Betölt gombra kattintva, új, nem létező fájlnevet beírva. A menüpont használata az aktuális játékmódban, a Betölt gombra kattintva, egy a save mappában lévő helyes tartalmú elemet kiválasztva. A menüpont használata az aktuális játékmódban, a Betölt gombra kattintva, egy a save mappában lévő helytelen tartalmú elemet kiválasztva. A program feldobja a betöltési ablakot, amely a gomb hatására eltűnik. A program feldobja a betöltési ablakot, amely a gomb hatására eltűnik. A betöltés megtörténik. A program hibaüzenetet dob nem létező fájlról. A betöltés megtörténik. A program hibaüzenetet dob helytelen tartalmú fájlról. - 59 -

Kilépés menüpont Mit tesztelünk Elvárt eredmény Értékelés A beleegyező ablak A menüpont használata az X gombra kattintva. A menüpont használata a Nem gombra kattintva. A menüpont használata az Igen gombra kattintva. megjelenik, majd a gomb hatására eltűnik, a program fut tovább. A beleegyező ablak megjelenik, majd a gomb hatására eltűnik, a program fut tovább. A beleegyező ablak megjelenik, majd a gomb hatására leáll a program. Játékleírás menüpont Mit tesztelünk Elvárt eredmény Értékelés A menüpont használata az X gombra kattintva. A menüpont használata az OK gombra kattintva. Az információs ablak megjelenik, a gomb hatására eltűnik. Az információs ablak megjelenik, a gomb hatására eltűnik. Eddigi eredmények menüpont Mit tesztelünk Elvárt eredmény Értékelés A menüpont használata az X gombra kattintva. Az információs ablak megjelenik, a gomb hatására eltűnik. - 60 -

A menüpont használata az OK gombra kattintva. A menüpont görgetősávjának használata. Az információs ablak megjelenik, a gomb hatására eltűnik. A görgetés használatával lentebbi, vagy fentebbi sorok jelennek meg. Készítők menüpont Mit tesztelünk Elvárt eredmény Értékelés A menüpont használata az X gombra kattintva. A menüpont használata az OK gombra kattintva. Az információs ablak megjelenik, a gomb hatására eltűnik. Az információs ablak megjelenik, a gomb hatására eltűnik. Játékmódválasztó legördülő menü Mit tesztelünk Elvárt eredmény Értékelés A menü legördül, majd a Az első elem kiválasztása. A második elem kiválasztása. A harmadik elem kiválasztása. második kattintásra az Egyéni felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Brute Force felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Fa algoritmus felirat jelenik meg benne. - 61 -

Kirakandó kép legördülő menü Mit tesztelünk Elvárt eredmény Értékelés A menü legördül, majd a Az első elem kiválasztása. A második elem kiválasztása. A harmadik elem kiválasztása. A negyedik elem kiválasztása. Az ötödik elem kiválasztása. A hatodik elem kiválasztása. második kattintásra az Courage felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Madagascar felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Monster Inc felirat jelenik meg benne. A menü legördül, majd a második kattintásra az Family Guy felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Lion King felirat jelenik meg benne. A menü legördül, majd a második kattintásra a Garfield felirat jelenik meg benne. - 62 -

Start gomb A következő táblázat a különböző játékmódokban, különböző képeket kiválasztva azon teszt eredményét mutatja, hogy a megfelelő játékmódban indul-e el a játék, illetve a megfelelő kirakandó kép jelenik-e meg a Kirakandó kép panelen. Egyéni Brute Force Fa algoritmus Courage Madagascar Monter Inc. Family Guy Lion King Garfield Időmérő A következő táblázat az időmérő működését mutatja az egyes módokban indított játékok fázisaiban. Egyéni Brute Force Fa algoritmus Betöltés Kezdési fázis Nem fut - Keverési fázis Nem fut Nem fut Nem fut Nem fut Játék fázis Fut Fut Fut Fut Nyerési fázis Nem fut Nem fut Nem fut Nem fut - 63 -

Egyéb tesztesetek. Mit tesztelünk Elvárt eredmény Értékelés Betöltés esetén megfelelő-e a mutatott idő Start gomb megnyomásakor a mutatott idő. Betöltés utána keverési fázisban a számláló megáll, majd keverés után a mentett állapottól fut tovább. A számláló nullázódik. Lépésszámláló A következő táblázat a számlálónak az egyes játékmódokban forgatásokra való növekedés teszteseteinek eredményét mutatja. Egyéni Brute Force Fa algoritmus Betöltés Lépésnapló A következő táblázat a Lépésnapló az egyes játékmódokban forgatásokra való helyes információ kiírás teszteseteinek eredményét mutatja. Egyéni Brute Force Fa algoritmus Betöltés Hibaüzenet Mit tesztelünk Elvárt eredmény Értékelés X gomb használata nem termináló hibaüzeneten. OK gomb használata nem termináló A hibaüzenet eltűnik, a program fut tovább. A hibaüzenet eltűnik, a program fut tovább. - 64 -

hibaüzeneten. X gomb használata termináló hibaüzeneten. OK gomb használata termináló hibaüzeneten. A hibaüzenet eltűnik, a program működése leáll. A hibaüzenet eltűnik, a program működése leáll. A főablak Mit tesztelünk Elvárt eredmény Értékelés X gomb használata. Kis méret gomb használata. Az ablak mozgatása. Nagy méret gomb használata. Megjelenik a Kilépés beleegyező dialógus A program a tálcára kerül. Mozog az ablak a képernyőn. A gomb le van tiltva. A tálcára tétel és az onnan való visszanagyítás gyors, a megjelenés rendben. Az újrarajzolás gyors, a megjelenés rendben. Hiányzó fájlok tesztelése A programhoz tartozó externals mappa hiányainak tesztelése. Mit tesztelünk Elvárt eredmény Értékelés obj/quadcube.obj fájl hiánya pics/win.jpg fájl hiánya pics/szamitas.gif fájl hiánya pics/courage.jpg fájl hiánya Az objektum betöltése sikertelen hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A képbetöltés sikertelen. hibaüzenet. pics/family Guy.jpg fájl A képbetöltés sikertelen. - 65 -

hiánya pics/garfield.jpg fájl hiánya pics/lion King.jpg fájl hiánya pics/madagascar.jpg fájl hiánya pics/monster Inc..jpg fájl hiánya text/1.jpg fájl hiánya text/2.jpg fájl hiánya text/3.jpg fájl hiánya text/4.jpg fájl hiánya text/5.jpg fájl hiánya text/6.jpg fájl hiánya text/7.jpg fájl hiánya text/8.jpg fájl hiánya text/9.jpg fájl hiánya Readme.txt fájl hiánya Highscores.txt fájl hiánya hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A képbetöltés sikertelen. hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A textúra fájl nem található hibaüzenet. A fájl beolvasása sikertelen. hibaüzenet. A fájl beolvasása sikertelen. hibaüzenet. - 66 -

Perifériák tesztelése Billentyűzet A billentyűzet működésének tesztelése az egyes játékmódok, egyes fázisaiban. Egyéni Brute Force Fa algoritmus Betöltés után Kezdési fázis Letiltva Keverési fázis Letiltva Letiltva Letiltva Letiltva Játék fázis Engedélyezve Letiltva Letiltva Letiltva Nyerési fázis Letiltva Letiltva Letiltva Letiltva A billentyűzet tesztelése Egyéni módban az egyes kijelölések. Mit tesztelünk Elvárt eredmény Értékelés 1-es gomb megnyomása 2-es gomb megnyomása 3-es gomb megnyomása Az első oszlop lesz kijelölve. A második oszlop lesz kijelölve. A harmadik oszlop lesz kijelölve. 4-es gomb megnyomása Az első sor lesz kijelölve. 5-es gomb megnyomása 6-es gomb megnyomása A második sor lesz kijelölve. A harmadik sor lesz kijelölve. - 67 -

A billentyűzet tesztelése Egyéni módban, az egyes kijelölt kockahármasok lehetséges irányokba való forgatása. Bal Jobb Fel Le Első oszlop Balra fordul a megfelelő kockahármas. Jobbra fordul a megfelelő kockahármas. Nem történik semmi. Nem történik semmi. Második oszlop Balra fordul a megfelelő kockahármas. Jobbra fordul a megfelelő kockahármas. Nem történik semmi. Nem történik semmi. Harmadik oszlop Balra fordul a megfelelő kockahármas. Jobbra fordul a megfelelő kockahármas. Nem történik semmi. Nem történik semmi. Első sor Nem történik semmi. Nem történik semmi. Felfelé fordul a megfelelő kockahármas. Lefelé fordul a megfelelő kockahármas. Második sor Nem történik semmi. Nem történik semmi. Felfelé fordul a megfelelő kockahármas. Lefelé fordul a megfelelő kockahármas. Harmadik sor Nem történik semmi. Nem történik semmi. Felfelé fordul a megfelelő kockahármas. Lefelé fordul a megfelelő kockahármas. - 68 -

A billentyűzet egyéb funkcióinak tesztelése. Mit tesztelünk Elvárt eredmény Értékelés Balra gomb folyamatos nyomva tartása 30 másodpercig az első oszlopot kijelölve. 1-6 gombok egymásután gyors megnyomása. Balra illetve jobbra gombok egymás után gyors megnyomása, az első oszlopot kijelölve. Fel illetve le gombok egymás után gyors megnyomása, az első sort kijelölve. A kocka nem folyamatosan, hanem 0,25 másodpercenként egyszer fordul, a gombot felengedve nem mozog tovább. A kijelölések azonnal láthatók. Csak balra fordulnak el a kockák. Csak felfelé fordulnak el a kockák. Egér Az egér tesztelését különböző távolságokban függőlegesen és vízszintesen körbeforgatva végeztem, az egér működése során hibát nem tapasztaltam, a megadott távolságoknál közelebb vagy távolabb nem tudunk közelíteni, az Y tengellyel párhuzamosan nem tudjuk a nézőpontot beállítani. Monitor A programot egy 1024x768-as maximum felbontású, 4:3 arányú, és egy 1366x768 maximum felbontású, 16:9 arányú kijelzőn teszteltem. - 69 -

Felbontás 1. kijelző 2. kijelző 800x600 A Lépésnapló és a Játéktér A Lépésnapló és a Játéktér alja kilóg a képből. alja kilóg a képből. 1024x600 A Lépésnapló és a Játéktér A Lépésnapló és a Játéktér alja kilóg a képből. alja kilóg a képből. 1024x768 1280x720 - A Lépésnapló és a Játéktér alja kilóg a képből 1280x768-1360x768-1366x768 - Programműködés Az egyes módokban kirakott képek utána helyes játékfázisnak megfelelően működik-e a program, azaz összeugrik, nem lehet menteni, nem lehet billentyűt használni stb. Egyéni Brute Force Fa algoritmus Betöltés után Courage Madagascar Monter Inc. Family Guy Lion King Garfield - 70 -

A Fa algoritmus módban a Processing képernyő jelenlétének ideje másodpercben. Milyen képre Mennyi idő Courage 14, 13, 13 Garfield 13, 12, 13 Madagascar 13, 15, 14 Monster Inc. 13, 13, 13 Lion King 15, 14, 14 Famil Guy 14, 13, 14-71 -

Felhasználói dokumentáció 1. A program rövid leírása A Mesekocka3D egy gyerekjáték, a mesekocka és a 3x3x1-es Rubik kocka (más néven Floppy Cube) ötvözetének számítógépes megvalósítása. A Mesekocka: a játék kockákból áll, melyeknek mind a 6 oldalán egy-egy ismert meséből származó képrészlet található. A játék célja, hogy a választott képet kirakjuk, a kockák megfelelő helyzetbe való forgatásával. Rubik kocka: A Rubik-kocka mechanikus, egyéni logikai játék. A kocka oldalai különféle színűek és elforgathatók a lap középpontja körül. A forgatás során a szomszédos oldalak színe megváltozik. A rendszertelen forgatással az oldalak színösszeállítása összekeverhető. A játék célja, hogy egy előzetesen összekevert kockából forgatással visszaállítsuk az eredeti, rendezett színösszeállítást, vagyis minden oldalon azonos színű lapocskák legyenek. ([1]) A Floppy Cube: A Rubik kockának a kitalálása óta eltelt közel negyven év alatt számtalan változata elkészült. Vannak nem csak kocka alakú, hanem téglalap, tetraéder alakú fajtái is, sőt a kockának létezik 1x1x1-es változata is. Ezek egyik fajtája a Floppy Cube néven ismert kocka, amelyben 1x3x3-as elrendezésben találhatók az elemek. A játéknak lévén, hogy eggyel kevesebb dimenziója van, sokkal kevesebb állapotba is hozható. A Floppy Cube felső és alsó sora, illetve a két szélső oszlopa forgatásával hozható a kívánt állapotba. A program jelen esetben 9 darab kockából áll, 3x3-as elrendezésben. A kockákat nem egyenként, hanem a Floppy Cube-hoz hasonlóan soronként, illetve oszloponként tudjuk forgatni. Eltérés, hogy míg az eredetiben csak a szélső hármasokat mozgathatjuk, itt a középsőkre is lehetőség van. Eltérés még, hogy az oszlopokat a kockák mélységi tengelyén forgathatjuk jobbra és balra, az oszlopokat pedig a szélességi tengelyükön felfelé és lefelé. A játék célja, hogy az előzetesen kiválasztott képet a kockák megfelelő mozgatásával kirakjuk, ha nyertünk, ezt a program egyébként jelzi is. A kockák 24 féle állapotban helyezkedhetnek el, mivel a hat képet 90-72 -

fokban elforgatva oldalanként 4 állapotot kapunk. A képek a 90-es és 2000-es évek ismert meséit ábrázolják: Bátor a gyáva kutya: http://hu.wikipedia.org/wiki/b%c3%a1tor,_a_gy%c3%a1va_kutya Az Oroszlánkirály: http://hu.wikipedia.org/wiki/oroszl%c3%a1nkir%c3%a1ly Madagaszkár: http://hu.wikipedia.org/wiki/madagaszk%c3%a1r_(film) Family Guy: http://hu.wikipedia.org/wiki/family_guy Szörny Rt.: http://hu.wikipedia.org/wiki/sz%c3%b6rny_rt. Garfield http://hu.wikipedia.org/wiki/garfield - 73 -

2. Rendszerkövetelmények Minimális hardver követelmények: Processzor: AMD Athlon II P340 Dual-Core Processor 2.20 GHz Memória (RAM): 2GB Merevlemez: 5MB szabad tárterület Videókártya: OpenGL által támogatott: http://worldwindcentral.com/wiki/video_card_compatibility Monitor: minimum 800x600-as felbontású Egér, billentyűzet Minimális szoftver követelmények Java Virtual Machine telepítve (letölt: http://java.com/en/download/index.jsp) Windows operációs rendszer Megjegyzés: a Program más operációs rendszereken nem lett tesztelve, de valószínűleg működőképes, ehhez töltse le a következő oldalról a megfelelő jogl mappát: http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/. Ennek lib könyvtárában lévő fájlokat helyezze a Java/jre könyvtárának bin könyvtárába, majd parancssorból a Java jar %Mesekocka3D.jar elérése%/mesekocka3d.jar paranccsal indíthatja azt. 3. Telepítés, futtatás A Java futtatókörnyezet (JRE) telepítése A futtatáshoz telepíteni kell a Java futtatórendszerét (Java Runtime Environment, JRE), amely a J2SE (J2 Standard Edition) része. A futtatórendszer más nevei: Java VM, Java WEB Start. Ha még nincs a gépén a JRE szükséges verziója, akkor töltse le a Sun oldaláról, és telepítse: Letöltendő a JRE 1.4.1 vagy magasabb verzió. Letöltési cím: http://java.sun.com/j2se/1.4.1/download.html (JRE) - 74 -

A Windows-os fájl neve például: j2re-1_4_1_02-windows-i586.exe (kb. 10 MB) Kattintson a telepítő állományra, és kövesse a telepítő utasításait! A program telepítése, eltávolítása A program telepítéséhez helyezzük el a Mesekocka3D mappát akárhol a számítógépen, majd kattintsunk duplán a setup.vbs fájlra, ekkor a program létrehoz egy parancsikont az Asztalon. A főmappában lévő mappákat, fájlokat ne helyezzük át, ez a program használhatatlanná válásához vezet. A program eltávolításához törölje az Asztalon lévő parancsikont. A program indítása Kattintson duplán a Mesekocka3D.lnk parancsikonra az Asztalon! Ha még nincs társítva a jar kiterjesztéshez a Java futtatóprogram - a Mesekocka3D mappában a Mesekocka3D.jar fájlnak egy üres lap az ikonja -, akkor társítsa a Mesekocka3D.jar-t a JRE bin könyvtárában levő javaw.exe programhoz, például: Kattintson duplán Mesekocka3D.jar fájlon, majd a felugró ablakból válassza ki a Kiválasztom a telepített programok listájából, ezután navigáljon a következő fájlhoz a felugró dialógusban: Jobb egér/társítás/egyéb/ C:/Program Files/Java/j2re1.4.1_02/bin/javaw.exe Ha a program így sem indul, akkor Windows rendszereken nyissa meg a Start menüt, majd Parancssor programon jobb gombbal kattintva a helyi menüből válassza ki a Futtatás rendszergazdaként menüpontot. Majd írja be a következőket: assoc.jar=jarfile ftype jarfile="c:\a JAVAW FÁJL ELÉRÉSE\javaw.exe" -jar "%1" %* A JAVAW FÁJL ELÉRÉSE például: Program Files\Java\j2re1.4.1_02\bin\javaw.exe A \ (Backslash) operátort az Altgr+ Q gombok lenyomásával írhatja be. - 75 -

4. A program fogalmai Fogalom Jelentés Betöltés A Fájl menü eleme, az elmentett állapotok betöltését végzi. Brute Force mód Célkép legördülő menü Egy játékstílus, melyben a számítógép végzi a kockák kirakását. A Kezelőfelületen elhelyezkedő legördülő menü, amelyen kiválasztatjuk a kirakandó képet. Eddigi eredmények Az Információk menü része, információkat ad az eddigi befejezett játékokról. Egyéni mód Fa algoritmus mód Fájl menü Egy játékstílus, melyben a játékos végzi a kockák kirakását. Egy játékstílus, melyben a számítógép végzi a kockák kirakását. A Menüsor első menüje. Forgatás Egy kockahármas mélységi, vagy szélességi tengelyen való forgatása 90 fokkal pozitív, vagy negatív irányba. Időmérő Információk menü Játék fázis A Kezelőfelület része, játék közben az eltelt időről ad információt. A Menüsor második menüje. A program Keverési fázis utáni állapota, amikor a tényleges játék folyik. Játékleírás Az Információk menü része, információkat ad a játék szabályairól, használatáról. Játékmód választó legördülő menü A Kezelőfelületen elhelyezkedő legördülő - 76 -

menü, melyen kiválaszthatjuk az indítás előtti játékmódot. Játéktér Egy háromdimenziós megjelenítő, mely a képernyő nagy részét képezi, a játék folyamata itt látható. Készítők Az Információk menü része, információkat ad a játék készítőjéről. Keverési fázis Kezdő fázis Kezelőfelület A program azon állapota, amikor a kockák keverése történik. A program indulása utáni állapot. A képernyő jobb szélén elhelyezkedő panel, amelyen az indítás előtti beállításokat lehet elvégezni, illetve a játékról tudhatunk meg információkat játék közben. Kijelölés Egy kockahármast pirosra színez a program, ezzel jelezve, hogy ezt tudjuk majd elforgatni. Kilépés Kilépés beleegyező dialógus. A Fájl menü része, a programból való kilépést végzi. A kilépéskor megjelenő üzenet, amely a felhasználó beleegyezését kéri a program leállítására. Kirakandó kép panel A képernyő bal felső sarkában elhelyezkedő panel, amely a játék közben azt a képet jeleníti meg, amelyet a felhasználónak, vagy a gépnek ki kell raknia. Lépésnapló A Kezelőfelület része, játék közben a megtett lépésekről ad információt: mely kockákat, milyen irányba, hányadik - 77 -

lépésben forgattuk el. Lépésszámláló Mentés Menüsor Nem termináló hibaüzenet Nézett pont A Kezelőfelület része, játék közben a megtett lépések számáról ad információt. A Fájl menü eleme, Egyéni módban az aktuális állapot elmentésére szolgál. A képernyő felső sorában a címsor alatt elhelyezkedő panel, amelyen a felhasználó a mentést, betöltés, kilépést végezheti el, illetve információkat tudhat meg a játékról. Egy felugró, hibát jelző ablak, amely nem állítja le a programot. A középső kocka közepe. Az a pont a világkoordináta rendszerben, Nézőpont Nézőpontváltás Nyert fázis Start gomb Termináló hibaüzenet ahonnan a felhasználó az eseményeket látja, a kamera helye. A nézőpont elmozgatása a középső kocka középpontja körüli gömbön. A Játék fázis után a kockák helyre forgatásakor létrejövő állapot. A játék indítását kezdeményezhetjük vele. Egy felugró, hibát jelző ablak, amely leállítja a programot. - 78 -

5. A képernyő részei A képernyőt 4 fő részre oszthatjuk: 19. ábra - A képernyő részei A. Célkép panel A képernyőnk bal felső sarkában elhelyezkedő panelen megjelenő képet kell kiraknunk a játék során. A kép alapértelmezésként a listában elsőként szereplő Courage című képet jeleníti meg, amelyet majd a C-vel jelölt kezelőfelületen állíthatunk át. A panelen a 6 különböző kép közül válogathatunk. B. 3D Játéktér A képernyő fő része, amely háromdimenziós megjelenítést tesz lehetővé. A képernyőn a kilenc kockát láthatjuk, alapállapotban a Courage című képre kirakva. Alapállapotban a kockát helyköz nélkül helyezkednek el, de a játék indításakor szétugranak, a jobb átláthatóság érdekében. Ha a képernyő fókuszt kap (rákattintunk), az indítás utána a kockák mozgathatók, ha a játék el van indítva, illetve a nézőpontot az egér segítségével állíthatjuk. - 79 -

C. Kezelőfelület és státuszinformációk A játékra vonatkozó beállításokat végezhetjük el, valamint információkat tartalmaz a játék menetéről. D. Menüsor A program menüsorában, a Fájl menüben a játék mentését, betöltését végezhetjük el, valamint kiléphetünk a játékból. Az információk Menüben információkat kaphatunk a program készítéséről, leírást a játékszabályokról, valamint az elmúlt játékok eredményeit tekinthetjük meg. 6. Általános használat Játékfázisok A játékot működés közben négy nagyobb fázisra bonthatjuk. Kezdési fázis A játék kezdete előtti első betöltéskor megjelenő fázis. Ekkor semmilyen módosítást nem hajthatunk végre a Játéktéren, bár a nézőpontot állíthatjuk (ld. Nézőpont beállítások). A státuszinformációk az alap lenullázott, illetve üres fázisban vannak. Kijelölések nincsenek, és a kockák helyköz nélkül helyezkednek el egymás mellett. Keverési fázis A Keverési fázis a játék indítása utáni pár másodpercig tart. Az fázis kezdetekor a kockák eltávolodnak egymástól, majd a program megkeveri a kockákat. Ekkor nem indítható új játék. Játék fázis A Keverési fázis után következik a játék fázis, ahol a kockákat forgatásokkal játékmódtól függően a számítógép, vagy a felhasználó megfelelő helyre forgatja. Ekkor már kapunk visszajelzéseket a státuszinformációk által. A kijelölések játékmód függőek. Itt már új játékot is indíthatunk. - 80 -

Nyert fázis Ha a játékfázisban a kockák a megfelelő helyre kerültek, a játék véget ért, ekkor a kockák megint összeugranak, a játéktéren nem tudunk kijelöléseket végrehajtani, a kijelölések megszűnnek, illetve az időmérő leáll. A játéktér közepén pár másodpercig feltűnik egy Winner felirat. 20. ábra - A nyeréskor megjelenő felirat Játékmódok Játékfázisban háromféle módon rakhatjuk ki a kockákat, ezt a játék indítása előtt a kezelőfelületen állíthatjuk be (ld. Kezelőfelület használata). Egyéni mód A felhasználó a billentyűzet segítségével rakja ki a kívánt állapotot. (ld. Kijelölések, forgatások) Brute force Itt a kirakás a számítógép segítségével történik. Ekkor a felhasználónak semmiylen beleszólása nincs a kockák forgatásába, a billentyűzet le van tiltva, azonban szabadon állíthatja a nézőpontot, illetve új játékot is indíthat. A számítógép első lépésben felállít egy alapállapotot, ahonnan aztán a második lépésben a megfelelő előre beégetett egyszerű forgatásokat hajtja végre kockánként addig, amíg el nem jut a kívánt végállapotba. Faalgoritmus A Brute Force játékmódhoz hasonlóan a felhasználónak itt sincs beleszólása a játékmenetbe, de a nézőponot állíthatja, új játékot is indíthat. A program ekkor egy - 81 -

hosszabb számítássorozatot hajt végre, eddig egy Számítás című képernyő jelenik meg. A számítás végrehajtása után a program pár forgatás segítségével kirakja a kívánt állapotot. 21. ábra - A faalgoritmus számításakor megjelenő panel Nézőpont beállítások A játékban az adott nézőpontot az egér segítségével változtathatjuk a jobb átláthatóságért. Azért, hogy a kockákat minden oldalról meg tudjuk vizsgálni, alapvetően két funkciót különíthetünk el: a zoomolást és a körbeforgást. Fontos, hogy a mozgatást csak akkor végezhetjük el, ha előtte a képernyő rész fókuszt kapott, ezt a megjelenítő panelen való kattintással érhetjük el. A nézőpont mindig a középső kockánk közepére fókuszál. Körbeforgás: az egér jobb gombjának nyomva tartásával mozgassuk azt, ekkor a nézett pont körül oldalirányú mozgatás esetén, oldalirányban, függőleges mozgás esetén pedig függőleges irányban járhatjuk körbe a kockáinkat. A függőleges mozgás invertált, azaz ha az egeret lefele húzzuk, akkor a nézőpont feljebb kerül. Fontos még függőleges irányú forgatás esetén, hogy a nézőpont csak 180 fokban mozdítható el. A forgatás csak akkor működik, ha az egér a gomb lenyomásakor a játékpanelen van. - 82 -

22. ábra - a nézőpont oldalirányú mozgatása Zoomolás: a közelítéshez és a távolításhoz az egér görgőjét használjuk, ez a nézőpont irányát nem változtatja, csak a kockáktól vett távolságot. A zoomolásnak van egy adott minimum és maximum értéke, ezeknél nem tudunk közelebb illetve távolabb menni. 23. ábra - Közeli és távoli nézőpontok Kockamozgatások, kijelölések A kockák mozgatását, illetve kijelölését a billentyűzet segítségével tehetjük meg, szintén csak akkor, ha a képernyő fókuszt kapott, illetve ha elindítottuk a játékot, és a - 83 -

keverés megtörtént. A kockák állapotának a módosítására csak Egyéni módban van lehetőségünk. Kijelölés: a forgatni kívánt kockákat előbb ki kell jelölnünk, ezt az 1-6-os gombokkal tehetjük meg. Az 1-3 gombok balról jobbra az oszlopokat jelölik ki, a 4-6-os gombok fentről lefelé a sorokat. A kijelölt kockák színe pirosra változik, alapértelmezésként az első oszlop van kijelölve, de csak egyéni módban, és csak ha épp játékfázisban vagyunk. 24. ábra - A második oszlop kijelölése Forgatás: a kijelölések után a nyíl gombok használatával mozgathatjuk a kockáinkat, a kijelöléseknek megfelelően, azaz ha oszlopokat jelöltünk ki, akkor csak jobbra illetve balra forgathatjuk őket, a jobb és bal nyilakkal, míg ha sorokat, akkor csak felfelé és lefelé a fel és a le nyilakkal. - 84 -

25. ábra - Az első oszlop balra forgatása Kezelőfelület használata A kezelőfelület információkat tartalmaz a játék menetével kapcsolatban, illetve az új játék kezdete előtti beállításokat végezhetjük el általa. Információk a felhasználónak Lépésszámláló A program számon tartja az elvégzett lépéseket, ez minden új játék kezdésénél lenullázódik. Eltelt idő A játék elkezdése óta eltelt időt mutatja, új játék indításakor lenullázódik. Lépésnapló A játék indításától a játékfázisban végzett forgatásokat tartja számon, tehát a forgatási fázis lépéseit nem. Megmutatja, hogy hányadik lépésben, milyen irányba és melyik kockákat forgattuk el, a kockákat a számukkal jelöli, a számozás balról jobbra, fentről lefelé történik. 1 2 3 4 5 6 7 8 9 26. ábra - A kockák számozása - 85 -

Új játék indításakor törlődnek az eddigi információk. Minden forgatás egy új sorba kerül, ha a szöveg doboz kapacitásánál több sor jön létre, akkor jobboldalt egy csúszka jelenik meg, amivel visszanézhetjük az összes eddigi lépést. 27. ábra - Információk a játékmenetről: lépésszám, eltelt idő, megtett lépések Beállítások Játékmód választó A kockák kirakásának módját, az első legördülő menüben tehetjük meg, itt választhatunk az Egyéni, a Brute Force illetve a Fa alapú játékstílusok közül. Alapértelmezésként az egyéni mód van kiválasztva, de a menüre kattintva az egérrel ezt megváltoztathatjuk. A játékstílus változtatás csak a Start gomb megnyomása, illetve a játék indítása után lép életbe. - 86 -

28. ábra - a játékmód-választó menü Kirakandó kép A második legördülő menüvel, a kirakandó hat kép közül választhatunk, hogy melyiket szeretnénk elkészíteni. Alapértelmezésként a Courage című kép van kiválasztva, ezt az egér segítségével módosíthatjuk. Kattintás után a bal felső panelen lévő kép megváltozik a kiválasztottra, de csak a Start gomb lenyomása után lép érvénybe a változtatás, az aktuális játék befejezéséhez az elsőnek választott képet kell kiraknunk. 29. ábra - A képválasztó menü Start gomb A gomb lenyomásával a program keverő fázisba lép, ekkor a gombot nem tudjuk megnyomni, amíg a keverés be nem fejeződik, majd játék fázisba lép át, ekkor a gomb újra lenyomható, ezzel új játék indítható. Az előzetesen beállított játékmód életbe lép, - 87 -

a kirakandó kép az utoljára kiválasztott kép lesz. A gomb a lépésszámot és az időt lenullázza, a lépésnaplót törli. Ha éppen játékfázisban vagyunk, az adott játékfolyamatot megszakítja. 30. ábra - Keverés közben a Start gomb le van tiltva 7. A program funkciói A menüsorban két menü található. Fájl menü A Fájl menüben a mentett játékokat kezelhetjük, illetve kiléphetünk a programból. 31. ábra - Fájl menü Mentés Egyéni módban, a keverési fázis után a nyert fázisig az adott állás elmenthető. A játék indításáig, vagy bármilyen más játékmódban, a menüpont le van tiltva. - 88 -

32. ábra - Egyéni módban, játékfázisban van lehetőség menteni, egyébként nincs. A mentés folyamata során a megadhatunk egy új fájlnevet, amibe menteni kívánjuk a játékot, vagy egy már létező fájlt választhatunk ki, de ekkor a program felülírja azt. A mentést csak a save mappában végezhetjük, egyéb mappákba nincs is lehetőség átmenni. 33. ábra - A "mentés" felugró ablak Betöltés A betöltés menüpontból egy adott, korábban elmentett fájl betöltésére van lehetőség. A menüpont lenyomása után egy felugró ablakból kiválaszthatjuk a megfelelő fájlt, majd az OK gombra kattintva betölthetjük azt. A betöltés megkezdésekor, ha van folyamatban lévő játék, akkor az megszakad, a program keverőfázisban a korábbi keverést, és a megtett lépéseket is elvégzi, az eltelt időt visszaállítja, a megtett lépéseket is felülírja a mentett játékéval, illetve a lépésnaplóban a mentéskor megtett lépések kerülnek. - 89 -

Kilépés A menüpont célja, hogy kiléphessünk a játékból, lenyomásakor a program nem azonnal áll le, hanem előbb feldob egy beleegyező ablakot, hogy biztosan szeretnénk-e kilépni. Alapértelmezettem a Nem válaszgombra van állítva a kijelölés. A Nem gombra kattintva nem történik semmi, a program fut tovább, mintha semmi sem történt volna, Igen esetén a program működése megszakad, a főablak bezárul. 34. ábra Kilépés felugró ablak Információk menü Különböző információkat tudhatunk meg a játék készítéséről, illetve magáról a játékról. Az egyes menüpontok ablakokat dobnak fel, ezeket az OK gomb megnyomásával, illetve az X gombra való kattintással az bezárhatjuk. 35. ábra - Információk menü Játékleírás A menüpont lenyomásakor egy ablak ugrik fel, ahol a játékszabályokról, illetve a játék irányításáról kapunk információkat. - 90 -

36. ábra - Információk a játékról Eddigi eredmények A menüpont megnyomásakor a program feldob egy ablakot, ahol az előzetesen végigjátszott játékokat láthatjuk, időrendi sorrendben. Megfelelő mennyiségű eredmény utána a sorok között a jobb oldalon lévő csúszkával, illetve az egér görgőjével lapozhatunk. - 91 -

37. ábra Eddigi eredmények felugró ablak Készítők A menüpont megnyomásakor egy új ablak ugrik fel, amelyben a program készítésében résztvevőkről kapunk információt. 38. ábra - Készítők felugró ablak Egyéb funkciók A program ablakán a Teljes méret funkció le van tiltva, az ablak mérete mindig fix. A Kis méret funkció az átlagoshoz hasonlóan működik, a programot a tálcára teszi, az ablak ilyenkor nem látszik, de a program tovább fut. Az X gomb megnyomására a Fájl menü/kilépés el azonos ablakot kapunk (ld. feljebb). - 92 -

8. Hibaüzenetek A program hiányzó fájlok esetén hibaüzenetet ad. A hibaüzenet kiírja a történt hibát, majd az OK gombra kattintva, a hiba típusától függően leáll a program, vagy fut tovább. A hibaablak megjelenése után, csak erre tudunk kattintani, a program más ablakait nem módosíthatjuk. 39. ábra -Hibaüzenet: az objektum nem található Lehetséges hibák Az objektum betöltése sikertelen: a program external/obj quadcube.obj fájl hiányzik. mappájában lévő A kép betöltés sikertelen: a program externals/pics mappája hiányos. A textúra nem található: a program externals/text mappája hiányos. A textúra betöltése sikertelen: a programnak nem sikerült az adott textúrákat hozzárendelni az objektumokhoz. A fájl nem létezik: betöltéskor a fájlnevet beírva is megadhatjuk, a hiba akkor jelentkezik, ha elírjuk a fájlnevet. A fájl beolvasása sikertelen: a program externals mappája hiányos. A fájl tartalma nem megfelelő: az externals/save mappában lévő fájl nem a program által támogatott információkat tartalmaz. - 93 -