Júz Kéz – The Game 22 – Mike Lefeautt Konzulens:
Szigeti Szabolcs
Csapattagok Mikes Péter Déri András Tündik Máté Ákos Sóskuthy Zalán
SXK8B7 RK2PNE YRB9LC MKZQ9T
[email protected] [email protected] [email protected] [email protected] 2009. május 14.
Tartalomjegyzék 2. Követelmény, projekt, funkcionalitás ............................................................................................................ 5 2.1 Követelmény definíció ............................................................................................................................. 5 2.1.1 A program célja, alapvető feladata ................................................................................................... 5 2.1.2 A fejlesztőkörnyezet ......................................................................................................................... 5 2.1.3 A futtatáshoz szükséges környezet ................................................................................................... 5 2.1.4 A felhasználói felület ........................................................................................................................ 5 2.1.5 Minőségi tényezők ............................................................................................................................ 5 2.1.6 A szoftver minősítése ........................................................................................................................ 6 2.1.7 A kibocsátás ...................................................................................................................................... 6 2.2 Projekt terv ............................................................................................................................................... 6 2.2.1 A fejlesztői csapat ............................................................................................................................. 6 2.2.2 Életciklus modell .............................................................................................................................. 6 2.2.3 Szervezési struktúra .......................................................................................................................... 6 2.2.4 Fejlesztési ütemterv .......................................................................................................................... 7 2.2.5 Határidők........................................................................................................................................... 7 2.2.6 Szükséges dokumentációk ................................................................................................................ 7 2.3 Kibővített feladatleírás ............................................................................................................................. 8 2.4 Szótár ....................................................................................................................................................... 9 2.5 Essential use-case-ek és diagramjuk ...................................................................................................... 11 2.5.1 Diagramok....................................................................................................................................... 11 2.5.2 Use-case-ek leírása: ........................................................................................................................ 11 3. Analízis modell ............................................................................................................................................ 12 3.1 Osztályok és interfészek katalógusa ...................................................................................................... 12 3.1.1. Level osztály .................................................................................................................................. 12 3.1.2. Field osztály ................................................................................................................................... 12 3.1.3. FieldItem osztály............................................................................................................................ 12 3.1.4. Explodeable interfész ..................................................................................................................... 12 3.1.5. Bomb osztály ................................................................................................................................. 12 3.1.6. Indian osztály ................................................................................................................................. 12 3.1.7. Kefir osztály ................................................................................................................................... 13 3.1.8. Amoeba osztály.............................................................................................................................. 13 3.1.9. Moveable interfész ......................................................................................................................... 13 3.1.10. Direction osztály .......................................................................................................................... 13 3.1.11. Rock osztály ................................................................................................................................. 13 3.1.12. Diamond osztály .......................................................................................................................... 13 3.1.13. Land osztály ................................................................................................................................. 13 3.1.14. Gravitable interfész ...................................................................................................................... 13 3.1.15. Wall osztály ................................................................................................................................. 13 3.1.16. Blank osztály................................................................................................................................ 13 3.1.17. Granite osztály ............................................................................................................................. 14 3.1.18. Exit osztály................................................................................................................................... 14 3.1.19. Smell osztály ................................................................................................................................ 14 3.2 Osztályok leírása .................................................................................................................................... 15 Field ......................................................................................................................................................... 15 FieldItem .................................................................................................................................................. 15 Direction .................................................................................................................................................. 16 Level ........................................................................................................................................................ 16 Rock ......................................................................................................................................................... 18 Diamond ................................................................................................................................................... 19 Land ......................................................................................................................................................... 19 Wall .......................................................................................................................................................... 20 Blank ........................................................................................................................................................ 20 Granite...................................................................................................................................................... 21 mike_lefeautt (22.)
1 / 141
2009.05.14.
Amoeba .................................................................................................................................................... 21 Kefir ......................................................................................................................................................... 21 Indian ....................................................................................................................................................... 23 Bomb ........................................................................................................................................................ 23 Exit ........................................................................................................................................................... 25 Smell ........................................................................................................................................................ 26 Moveable.................................................................................................................................................. 26 Gravitable ................................................................................................................................................. 26 Explodable ............................................................................................................................................... 26 3.3. Kibővített use-case diagram .................................................................................................................. 27 3.4. Statikus struktúra diagram .................................................................................................................... 29 3.5 Szekvencia diagramok ........................................................................................................................... 30 3.6 Állapot diagramok ................................................................................................................................. 41 5. Szkeleton tervezése ...................................................................................................................................... 42 5.1. A szkeleton model valóságos use-case-ei ............................................................................................. 42 5.1.1. A skeleton valóságos use-case diagramja: ..................................................................................... 42 5.1.2. A skeleton valóságos use-case-einek leírása.................................................................................. 42 5.2. Architektúra .......................................................................................................................................... 43 5.3. A szkeleton kezelői felületének terve, dialógusok ................................................................................ 52 5.4. Szekvencia diagramok a belső működésre ........................................................................................... 53 Init szekvencia diagram, új játék indítása use casehez ............................................................................ 53 Szekvencia diagram a pályát lép use casehez .......................................................................................... 53 Szekvencia diagram a kiássa a földet use casehez ................................................................................... 54 Szekvencia diagram a gyémántot gyűjt use casehez................................................................................ 55 Szekvencia diagram a sziklát tol use casehez .......................................................................................... 55 Szekvencia diagram a bombát élesít use casehez .................................................................................... 56 Szekvencia diagram a Kefir öl use casehez ............................................................................................. 56 6. Skeleton beadása .......................................................................................................................................... 57 6.1. A skeleton fordítása és futtatása ........................................................................................................... 57 6.1.1. Indítás a batch file-al ...................................................................................................................... 57 6.1.2. Indítás DOS parancssorból ............................................................................................................ 57 6.1.3. A mellékelt zip állomány tartalma: ................................................................................................ 58 6.1.4 A skeleton használata:..................................................................................................................... 61 6.1.5 Pálya felépítése (levezetés egy konkrét példán keresztül) .............................................................. 62 6.2 Értékelés ................................................................................................................................................. 63 7. Prototípus koncepciója ................................................................................................................................. 64 7.0. Változtatások a követelmények módosulása miatt ............................................................................... 64 7.1. Prototípus interface definíció ................................................................................................................ 65 7.1.1. Pálya leíró fileformátum ................................................................................................................ 65 7.1.2. Proto bemenet fileformátum .......................................................................................................... 66 7.1.3. Proto kimenet fileformátum ........................................................................................................... 67 7.2 Összes részletes use-case ....................................................................................................................... 68 7.3. Tesztelési terv ....................................................................................................................................... 69 7.3.1. A bemeneten előforduló hibák kezelése ........................................................................................ 70 7.3.2. A tesztelés menete.......................................................................................................................... 70 7.3.3. A szükséges tesztforgatókönyvek .................................................................................................. 70 7.4 Tesztelést támogató segéd- és fordító programok specifikálása ............................................................ 71 8. Részletes tervek ........................................................................................................................................... 72 8.0. Változtatások az analízis modellben ..................................................................................................... 72 8.1. Objektumok és metódusok tervei. (State chartok és Activity diagramok) ........................................... 72 8.1.1 ActionKeyListener osztály.............................................................................................................. 72 8.1.2. Amoeba osztály.............................................................................................................................. 72 8.1.3 Blank osztály................................................................................................................................... 73 8.1.4. Bomb osztály ................................................................................................................................. 74 mike_lefeautt (22.)
2 / 141
2009.05.14.
8.1.5. CommandProcessor osztály ........................................................................................................... 74 8.1.6. Diamond osztály ............................................................................................................................ 75 8.1.7. Direction osztály ............................................................................................................................ 76 8.1.8. Exit osztály..................................................................................................................................... 76 8.1.9. Field osztály ................................................................................................................................... 77 8.1.10. FieldItem osztály.......................................................................................................................... 78 8.1.11. Game osztály................................................................................................................................ 78 8.1.12. Granite osztály ............................................................................................................................. 79 8.1.13. Gravitable interfész ...................................................................................................................... 80 8.1.14. Indian osztály ............................................................................................................................... 80 8.1.15. Kefir osztály ................................................................................................................................. 82 8.1.16. Land osztály ................................................................................................................................. 83 8.1.17. Moveable interfész ....................................................................................................................... 83 8.1.18. Rock osztály ................................................................................................................................. 83 8.1.19. Smell osztály ................................................................................................................................ 84 8.1.20. Wall osztály ................................................................................................................................. 85 8.1.21. Level osztály ................................................................................................................................ 85 8.2. A tesztek részletes tervei, leírásuk a teszt nyelvén ............................................................................... 91 8.3. A tesztelést támogató programok tervei ............................................................................................. 110 9. Prototípus - beadás ..................................................................................................................................... 111 9.1. A prototípus fordítása és futtatása....................................................................................................... 111 9.1.1. Indítás a batch file-al .................................................................................................................... 111 9.2. A mellékelt állomány tartalma ............................................................................................................ 112 9.2.1. A játékprogram (src mappa) fájllistája: ...................................................................................... 112 9.2.2. A játékprogram kimenetét ellenőrző program fájllistája: ........................................................... 112 9.2.3. A játékprogram térképeit tartalmazó maps mappa fájllistája: .................................................... 113 9.2.4. A játékprogram parancsfájljait tartalmazó test mappa fájllistája: ............................................... 113 9.2.5. A játékprogram kimenetét tartalmazó out mappa fájllistája: ...................................................... 114 9.3. A tesztelés egy példánya ..................................................................................................................... 114 9.3.1. Teszt pálya példa.......................................................................................................................... 114 9.3.2. Bemeneti tesztparancsfájl példa ................................................................................................... 115 9.3.3. Teszt kimenet példa ..................................................................................................................... 115 9.4. A tesztelés eredményeinek összefoglalása.......................................................................................... 115 9.5 Értékelés ............................................................................................................................................... 118 11. Grafikus felület specifikálása ................................................................................................................... 120 11.1. A menürendszer, a kezelői felület grafikus képe .............................................................................. 120 11.2. A felület működési elve, a grafikus rendszer architektúrája ............................................................. 121 11.3. Grafikus objektumok ........................................................................................................................ 121 GraphicsController ................................................................................................................................. 121 Cave ....................................................................................................................................................... 122 InfoPanel ................................................................................................................................................ 122 11.4 Grafikus osztályok részletes tervei .................................................................................................... 122 11.4.1. Cave osztály ............................................................................................................................... 122 11.4.2. GraphicsController osztály ........................................................................................................ 123 11.4.2. InfoPanel osztály........................................................................................................................ 123 11.4.3. Loading osztály .......................................................................................................................... 124 11.4.4. WinnerScreen osztály ................................................................................................................ 124 11.4.5. TimerTask osztály ...................................................................................................................... 124 11.5. Szekvencia diagram .......................................................................................................................... 126 13. Grafikus változat beadása ........................................................................................................................ 127 13.1. A letölthető program fordításával és futtatásával kapcsolatos útmutatás ......................................... 127 13.1.1. Indítás batch fájllal ..................................................................................................................... 127 13.2 A mellékelt állomány tartalma ........................................................................................................... 127 13.2.1 A játékprogram fájllistája: ......................................................................................................... 127 mike_lefeautt (22.)
3 / 141
2009.05.14.
14. A projekt értékelése ................................................................................................................................. 130 Összesített értékelés ....................................................................................................................................... 131 Naplók ............................................................................................................................................................ 132 2. Napló – Követelmény, projekt, funkcionalitás ...................................................................................... 132 3-4. Napló – Analízis modell ..................................................................................................................... 133 5. Napló – Szkeleton tervezése .................................................................................................................. 135 6. Napló – Szkeleton beadása .................................................................................................................... 135 7. Napló – Prototípus koncepciója ............................................................................................................. 136 8. Napló – Részletes tervek ........................................................................................................................ 137 9-10. Napló – Prototípus beadás ................................................................................................................ 138 11. Napló – Grafikus felület specifikációja ............................................................................................... 139 13. Napló – Grafikus változat beadása ...................................................................................................... 139
mike_lefeautt (22.)
4 / 141
2009.05.14.
2. Követelmény, projekt, funkcionalitás 2.1 Követelmény definíció 2.1.1 A program célja, alapvető feladata A program nem más, mint egy ügyességi játék, ahol a feladat a pályán lévő gyémántok megszerzése. A játék célja a következő pályára való lépés, amelyet kellő számú gyémánt összegyűjtésével érhetünk el, miközben különféle akadályokat kell elkerülni és legyőzni. A játékmenet részletesebb leírása a játék ismertetésénél található. A fejlesztés célja egy olyan játékprogram előállítása, mely működőképes, élvezhetően játszható, és amely minden olyan gépen futtatható, melyen a megfelelő Java futtatókörnyezet található.
2.1.2 A fejlesztőkörnyezet Az UML modellezéshez külön segédprogramot használunk, a Sparx Systems Enterprise Architect 7.1 nevű UML fejlesztő eszközét. A forráskód szerkesztéséhez és fordításához a Netbeans IDE 6.5.1 fejlesztőkörnyezetet választottuk. Közben ügyelünk arra, hogy a program kompatibilis legyen a Sun Java 1.4-es szabványával. A cél az, hogy a játékprogram a Hallgatói Számítógép Központban rendszeresített JDK alatt fordítható és futtatható legyen. A dokumentumokat a Microsoft Word 2003 szövegszerkesztőn készítjük el. A napló vezetésére Microsoft Word 2007-et használunk.
2.1.3 A futtatáshoz szükséges környezet Java Runtime Environment, illetve olyan számítógép, mely ezt futtatni képes. A ajánlásunk a programot futtató a PC-re: Intel Pentium 800 MHz vagy gyorsabb processzor és 512 MB memória. A játék használatához grafikus képernyő és billentyűzet szükséges.
2.1.4 A felhasználói felület A játékprogram grafikus felhasználói felülettel fog rendelkezni, a programot a felhasználó billentyűzet segítségével vezérelheti.
2.1.5 Minőségi tényezők Teljesítmény: A cél az, hogy a játék élvezhetően játszható legyen a meghatározott minimális rendszeren. Újrafelhasználhatóság: A cél az, hogy a pályákat a program többi részétől teljesen különválasszuk, így lehetővé téve azt, hogy később egyszerűen tudjunk a játékhoz új pályákat létrehozni. Rugalmasság: A rugalmasságot a fejlesztőkörnyezet biztosítja, a játéknak ugyanis minden olyan környezetben futtathatónak kell lennie, melyben létezik megfelelő Java futtatókörnyezet. Felhasználhatóság: A használat különösebb tanítást nem igényel, alapfokú számítástechnikai tudással a felhasználói kézikönyv elolvasása után könnyen játszható, az említett dokumentum is inkább az irányítás és a játékszabályok miatt fontos. mike_lefeautt (22.)
5 / 141
2009.05.14.
2.1.6 A szoftver minősítése A fejlesztett szoftver akkor megfelelő, ha minél pontosabban megegyezik a fentebb leírtakkal és a feladat előzetes leírásával. Ezt ellenőrizni lehet a játék futtatásával és kipróbálásával.
2.1.7 A kibocsátás A program kibocsátása először a konzulens felé fog történni. Az ellenőrzés és az értékelés után a program a világhálón is elérhetővé válik.
2.2 Projekt terv 2.2.1 A fejlesztői csapat CSAPATTAG NEVE
FELADATKÖRE
Mikes Péter Tündik Máté Ákos Déri András Sóskuthy Zalán
csapatvezető, kódolás, naplózás, egyéb dokumentáció, tesztelés, pályatervezés kódolás, tesztelés, grafika dokumentáció, tesztelés
2.2.2 Életciklus modell A feladat először a program megtervezése, mely a dinamikus- és objektummodelleket foglalja magába. Ezen feladatok elvégzése után elkezdődhet a szkeleton rész tervezése és implementálása. A megfelelő modellek alapján itt már nem merülhet fel semmiféle komplikáció. A szkeleton rész elvégzése után a programnak alkalmasnak kell lenni arra, hogy a különböző forgatókönyvek és szekvencia diagramok ellenőrizhetők legyenek. A következő feladat a prototípus elkészítése. A prototípus program célja annak demonstrálása, hogy a program elkészült, helyesen működik, valamennyi feladatát teljesíti, csak a kifejlett grafikus interfész hiányozhat. A programnak ebben az állapotban könnyen tesztelhetőnek kell lennie. A megjelenítés és működtetés egy alfanumerikus képernyőn lesz követhető, ugyanakkor a működés fájlba is logolható lesz, ezzel megteremtve a rendszer tesztelésének lehetőségét. Ha már a prototípus is megfelelő, akkor kezdődhet a grafikus felület megvalósítása. A teljes változat a prototípustól csak a kezelői felület minőségében fog különbözni. Itt is fontos a tesztelés és a kiértékelés, mert a jó megjelenés sokat számít a játék élvezhetőségében. Ha fentebb említett feladatrészek elkészültek, kész lesz a program első változata. A kötelező feladat csak eddig tart, ezt a változatot kell leadni a dokumentációval és a forráskóddal együtt.
2.2.3 Szervezési struktúra A csapat négy emberből áll. A feladat szempontjából a tudásunk közel azonos, s bár programozókra és dokumentálókra osztottuk a csapatot, terveink szerint a programozók is fognak dokumentálni és a dokumentálók is fognak programozni. Azt a felépítést választottuk, hogy mindenki az érdeklődésének és tudásának legmegfelelőbb részeket kapja az egyes feladatokból. mike_lefeautt (22.)
6 / 141
2009.05.14.
A feladatok szétosztását az értekezleteken beszéljük meg, ahol az egyéni kívánságok mellett ügyelünk arra is, hogy minden feladat kiosztásra kerüljön, valamint a csapattagok az egész feladat megoldásából nagyjából egyenlő mértékben vegyék ki a részüket. Az értekezleteken, mivel a szétosztott feladatok nagymértékben függnek egymástól, javaslatokat teszünk egymásnak a feladat megoldásának körülményeit és a határidőket illetően. Ezt követően a csapattagok elvégzik a rájuk kiosztott feladatokat, majd a többi csapattag is átnézi a másik a munkáját és közös egyeztetés után tesszük közzé a végső verziókat. Hogy a fejlesztés minél hatékonyabb és zökkenőmentes legyen, folyamatosan értekezünk a következő módokon: a fő értekezési pont az értekezletek, itt beszéljük meg a leglényegesebb dolgokat; személyesen és különböző messenger programok és e-mail-eken keresztül is értekezünk; létrehoztunk a világhálón egy „csapatcetlit”, melyre bárki kiírhatja a fontos információkat, ötleteit; a feladatok megoldása közben keletkezett anyagokat egy a csapat tagjai számára hozzáférhető helyen tároljuk és SVN verziókezelést használunk.
2.2.4 Fejlesztési ütemterv A program fejlesztésének három fő lépcsőfoka van, ezek a következők: Szkeleton: A cél az, hogy mind a dinamikus, mind az objektum modell jól legyen kitalálva. Ha ezek elkészültek, akkor a fejlesztés szempontjából sikeresen leraktuk a szükséges alapokat. Prototípus: Ez szinte már a teljes változat, csak a grafikus felület elemei hiányoznak. Ez a változat tökéletesen megfelelő arra, hogy az objektumok, rutinok, függvények szemantikai helyességét vizsgáljuk. Grafikus változat: A program teljes változata. Tulajdonképpen a prototípus a grafikus felülettel kiegészítve, esetleg kismértékben továbbfejlesztve.
2.2.5 Határidők Febr. 13. Febr. 19. Febr. 26. Márc. 5. Márc. 12.
A csapatok regisztrációja Követelmény, projekt, funkcionalitás beadása Analízis modell kidolgozása I. beadása Analízis modell kidolgozása II. beadása Szkeleton tervezése beadás
Márc. 19. Márc. 26. Ápr. 2. Ápr. 16. Ápr. 23. Máj. 7. Máj. 14.
Szkeleton beadása Prototípus koncepciójának beadása Részletes tervek beadása Prototípus beadása Grafikus felület specifikációjának beadása Grafikus változat beadása Összefoglalás beadása
2.2.6 Szükséges dokumentációk Az a dokumentáció, mely a fejlesztés során keletkezik, a program belső működési elvét jeleníti meg, egy esetleges továbbfejlesztésnél nagy előnyt jelent. Ezentúl a felhasználó számára is szükséges egy dokumentáció készítése, a játszhatóság és a könnyű használhatóság érdekében. A program a felhasználónak
mike_lefeautt (22.)
7 / 141
2009.05.14.
készül, így azt úgy kell közzétenni, ahogy a felhasználó elvárja és megérti azt, a játék pedig örömet és nem bosszúságot jelent a számára.
2.3 Kibővített feladatleírás J Ú Z K É Z – A JÁTÉK A játék nevét Júz Kéz, a kincskereső indián ihlette, akinek a feladata az, hogy gyémántokat gyűjtsön össze egy kétdimenziós nézetű barlangban. A barlangot fal veszi körül, ezen a falon az indián semmiképpen sem tud áthatolni. Magát a barlangot alapvetően gránitok, sziklák, kiásható föld, valamint gyémántok alkotják. Ezek a geológiai tényezők jelentős mértékben befolyásolják Júz Kéz mozgását. Júz Kéz 6 irányban képes mozogni: fel, balra-fel, balra-le, le, jobbra-le, jobbra-fel. Ez a szabad mozgás csak akkor lehetséges, ha ezekben az irányokban Júz Kéz mellett csak föld, vagy a kiásott föld helyén maradó üres terület található. Ha bombára lép, akkor felveszi azt, de csak akkor, ha a bomba nincs aktív állapotban, vagyis nem ketyeg. Ha gyémántos mezőre lép Júz Kéz, akkor a gyémántot felveszi, csökken a begyűjtött gyémántok száma. Ha sziklával találkozik, képes odébb tolni, feltéve, hogy üres mező van a tolás irányában. A játék során gravitációval is kell számolnia bátor indiánunknak, amely akár halálát is okozhatja. Ugyanis, ha egy szikla alól kiássuk a földet, akkor a lefelé zuhanó(!) szikla Júz Kéz halálát okozza. Ugyanez igaz, a zuhanó gyémántokra is! Ha a szikla nem zuhan, csak alatta áll Júz Kéz, akkor a fejével képes azt halálos sérülés nélkül megtartani. A gránitra nincs hatással a gravitáció. Szintén a gravitáció okozza azt, hogy ha egymáson lévő sziklák vagy gyémántok találhatóak a barlangban, akkor ezek oldalsó támasz hiányában kupacban omlanak le. Az a szabály, hogy ha van lehetőség, akkor a legördülés iránya a bal, egyébként a jobb. A leomlást mindig a legfelső elem kezdi. A sziklával ellentétben a gránitot nem lehet mozgatni, fel kell robbantani, hogy Júz Kéz a robbanószer lyukfúrása után tovább tudjon haladni. A robbanószer 2 célja tehát a grániton való áthatolás, és szörnypusztítása. A robbanószer Júz Kéz mozgásához hasonlóan 6 irányban robbantja a földet (1 mező hatótávban), valamint lehelyezését követően 2 másodperc múlva robban. A robbanószerrel vigyázni kell, mert elpusztíthatja főhősünket! Megjelennek tehát még szörnyek is. Ezeknek 2 típusa van: Amőba, Kefír. Az Amőba terjeszkedik a barlang falától annak belseje felé haladva, s szerencsétlen esetben körbezárja hősünket. Elpusztítani robbantással nem lehet. Az Amőba csak földdel táplálkozik növekedése során, valamint üres területre is ránőhet, de a gránitot, a sziklát, a gyémántot és a játékost nem tudja megenni! Kefír vérszomjasan üldözi Júz Kézt, azonban ha rázuhan egy szikla, gyémánttá változik. Ha robbanószer által hal meg, nem kapunk gyémántot, helyén üres mező lesz. Kefír akkor öli meg Júz Kézt, ha a barlangban közvetlenül egymás mellé kerülnek.
mike_lefeautt (22.)
8 / 141
2009.05.14.
Miután Júz Kéz sikeresen felszedte az összes gyémántot, a barlang falán megjelenik a kijárat. A barlang keretéül szolgáló fal egyik mezője változik kijárattá. Így a következő pályára jutunk, kivéve az utolsó pályát, hiszen: Az utolsó szint teljesítése után a készítők gratulációja fogadja a játékost. A barlangban maradó (Kefír robbantásból hátramaradó) gyémántok csak bónuszt jelentenek, a szintlépéshez ezek begyűjtése nem követelmény. A játék 3 szintből áll. Az első szinten csak gyémántokat kell összegyűjtögetni (különösebb nehézségek nélkül, szörnyektől nem kell tartani, csak a terepakadályokat kell leküzdeni), a 2.-on megjelenik a vérszomjas Kefír, a 3. szinten pedig az Amőba. A 2. szinten nem feltételnül kell megölni a Kefírt a sikeres szintlépéshez. A játék tartalmaz egy instant pályaugrási lehetőséget is, amelyet úgy érhetünk el, hogy a Kefírre gyémántot ejtünk. Minden szint teljesítéséhez 60 másodperc áll rendelkezésre. Ha lejár az idő, a pálya újraindul. Júz Kéz vagy Júz Láb halála esetén (akár szörny által, akár időtúllépés miatt történt): az adott szintet újra kell kezdeni!
2.4 Szótár Júz Kéz Júz Láb
a kincskereső indián, a játék egyik főszereplője a kincskereső indián, a játék másik főszereplője olyan eleme a pályának (szintnek), melyet Júz Kéz gyűjt össze, ez a gyűjtögetés adja a játék lényegét maga a játéktér, melyen belül mozognak a szörnyek és Júz Kéz is, emellett többféle terepelemnek ad teret, pl. a már említett Gyémántnak, emellett gránitnak, sziklának, földnek olyan terepelem, mely mozdíthatatlan, azonban robbantás után át lehet haladni helyén a Barlang-ot (játékteret) veszi körül, mozdíthatatlan és megsemmisíthetetlen terepelem
Gyémánt
Barlang
Gránit Fal
olyan terepelem, mely mozdítható, emellett képes zuhanni és gördülni is ezt a fajta terepelemet – nevéből adódóan – Júz Kéz „ássa ki.”, mely annyit tesz, hogy az ilyen típusú mezőre lépve üres területté válik olyan terepelem, amelyen szabad az átjárása a szörnyeknek és Júz Kéznek is, emellett zuhanópályául szolgálhat gyémántnak és sziklának a barlangot felépítő elemek, mezőn állhat szikla, gyémánt, szörny,
Szikla
Kiásható föld Üres terület
Mező felveszi Begyűjtött
stb Júz Kéz begyűjti, „felveszi” a gyémántot, ekkor a gyémánt helyén üres terület lesz gyémántok ahány gyémántot felvett az adott szinten Júz Kéz. A pálya végére
mike_lefeautt (22.)
9 / 141
2009.05.14.
száma
a begyűjtött gyémántok számának maximálisnak kell lennie (ebbe azokat értjük bele, melyek eredetileg is a barlang mezőin
Odébb tolni Halál
Zuhanó(!) szikla
Zuhanó gyémántokra Kupacban omlanak le Legördülés
Robbanószer lyukfúrása
Szörny-pusztítása Lehelyezés Szörny Amőba
Kefír
Gyémánttá változik Kijárat
megjelentek, bónuszokat nem számítjuk bele.), hisz csak ebben az esetben teljesíthető a pálya, ekkor jelenik meg a kijárat Júz Kéz képes a sziklát a pálya üres mezőjére mozgatni, „odébb tolni” megtörténhet szörnyekkel és Júz Kézzel is; ha utóbbinál következik be a halál, akkor annak a pálya újrakezdése lesz a következménye. Ha szörnyek halnak meg, könnyebb teljesíteni a pályát, kevesebb az akadályozó tényező ha egy vagy több mezőnyi üres terület van a szikla alatt – és Júz Kéz vagy Júz Láb nem áll a szikla alatt közvetlenül – zuhanni kezd, és halált okozhat, Júz Kéznek is, szörnyeknek is ugyanaz igaz Júz Kéz esetében, mint a zuhanó sziklára. Azonban ha Kefírre esik, akkor: Szintlépés következik be! a zuhanó sziklák és a gyémántok is, melynek előzményeként egymáson legördülnek sziklák és gyémántok esetén bekövetkező esemény, a lehetőségekhez mérten mindig balra gördülnek el, ha ez nem lehetséges, akkor jobbra robbanószert helyezünk a gránit melletti mezőre, majd ez felrobban, lyukat fúr rajta, és a lyukfúrás által keresztülhaladhatunk azon a mezőn is robbanószerrel és sziklával lehetséges, annak halálát okozza a robbanószert a megfelelő helyre lehelyezve Kefírt ölhetünk, illetve gránitot robbanthatunk mozgó pályaelem, mely megkeseríti Júz Kéz gyémántgyűjtési akcióját. Két típusa van: Amőba és Kefír szaporodásra képes szörny, mely a pálya szélétől indulva terjeszkedik a középpontja felé, megölni nem lehet, de ő sem öli meg Júz Kéz-t,”csak” körbekerítheti üldözi Júz Kézt, és ha szomszédos mezőre kerül vele, halált okoz neki, azonban elpusztítható robbanószerrel, és zuhanó sziklával is (ekkor átalakuláson megy keresztül). Ha zuhanó gyémánttal találkozik, pályaugrás következik be kefírre igaz, ha zuhanó szikla pusztítja el A kijárat biztosítja a szintek közti átjárást. A megfelelő számú
gyémánt összegyűjtése után jelenik meg a barlangban. Terepakadályok Gránit, Szikla, amelyek lassítják Júz Kéz mozgását Instant pályaugrási Ha kefírre gyémánt zuhan, ez következik be. lehetőség mike_lefeautt (22.)
10 / 141
2009.05.14.
Időtúllépés
Max. 60 másodperc áll rendelkezésre az egyes pályák teljesítésére. Ha valaki ezt túllépi, akkor Júz Kéz meghal.
Oldalsó támasz
Nem üres mező, amely meggátolja, hogy meginduljon a gördülés
2.5 Essential use-case-ek és diagramjuk 2.5.1 Diagramok
2.5.2 Use-case-ek leírása: Use-case: Actor: Leírás:
új játék játékos A játékos új játékot kezd
Use-case: Actor: Leírás:
gyémántgyűjtés játékos A játékos gyémántokat gyűjt.
Use-case: Actor: Leírás:
pályalépés játékos A játékos a gyémántok összegyűjtése után pályát lép.
mike_lefeautt (22.)
11 / 141
2009.05.14.
3. Analízis modell 3.1 Osztályok és interfészek katalógusa 3.1.1. Level osztály Ez az osztály kezeli a játék egy adott pályájával kapcsolatos alapvető információkat. Feladata a pálya megkonstruálása egy külső fájlban tárolt információk alapján, ezen kívül itt tároljuk a pálya hálózatának belépési pontját, innen érhetőek el a pályán mozogható objektumok, valamint itt tartjuk számon a pályalépéshez szükséges maradék gyémántok számát.
3.1.2. Field osztály A Field osztály az építőeleme a játéktérnek, ahol Júz Kéz mozog. A pálya a Field objektumokból úgy épül fel, hogy minden Field ismeri a szomszédait 6 irányban (láncolt lista jelleggel). Ez a láncolásos felépítés lehetővé teszi akár több dimenzió kezelését is. Minden Field objektum tartalmaz egy FieldItem objektumot, amely a mezőt tényleges viselkedéssel ruházza fel, pl. Földdé, Kefírré, stb. teszi. A pályán történő mozgások során a Field-ek láncolásából adódó háló lerögzített, csak a FieldItemek vándorolnak az egyes Fieldek között. A Fieldeknek a FieldItemek közötti kommunikáció megvalósításában is szerepük van, hiszen 2 szomszédos Fielden elhelyezkedő FieldItem nem tud egymásról, csak a befoglaló Fieldjükön keresztül érik el egymást.
3.1.3. FieldItem osztály Az osztály, amelyből a pályán lévő élő és élettelen objektumokat származtatjuk, mint például Gyémánt, Szikla, Júz Kéz, stb. Minden FieldItem nevéből adódóan egy Field része.
3.1.4. Explodeable interfész Ez az az interfész, amelyet azok az osztályok implementálnak, amelyek bomba hatására felrobbanak, megsemmisülnek.
3.1.5. Bomb osztály Ez az osztály reprezentálja a robbanószert, amelyet Júz Kéz lehelyezhet, visszaszámlálását elindíthatja, majd adott idő leteltével felrobban.
3.1.6. Indian osztály Ez az osztály reprezentálja Júz Kézt és Júz Lábot, a gyémántkereső indián párost. Az indiánokról tudjuk, hogy aktuálisan merre néznek, mennyi bombával rendelkeznek, amelyet a mellette lévő Fieldre telepíthet. Júz Kéz ezen kívül mozoghat is a mellette lévő mezőre, ha az üres, vagy szikla, amelyet arrébb tolhatunk.
mike_lefeautt (22.)
12 / 141
2009.05.14.
3.1.7. Kefir osztály Ez az osztály reprezentálja Kefirt a vérszomjas szörnyet, aki üldözi valamely indiánt. Mozgását az indiánok által hátrahagyott szag-információi alapján végzi. Ha az egyik indián mellé kerül, megöli őt. Ha robbanó bomba mellett van, felrobban. Sziklát ráejtve megölhetjük.
3.1.8. Amoeba osztály Ez az osztály reprezentálja Amőbát, a szaporodásra képes ellenséget, amely próbálja beszorítani Júz Kézt, de megölni nem tudja. Felrobbanni nem tud. Célja az egész pálya beterítése.
3.1.9. Moveable interfész Ez az az interfész, amelyet a mozgásra képes objektumok implementálnak.
3.1.10. Direction osztály Segédosztály, amelyben statikus konstansok formájában fel, balra-fel, balra-le, le, jobbra-le, jobbra-fel irányokat tárolunk a mozgatások megkönnyítése végett.
3.1.11. Rock osztály Ez az osztály reprezentálja a bányában található eltolható Sziklát. A sziklák gravitáció hatására leesnek/legördülnek egymásról és halált is okozhatnak.
3.1.12. Diamond osztály Ez az osztály reprezentálja a pályán lévő indiánok által összegyűjtendő Gyémánt objektumokat. A gyémántok gravitáció hatására leesnek/legördülnek egymásról.
3.1.13. Land osztály Ez az osztály reprezentálja az indián által kiásandó Földet. Ha robbanó bomba mellett van, ő is felrobban.
3.1.14. Gravitable interfész Ez az az interfész, amelyet azok az osztályok implementálnak, amelyekre hat a gravitáció, és ezáltal egymáson legördülnek, szabad terepen pedig szabadon esnek.
3.1.15. Wall osztály Ez az osztály reprezentálja a játéktér/barlang szélét, amelyet sem felrobbantani, sem azon áthatolni nem lehetséges.
3.1.16. Blank osztály Ez az osztály reprezentálja azokat a mezőelemeket, amelyek üresek, teljesen átjárhatóak. mike_lefeautt (22.)
13 / 141
2009.05.14.
3.1.17. Granite osztály Ez az osztály reprezentálja a gránit tulajdonságú mezőelemeket, amelyet csak robbantással lehet megnyitni. Gravitáció nem hat a Granite objektumokra.
3.1.18. Exit osztály Ez az osztály egy specializált, kitüntetett szerepű Fal osztály, amely a pályák közti átjárhatóságot teszi lehetővé.
3.1.19. Smell osztály Ez az osztály reprezentálja azt a szaginformációt, ami alapján Kefir megpróbálja becserkészni Júz Kézt.
mike_lefeautt (22.)
14 / 141
2009.05.14.
3.2 Osztályok leírása Field Alaposztály
nincs
Példányok száma
n
Konkurencia
passzív
Perzisztencia
dinamikus
Komponensek Fielditem
fi
Field
neighbors[6]
Relációk
nincs
Változók
nincs
Szolgáltatások boolean
sendMoveRequest(int,FieldItem)
Igazzal tér vissza, ha egy adott mezőre mozgás teljes folyamata végbement.
void
setEmpty()
Blank mezőt állít be. Erre robbantás után és mozgás során van szükség.
void
setFieldItem(FieldItem)
Mezőelemet állít be.
FieldItem
getFieldItem()
Mezőelemet kér le.
boolean
transmitMoveRequest(int,Fielditem)
Igazzal tér vissza, ha egy adott mezőre mozgás sikeres volt.
boolean
compareToNeighbor(Class, int)
Ezzel a metódussal lehetőségünk van egy paraméterként adott osztálytípust összehasonlítani a Fieldtől megadott irányban lévő szomszéd FieldItem típusával.
Field
getNeighbor(int)
Az adott irányba lévő szomszédjának referenciáját adja vissza
void
setNeigbor(int i, Field f)
Az adott Field-et beregisztrálja az aktuális objektum megadott irányú szomszédjának.
FieldItem Alaposztály
nincs
mike_lefeautt (22.)
15 / 141
2009.05.14.
Példányok száma
n
Konkurencia
passzív
Perzisztencia
dinamikus
Komponensek Field
f
Relációk
nincs
Változók
nincs
Szolgáltatások void
Beállítja az adott, FieldItem típusú mezőt. Absztrakt függvény.
setField
Direction Alaposztály
Nincs
Példányok száma
0
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek
nincs
Relációk
nincs
Változók int
DOWN
Lefelé irány
int
LEFT_U
Balra-fel irány
int
LEFT_D
Balra-le irány
int
RIGHT_D
Jobbra-le irány
int
RIGHT-U
Jobbra-le irány
int
UP
Felfelé irány
Szolgáltatások
nincs
Level Alaposztály
Nincs
Példányok száma
1
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek Field
entryPoint mike_lefeautt (22.)
16 / 141
2009.05.14.
Indian
jk
Indian
jl
static Exit
e
static Game
g
List
amobas
List
gravitables
List
kefirs
Relációk
nincs
Változók int
E változóban tároljuk a pályán lévő,
nrOfDiamonds
még be nem gyűjtött gyémántok számát. Dimension
size
A pálya magasságát és szélességét tárolja.
File
protoFile
A prototípus tesztelésére használt parancsfájlra mutató referencia
static int
numOfLevel
Az egyes pálya azonosítója
static Timer
timer
A pálya teljesítéséhez szükséges időt számláló objektum
TimerTask
tt
Egy másodpercenként csökkenti a hátralevő idők számát egyel.
Field[][]
field_matrix
Ebbe hozzuk létre a pálya beolvasásakor az egyes mezőket.
Character[][]
c
A pálya beolvasásának első lépcsőjében ide olvassuk be az egyes mezők típusát, majd a továbbiakban ezt dolgozzuk fel.
Level(int, Game)
Létrehozza a mezők hálóját felhelyezi a mezőelemeket is.
Szolgáltatások és
static void
incrementNumberOfDiamond() Növeljük a pályán gyémántok számát egyel.
static void
diamondCollected()
Csökkenti a gyémántok szám
static void
checkExit()
Megvizsgálja a begyűjtött gyémántok száma alapján, hogy a kilépő kaput kinyithatjuk-e.
void
run()
A játék vezérlése
static void
NextLevel()
A következő pálya betöltését kezdi meg.
static void
Restart()
Az adott pálya újratöltését kezdi meg.
static int
getNrOfDiamonds()
A felszedendő gyémántok számát
mike_lefeautt (22.)
17 / 141
található
2009.05.14.
adja vissza. static int
Az adott pálya azonosítóját adja
getNumOfLevel()
vissza. int
getTime()
Az adott időt másodpercben
adja
vissza
int
getJKBombNumb()
Visszaadja Júz Kéz bombáinak számát.
lerakható
int
getJLBombNumb()
Visszaadja Júz Kéz bombáinak számát.
lerakható
Rock Alaposztály
Moveable Gravitable
Példányok száma
[0..N]
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek Field
f
Relációk
nincs
Változók isFalling
Az esés állapotát tárolja
void
fall()
Zuhanó szikla esetén hívódik meg, szükség esetén – a zuhanás végén - a gördülés is végbemegy.
boolean
roll()
A gördülést végrehajtó függvény. Ha sikeresen tud gördülni, igaz értékkel
boolean Szolgáltatások
tér vissza, egyébként hamissal. boolean
move(Direction)
Tolás esetén eza függvénye hívódik meg,
boolean
catchMoveRequest (int, FieldItem)
Igazat ad vissza, ha az adott, szikla típusú mezőre lépés sikeresen végbement.
void
setField(Field)
Beállítja az adott szikla mezejét, amin éppen áll.
boolean
isFalling()
Igazzal tér vissza, ha esés állapotában van az adott objektum
void
setIsFalling(boolean)
mike_lefeautt (22.)
Az isFalling változó változtathatjuk vele.
18 / 141
értékét
2009.05.14.
Diamond Alaposztály
Dead Gravitable
Példányok száma
[0..N]
Perzisztencia
Dinamikus
Komponensek Field
F
Relációk
nincs
Változók private boolean
isFalling
Az esés állapotát tárolja
private boolean
isAlive
Fel van-e már szedve az adott gyémánt
boolean
isFalling()
Igazzal tér vissza, ha esés állapotában van az adott objektum
void
setIsFalling(boolean)
Az isFalling változó értékét változtathatjuk vele.
void
fall()
A gyémánt zuhan, majd szükség esetén
Szolgáltatások
gördül. boolean
roll()
Igaz értékkel tér vissza, ha a gördülés sikeres volt, egyéb esetben hamissal.
boolean
catchMoveRequest (dir,FieldItem)
Igazat ad vissza, ha az adott, gyémánt típusú mezőre lépés sikeresen végbement.
void
setField(Field)
Beállítja az adott gyémánt mezejét arra, amin éppen áll.
Land Alaposztály
Explodable
Példányok száma
[0..N]
Konkurencia
Passzív
Perzisztencia
Dinamikus
Komponensek Field
f
Szolgáltatások Ha a bombarobbanás hatósugarában van, üres mezőre vált.
void
explode()
boolean
catchMoveRequest(int,FieldItem) Igazat ad vissza, ha az adott, föld típusú mezőre lépés
mike_lefeautt (22.)
19 / 141
2009.05.14.
sikeresen végbement.
Wall Alaposztály
FieldItem
Példányok száma
[0..N]
Perzisztencia
Dinamikus
Field
F
Relációk
nincs
Változók
nincs
Szolgáltatások boolean
catchMoveRequest (int,FieldItem)
Igazat ad vissza, ha az adott, fal típusú mezőre lépés sikeresen végbement, azonban a játék során ez lehetetlen eseménynek számít (azaz mindig hamissal tér vissza.)
void
setField(Field)
Beállítja az adott fal mezejét.
Blank Alaposztály
FieldItem
Példányok száma
[0..N]
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek Field
f
Smell
smell
Relációk
nincs
Változók
nincs
Szolgáltatások void
setField(Field)
Beállítja mezőt.
az
adott
üres
boolean
catchMoveRequest(int, FieldItem)
Igazat ad vissza, ha az adott, üres mezőre lépés sikeresen végbement.
boolean
getSmellState()
Igaz értékkel tér vissza, ha szagos a mező, különben hamissal tér vissza.
void
Ezzel szagosítjuk az adott mezőt.
initSmell()
mike_lefeautt (22.)
20 / 141
2009.05.14.
Granite Alaposztály
FieldItem
Példányok száma
[0..N]
Konkurencia
Passzív
Perzisztencia
Dinamikus
Komponensek Field
f
Relációk
nincs
Változók
nincs
Szolgáltatások Ha a bombarobbanás hatósugarában van, üres mezőre vált.
void
explode()
boolean
catchMoveRequest(int,FieldItem) Igazat ad vissza, ha az adott, gránit típusú mezőre lépés sikeresen végbement.
void
setField(Field)
Beállítja mezejét.
az
adott
gránit
Amoeba Alaposztály
Alive
Példányok száma
[0..N]
Konkurencia
Passzív
Komponensek Field
f
Változók l
A terjeszkedés tároljuk benne.
void
grow()
Az összefüggő amőbatest mérete 1 mezőnyivel nő.
void
setField()
Beállítja az adott amőba mezejét.
boolean
catchMoveRequest (int,FieldItem)
Igazat ad vissza, ha az adott, Amoeba típusú mezőre lépés
LinkedList
random
irányát
Szolgáltatások
sikeresen végbement.
Kefir Alaposztály mike_lefeautt (22.)
Alive 21 / 141
2009.05.14.
Moveable Példányok száma
0..1
Konkurencia
Passzív
Perzisztencia
Dinamikus
Komponensek Field
f
Relációk
nincs
Változók
nincs
boolean
goodWay
Ebben tároljuk, hogy Kefir szagot fogott, vagy csak bolyong.
boolean
secTurn
Ha igaz, akkor nem talált maga körül szagos mezőt.
boolean
isDead
Halott-e az adott Kefír.
LinkedList
l
A terjeszkedés random irányát tároljuk benne.
void
explode()
Kefír meghal, helyére gyémánt kerül.
boolean
move(int)
Igazzal tér vissza, ha megtörtént
Szolgáltatások
Kefír mozgása irányba.
a
megadott
void
setField(Field)
Beállítja azon mező adottságait, melyen Kefír áll.
void
getSmell(Smell)
Kefír tudomást szerez Júz Kéz szagáról.
void
setGoodWay()
Ez a metódus jelöli Kefírnek, hogy szagot fogott.
boolean
isDead()
Visszatér az isDead értékével
boolean
isSecTurn()
Visszatér a SecTurn értékével.
boolean
catchMoveRequest (int,FieldItem)
Igazat ad vissza, ha az adott, kefír típusú mezőre lépés sikeresen végbement.
mike_lefeautt (22.)
22 / 141
2009.05.14.
Indian Alaposztály
Moveable Explodeable
Példányok száma
1
Konkurencia
Passzív
Perzisztencia
Dinamikus
Komponensek List
Bomb
Field
f
Változók
Nincs
private int
actualDirection
Merre néz az indiánunk.
private int
numOfBombs
A lerakható bombáinka száma
private String
name
Az adott indián azonosítója
Relációk
nincs
Szolgáltatások void
explode()
Júz Kéz meghal, a pálya egyből újrakezdődik.
boolean
move(int)
Igazzal tér vissza, ha megtörtént Júz Kéz mozgása.
boolean
placeBomb()
Igazzal tér vissza, ha Júz Kéz lehelyezte a bombát a pálya egyik mezőjére.
void
setField(Field)
Beállítja azon mező adottságait, melyen Júz Kéz áll.
void
removeBomb()
Eltávolít egy bombát bombakészletéből
int
getActualDirection()
Beállíthatjuk, hogy merre nézzen az
Júz
Kéz
indián boolean
catchMoveRequest (int,FieldItem)
Igazat ad vissza, ha az adott, indián típusú mezőre lépés sikeresen végbement.
void
addBomb()
Egyel megnöveli bombák számát
int
getNumOfBombs
Visszaadja a lerakható bombák számát
void
setNumOfBombs(int)
Beállítja, hogy menyni bombát rakhatunk le aza dott Indiánnal
String
getName
Az adott Indián nevét adja vissza
a
felhasználható
Bomb Alaposztály mike_lefeautt (22.)
FieldItem 23 / 141
2009.05.14.
Explodeable Példányok száma
[0..N]
Konkurencia
Aktív
Perzisztencia
dinamikus
Komponensek Field
f
Relációk
nincs
Változók Timer
timer
boolean
isActivated
Szolgáltatások void
explode()
Robban a bomba.
void
startTicking()
A bomba lehelyezésekor beindul egy visszaszámláló mechanizmus, 2 másodperc után robbanás.
boolean
catchMoveRequest(int,FieldItem) Hamisat ad vissza, amikor Dead vagy Alive objektum a bomba mezejére kíván lépni, ezáltal sikertelen lesz az ilyenfajta mozgáspróbálkozás.
void
Beállítja azon mező adottságait, melyre a Bomba került.
setField(Field)
mike_lefeautt (22.)
24 / 141
2009.05.14.
Exit Alaposztály
Wall
Példányok száma
1
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek Field
f
Relációk
nincs
Változók isLocked
Igaz, ha zárva van az Exit objektum, azaz nem tudunk rálépni.
boolean
catchMoveRequest(int,FieldItem)
Igazat ad vissza, ha az Exit típusú mezőre lépés sikeres volt.
void
setField(Field)
Beállítja mezejét.
boolean
Szolgáltatások
az Exit kapu Ez jelenti a
kilépési pontot. boolean
isLocked()
A visszateresi ertek a true-t ad vissza, ha a kapu zarva van, míg false-t, ha nyitva
void
setLock(boolean)
Segítsegevel allíthato kapu statusza
mike_lefeautt (22.)
25 / 141
a
2009.05.14.
Smell Alaposztály
nincs
Példányok száma
[1..N]
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek
nincs
Relációk
nincs
Változók state
Igaz, ha szagos a mező.
boolean
getState()
Visszaadja State értékét.
void
setState(boolean)
Beallíto metodus a ertekenek beallítasara.
void
startSmell()
Ezzel szagosíthatjuk az adott mezőt
boolean Szolgáltatások
szag
Moveable Alaposztály
Nincs
Konkurencia
Passzív
Perzisztencia
dinamikus
Változók
nincs
Szolgáltatások boolean
Igazzal tér vissza, megtörtént a mozgás.
move(int)
ha
Gravitable Alaposztály
Nincs
Példányok száma
0
Konkurencia
Passzív
Perzisztencia
dinamikus
Változók
nincs
Szolgáltatások void
Kő és gyémánt zuhanásakor hívódik meg.
fall()
Explodable Alaposztály
nincs
Példányok száma
0
mike_lefeautt (22.)
26 / 141
2009.05.14.
Konkurencia
Passzív
Perzisztencia
dinamikus
Komponensek
nincs
Relációk
nincs
Változók
nincs
Szolgáltatások void
explode()
Robbantás, melynek hatására mezők üressé válnak, illetve Kefir és Júz Kéz halálát okozhatja.
3.3. Kibővített use-case diagram
mike_lefeautt (22.)
27 / 141
2009.05.14.
mike_lefeautt (22.)
28 / 141
2009.05.14.
3.4. Statikus struktúra diagram
mike_lefeautt (22.)
29 / 141
2009.05.14.
3.5 Szekvencia diagramok
mike_lefeautt (22.)
30 / 141
2009.05.14.
mike_lefeautt (22.)
31 / 141
2009.05.14.
mike_lefeautt (22.)
32 / 141
2009.05.14.
mike_lefeautt (22.)
33 / 141
2009.05.14.
mike_lefeautt (22.)
34 / 141
2009.05.14.
mike_lefeautt (22.)
35 / 141
2009.05.14.
mike_lefeautt (22.)
36 / 141
2009.05.14.
mike_lefeautt (22.)
37 / 141
2009.05.14.
mike_lefeautt (22.)
38 / 141
2009.05.14.
mike_lefeautt (22.)
39 / 141
2009.05.14.
mike_lefeautt (22.)
40 / 141
2009.05.14.
3.6 Állapot diagramok
mike_lefeautt (22.)
41 / 141
2009.05.14.
5. Szkeleton tervezése 5.1. A szkeleton model valóságos use-case-ei 5.1.1. A skeleton valóságos use-case diagramja:
5.1.2. A skeleton valóságos use-case-einek leírása USE CASE ACTOR LEÍRÁS
új játék játékos Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos új játékot kezd.
USE CASE ACTOR LEÍRÁS
pályát lép játékos Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos pályát lép.
USE CASE ACTOR LEÍRÁS
kiássa a földet játékos Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos földet ás.
mike_lefeautt (22.)
42 / 141
2009.05.14.
USE CASE ACTOR
gyémántot gyűjt játékos
LEÍRÁS
Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos gyémántot gyűjt.
USE CASE ACTOR LEÍRÁS
sziklát tol játékos Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos sziklát tol arrébb.
USE CASE ACTOR LEÍRÁS
bombát élesít játékos Ez a use case azt írja le, hogy mi történik akkor, amikor a játékos bombát rak le valahova.
USE CASE ACTOR LEÍRÁS
Kefír öl kefír Ez a use case azt írja le, hogy mi történik akkor, amikor a játékost megöli Kefir.
5.2. Architektúra
mike_lefeautt (22.)
43 / 141
2009.05.14.
Architektúra a Júz Kéz -programhoz (a Use-Case-diagramok alapján)
1.teszteset
Júz kéz bomba melletti mezőn áll.A bomba mezője eredetileg üres mező.
Jelmagyarázat:
fal
Ha lefelé lép a mezőről,nem fog felrobbani,csak a gránit.
Júz Kéz
Ha jelenlegi mezőjén marad,felrobban a gránit is,és ő is.
Föld Kefír Amőba
2.teszteset
Júz Kéz gyémánt melletti mezőn áll.
Gyémánt
Ha a gyémánt mezejére(balra) kíván lépni,akkor felszedi azt.
Szag
Jobbra nem tud lépni,hiszen ott gránit van,melyet nem tud elmozgatni.
Bomba
Utolsó lehetőségként még lefelé is tud lépni,a föld típusú mezőre.
gránit szikla üres exit
mike_lefeautt (22.)
44 / 141
2009.05.14.
3.teszteset
Júz Kéz két szikla közötti mezőn áll.A baloldali sziklától balra üres
Jelmagyarázat:
fal
mező van.Erre a mezőre sikeres lesz a szikla mozgatása.
Júz Kéz
A jobboldali sziklától jobbra fal van.Ebben az esetben sikertelen
Föld
lesz a szikla mozgatása.
Kefír Amőba
4.teszteset
Gyémánt Júz Kéz mezőről mezőre jár,és azokat szagosítja.
Szag
Kefír szagosított mező mellett áll.
Bomba
Ez a teszteset annak megvizsgálására szolgál,
gránit
hogy Kefír szag alapján képes-e megtalálni az
szikla
előle menekülő Júz Kézt.
üres
Kefír üldöző folyamata során előnyben részesíti
exit
a jobbra és felfelé lépést,balra és lefelé végszükség esetén lép,azaz ha nem találta meg Júz Kézt.
mike_lefeautt (22.)
45 / 141
2009.05.14.
Jelmagyarázat:
5.teszteset
fal
Ebben a tesztesetben a gyémánt zuhanását vizsgáljuk.
Júz Kéz
A gyémántnak addig kell zuhanni lefelé-az üres mezőkön áthaladva-,
Föld
amíg alatta föld típusú mező nem lesz.
Kefír Amőba Gyémánt Szag
6.teszteset
Bomba Ebben a tesztesetben a szikla zuhanását vizsgáljuk.
gránit
A gyémántnak addig kell zuhanni lefelé-az üres mezőkön áthaladva-,
szikla
amíg alatta föld típusú mező nem lesz.
üres
Tehát ez a teszteset hasonlóan fog viselkedni,mint az 5. teszteset.
exit
mike_lefeautt (22.)
46 / 141
2009.05.14.
Jelmagyarázat:
7.teszteset
fal
Ebben a tesztesetben a gyémánt gördülését vizsgáljuk.
Júz Kéz
A gyémántnak addig kell zuhanni lefelé-az üres mezőkön áthaladva-,
Föld
amíg alatta föld típusú mező nem lesz..Azonban ha mellette is üres
Kefír
mező(k) van/-nak,akkor gördülnie kell,balra lefelé,vagy jobbra lefelé.
Amőba
Ha mindkét mező üres mellette,akkor jobbra fog gördülni.
Gyémánt Szag
8.teszteset
Bomba Júz Kéz Exit kapu melletti mezőn áll.Ha rálép az Exit mezőre,Júz Kéz
gránit
ikonja eltűnik,s helyén üres mező lesz.A játékban új pálya következik.
szikla üres
9.teszteset
exit Kefír bomba melletti mezőn áll.A bomba mezője eredetileg üres mező. Ha lefelé lép a mezőről ,nem fog felrobbani. Jelenlegi mezőjén maradva azonban meghal.
mike_lefeautt (22.)
47 / 141
2009.05.14.
Jelmagyarázat:
10.teszteset
fal
Ebben a tesztesetben azt vizsgáljuk,hogy ha a Kefírre szikla zuhan,akkor a
Júz Kéz
Kefír elpusztul,és a mezőjén Kefír ikonja helyett a Gyémánté fog megjelenni,
Föld
melyet Júz Kéz fel tud szedni.A szikla is eltűnik a pályáról.
Kefír Amőba Gyémánt
11.teszteset
Szag Az amőba mozgását vizsgáljuk.Szaporodni képes,ez azt jelenti,hogy
Bomba
a föld és az üres típusú mezők helyén meg fog jelenni,a pálya többi
gránit
elemét(Júz Kéz,gránit,szikla,stb.) körbekeríti.Prioritás szerint mozgása
szikla
ezt a sorrendet követi : jobbra-fel-balra-le.
üres exit
mike_lefeautt (22.)
48 / 141
2009.05.14.
Jelmagyarázat:
12.teszteset
fal
Júz Kéz az utolsó gyémánt melletti mezőn áll.Ha felveszi azt,megjelenik
Júz Kéz
az Exit kapu,mely egy fal típusú mező átváltozásával jön létre.
Föld Kefír
13.teszteset
Amőba Ebben a tesztesetben azt vizsgáljuk,hogy ha Júz Kézre szikla zuhan,akkor
Gyémánt
Júz Kéz elpusztul, mezőjére üres mező kerül, a szikla is eltűnik a pályáról.
Szag
Ezen események lezajlása után a pálya előlről kezdődik,újra fel kell építeni.
Bomba gránit szikla
13.teszteset
üres Ebben a tesztesetben azt vizsgáljuk,hogy ha Júz Kézre gyémánt zuhan,akkor
exit
Júz Kéz elpusztul, mezőjére üres mező kerül, a gyémánt is eltűnik a pályáról. Ezen események lezajlása után a pálya előlről kezdődik,újra fel kell építeni.
mike_lefeautt (22.)
49 / 141
2009.05.14.
Jelmagyarázat:
14.teszteset
fal
Ebben a tesztesetben azt vizsgáljuk,hogy ha Kefírre gyémánt zuhan,akkor
Júz Kéz
Kefír elpusztul, mezőjére üres mező kerül, a gyémánt is eltűnik a pályáról.
Föld
Ezen események lezajlása után a következő szintre ugrunk.Ez egy feature.
Kefír Amőba Gyémánt Szag
15.teszteset
Bomba Ebben a tesztesetben azt az eseményt vizsgáljuk,amikor az Amőba
gránit
"körbenőtte" Júz Kézt,azaz a játék főhőse ilyenkor egyik -mellete lévő-
szikla
mezőre sem képes rálépni,a játékban pedig lejár az idő.Újraindul a pálya.
üres exit
mike_lefeautt (22.)
50 / 141
2009.05.14.
Jelmagyarázat:
16.teszteset
fal
Ebben a tesztesetben azt az eseményt vizsgáljuk,amikor Kefírt föld típusú
Júz Kéz
mezők veszik körül,ekkor nem képes a mellette lévő mezőkre lépni.
Föld Kefír Amőba Gyémánt Szag Bomba gránit szikla üres exit
mike_lefeautt (22.)
51 / 141
2009.05.14.
5.3. A szkeleton kezelői felületének terve, dialógusok Programunk szkeletonja azzal a céllal kerül megírásra, hogy ellenőrizni tudjuk az analízis modellben meghatározott folyamatok helyes működését, valamint az egyes osztályok közötti kommunikációt. Emiatt nincs szükségünk még a metódusokban lévő bonyolult algoritmusok kidolgozására/implementálására, helyettük egyszerű kiíró függvényeket használunk. Ezek egyszerű kiíró utasítások (System.out), hiszen egyszerű alkalmazásról van még szó, amely konzolos környezetben fut. Modellünk alapja főként kérés-válasz architektúrán alapszik, így a kommunikáció több szinten fog zajlani. Mivel a tesztelést mi magunk, és teszterek fogják végezni, így a kimenetet formázva írjuk ki (pl. behúzás tabulátorral). Minden metódus kiírja, ha meghívták őt, illetve futásának befejezése előtt is életjelet ad önmagáról, valamint visszatérési értékéről. Kiírásra kerül mind a függvénynév, mind az ő paraméterei. Ha nincs visszatérési értéke, akkor a ’void’ kulcsszót írja visszatérési értéknek. Az egyes objektumok is kiírják magukat, ha létrejönnek, illetve mikor meghívnak egy függvényt. Az utóbbi esetén nemcsak az osztálynév kerül kiírásra, hanem a meghívott függvény neve is, paramétereivel együtt. Egyes esetekben azonban szükség van felhasználói interakcióra. Minden esetre korrekt megfogalmazású kérdést ír ki a program, amelyre választ vár. A kérdés kiírása után „jelmagyarázat” is kiírásra kerül, amely arra hivatott, hogy a teszter lássa, milyen válaszlehetőségek közül választhat. Ezután egyszerű beolvasást alkalmazunk a konzolról, amelynek eredményét felhasználjuk a program további futására. Egy kérdés lehet eldöntendő, melyre a válasz igen-nem (i-n karakterek beolvasása), valamit választó. Ebben az esetben például a felhasználónak négy irány közül kell választania (0,1,2,3), hogy JúzKéz merre haladjon tovább. A kiírások szövege magyar.
mike_lefeautt (22.)
52 / 141
2009.05.14.
5.4. Szekvencia diagramok a belső működésre Init szekvencia diagram, új játék indítása use casehez
Szekvencia diagram a pályát lép use casehez
mike_lefeautt (22.)
53 / 141
2009.05.14.
Szekvencia diagram a kiássa a földet use casehez
mike_lefeautt (22.)
54 / 141
2009.05.14.
Szekvencia diagram a gyémántot gyűjt use casehez
Szekvencia diagram a sziklát tol use casehez
mike_lefeautt (22.)
55 / 141
2009.05.14.
Szekvencia diagram a bombát élesít use casehez
Szekvencia diagram a Kefir öl use casehez
mike_lefeautt (22.)
56 / 141
2009.05.14.
6. Skeleton beadása Kiegészítés: Módosítások a Skeleton Tervhez képest: A Skeleton a 17 pályával ábrázolt teszteset helyett csak a 10 db, szekvencia-diagrammal illusztrált tesztesetet valósítja meg. A User Interface leírásához képest annyi a változtatás, hogy nem a felhasználó adja meg az adott mozgási irányt, hanem azt mi –azaz a készítők – implementáltuk a kódba, hogy tényleg az az esemény valósuljon meg, amit a tesztelésnél elvárunk.
2.teszteset
Júz Kéz kefír melletti mezőn áll. Itt csak kefír léphet –egyetlen irányban, jobbra-, amivel megöli Júz Kézt. A felhasználótól irányt nem kérünk be.
6.1. A skeleton fordítása és futtatása 6.1.1. Indítás a batch file-al 1. A mellékelt zip file-t ki kell csomagolni egy könyvtárba. 2. A játékot a start.bat file-al fordíthatjuk és indíthatjuk egyúttal. 3. A JavaDoc dokumentációt a doc.bat segítségével tekinthetjük meg, amely elindítja a javadoc mappa index.html lapját, a JavaDoc kezdőoldalát, így rendelkezésünkre áll egy jól használható objektumkatalógus. Az itt szereplő leírások a forráskódban is megtalálhatóak kommentek formájában.
6.1.2. Indítás DOS parancssorból 1. A mellékelt zip file-t ki kell csomagolni egy könyvtárba. 2. A parancssorban el kell navigálni a .java fileok könyvtárához. 3. javac *.java 4. java Game paranccsal a játék elindítható
mike_lefeautt (22.)
57 / 141
2009.05.14.
6.1.3. A mellékelt zip állomány tartalma: Az egyes file-ok a file nevének megfelelő osztályok implementációját tartalmazzák. A gyökér tartalma: 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.19. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.18. 2009.03.19. 2009.03.18. 2009.03.19. 2009.03.18.
12:12 10:59 12:12 11:00 10:39 09:32 11:23 11:23 11:23 11:23 11:23 11:23 09:32 11:23 11:27 11:23 11:23 09:30 11:23 11:23 11:23 11:23 11:23 09:33 11:23 09:32 09:33 09:30 03:02 22:22 22:35 22:20 22:19 02:31 22:16 22:15 22:34 22:33 22:30 22:30 10:47 22:27 10:51 22:25
mike_lefeautt (22.)
33 34 427 493 17˙721 1˙769 3˙092 4˙218 2˙266 250 1˙030 3˙692 783 6˙216 159 2˙157 427 1˙634 1˙605 2˙122 430 2˙205 809 976 537 32 22 46 40 40 76 28 25 39 39 29 29 29 25 1˙378 39
.. javadoc . doc.bat start.bat Moveable.java Monster.java Level.java Land.java Kefir.java JuzKez.java Rock.java Gravitable.java Smell.java Game.java FieldItem.java Field.java Explodeable.java Exit.java Alive.java Amoeba.java Blank.java Bomb.java Dead.java Diamond.java Granite.java Direction.java Wall.java 9.txt 8.txt 7.txt 6.txt 5.txt 4.txt 3.txt 2.txt 17.txt 16.txt 15.txt 14.txt 13.txt 12.txt output.txt 11.txt
58 / 141
2009.05.14.
2009.03.18. 2009.03.18.
22:25 22:16 43 fájl
29 10.txt 32 1.txt 57˙062 bájt
\javadoc tartalma: 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19.
10:59 10:59 10:57 10:59 10:59 10:59 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 36 fájl
.. resources 2 package-list index-files class-use . 1˙420 stylesheet.css 14˙594 Bomb.html 13˙321 Blank.html 6˙961 constant-values.html 11˙661 Dead.html 5˙103 deprecated-list.html 14˙309 Diamond.html 12˙696 Direction.html 14˙048 Exit.html 7˙807 Explodeable.html 17˙300 Field.html 12˙917 FieldItem.html 8˙137 Game.html 13˙120 Granite.html 13˙414 Amoeba.html 9˙535 help-doc.html 2˙409 allclasses-noframe.html 1˙346 index.html 16˙469 JuzKez.html 15˙961 Kefir.html 13˙247 Land.html 14˙658 Level.html 12˙312 Monster.html 7˙955 Moveable.html 8˙208 overview-tree.html 3˙174 package-frame.html 2˙869 allclasses-frame.html 10˙710 package-summary.html 8˙219 package-tree.html 5˙766 package-use.html 11˙360 Alive.html 15˙010 Rock.html 10˙649 Smell.html 7˙688 Gravitable.html 12˙142 Wall.html 356˙497 bájt
\javadoc\class-use tartalma: 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19.
10:59 10:59 10:57 10:57
mike_lefeautt (22.)
.. . 7˙585 Alive.html 5˙349 Amoeba.html
59 / 141
2009.05.14.
2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19.
10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 23 fájl
5˙339 Blank.html 6˙490 Bomb.html 9˙201 Dead.html 5˙359 Diamond.html 5˙379 Direction.html 6˙386 Exit.html 8˙094 Explodeable.html 8˙419 Field.html 21˙765 FieldItem.html 6˙507 Game.html 5˙359 Granite.html 6˙990 Gravitable.html 5˙349 JuzKez.html 5˙339 Kefir.html 5˙329 Land.html 5˙339 Level.html 5˙359 Monster.html 7˙343 Moveable.html 5˙329 Rock.html 6˙492 Smell.html 6˙449 Wall.html 160˙550 bájt
\javadoc\index-files tartalma: 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19. 2009.03.19.
10:59 10:59 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 10:57 19 fájl
.. . 7˙075 index-1.html 6˙731 index-10.html 7˙445 index-11.html 8˙009 index-12.html 6˙534 index-13.html 6˙585 index-14.html 7˙839 index-15.html 8˙861 index-16.html 7˙209 index-17.html 6˙526 index-18.html 6˙596 index-19.html 7˙190 index-2.html 9˙899 index-3.html 7˙958 index-4.html 8˙362 index-5.html 11˙339 index-6.html 8˙005 index-7.html 6˙911 index-8.html 6˙825 index-9.html 145˙899 bájt
C:\src\javadoc\resources tartalma: 2009.03.19. 2009.03.19. 2009.03.19.
10:59 10:59 10:57 1 fájl
.. . 57 inherit.gif 57 bájt
A Game.java a skeleton főosztálya, ez vezérli a tesztelést. mike_lefeautt (22.)
60 / 141
2009.05.14.
6.1.4 A skeleton használata: Miután a fent leírt módon elindítottuk a játékot, a következő kimenetet kell látnunk:
Ekkor az adott tesztesethez tartozó szám + Enter leütéssel indíthatunk tesztet. Minden egyes tesztet az inicializálással kezdünk, így ez nem kapott külön menüpontot, bármelyik teszteset kapcsán ellenőrizhető. Az inicializálás egy *** BUILD LEVEL *** sorral kezdődik, majd egy üres sor zárja. Inicializálás példa:
mike_lefeautt (22.)
61 / 141
2009.05.14.
A következő ábrán látható egy pálya felépítési folyamat vége, majd üres sor után következik Júz Kéz jobbra mozgásának folyamata, végül miután a mozgatás lezajlott újra megjelenítjük a menüt, így a program újraindítása nélkül lehet több tesztesetet végigfuttatni:
6.1.5 Pálya felépítése (levezetés egy konkrét példán keresztül) A pályákat txt kiterjesztéső fájlokban adjuk meg és a tesztesetek száma szerint számozzuk őket. (1-es eset: 1.txt és így tovább) /* A .txt első sora adja meg ,hogy a pálya hány sorból áll.*/ /* A 2. sorban megadjuk, hogy a pálya hány oszlopból áll.*/ /* Ezek után feltöltjük a pályát FieldItemekkel, melynek */ /* darabszáma „sor*oszlop” ,jelen esetben 4*5=20 lesz. */ /*Egy betű egy rekeszt jelöl. Pl. ezen a pályán látható, hogy */ /*1 db bomba (B),1 db gránit,3 db föld(l),1 db Júz Kéz található*/ /*A pálya maradék része pedig fal(w).
4 5 wwwww wjBgw wlllw wwwww
Ismertetjük a FieldItemek jelölésrendszerét! w j l B k
fal Júz Kéz föld bomba Kefír
g r n e
mike_lefeautt (22.)
gránit szikla üres exit
a d s a
Amőba Gyémánt Szag Amőba
62 / 141
2009.05.14.
6.2 Értékelés Úgy látom, a csapatunk jól teljesített mind a munkamegosztás, mind a munka minőségét illetően. Szerencsére a kiosztott feladatokat az egyének maguk kérték, így az ebből fakadó konfliktusokat szerencsésen elkerültük. A tempóval eddig nem volt gond, pár tényezőt leszámítva, de azok is külső hatások voltak, de szerencsére nem akadályozták nagymértékben a projekt előre haladását. A kommunikációt picit gyengébbnek láttam az elmúlt 2 hétben, amit most még a felmerülő zárthelyiknek és azok nyomásának tudok be. Remélhetőleg ez a helyzet nem fog romlani. Bár többször olvassuk át a szövegeket, mégis marad bennük néhány elírás, valótlanság, így remélem sikerül ezen afférokat a további mérföldköveknél eltüntetni. Szerencsére a tervezés eddigi szakasza viszonylag gördülékenyen ment, eddig nem találkoztunk nagy változtatást igénylő problémával, ami szerintem a jó és alapos munkánknak köszönhető. Mindenki azonos mértékben vette ki a munkából a részét! Igaz ez időbeli eloszlásnál jelent meg, egyes beadásoknál még eltértek ezek a számok. A szkeleton beadására viszont szerencsére kiegyenlítődött a helyzet.
mike_lefeautt (22.)
63 / 141
2009.05.14.
7. Prototípus koncepciója 7.0. Változtatások a követelmények módosulása miatt Elsődleges változtatások a programban, amelyet a tanszéktől kaptunk: 1. A játék területe méhkas módjára hatszögekből épül fel. A mozgás során a mozgó elemek egyik hatszögből a másikba lépnek át. 2. A játékban két indián: Júz Kéz és testvére, Júz Láb vesz részt. Egymáson nem tudnak átmenni, egymásban nem okoznak kárt. A barlang kijárata akkor nyílik meg, ha az összes felvehető gyémánt fel lett véve. Tehát a 2 indián kooperációjára kell törekedni. Ezen elsődleges változtatások azonban egyes modellbeli változtatásokat is megkövetelnek! Ezek a következők: 1. A pályát leíró fájl formátumát teljesen megváltoztatjuk, amelyet a 7.1.1 pontban részletesen kifejtünk. 2. Az egyes Field-eknek, már nem 4, hanem 6 szomszédjuk lesz. 3. A 2. pontbeli változás magával vonja, hogy megszűnik a sima jobb-bal irány, helyette lesznek balra-fel, balra-le, jobbra-fel, jobbra-le irányok. Minden irányhoz a billentyűzeten külön gombot rendelünk. 4. A gördülés menete annyiban módosul, hogy először balra-le irányba próbál meg gördülni, utána pedig jobbra-le. 5. Azt, hogy a Kefir és az Amőba a terjeszkedése során milyen sorrendben próbálja végig az egyes irányokat, a 7.1.3 pontban lévő ábrán látható. 6. Júz Láb létrehozása annyiban módosítja a programot, hogy az ő irányítására külön bemeneti parancsokat hoztunk létre. Tulajdonképpen Júz Láb behozása a programba nem jár komoly strukturális változtatásokkal köszönhetően a megfelelő tervezésnek. 7. Pályalépés: már akkor bekövetkezik, ha Júz Kéz és Júz Láb közül az egyik rálép az Exit-re. 8. Ha Júz Kéz és Júz Láb közül valamelyik meghal, akkor az adott pálya elbukottnak tekintendő. 9. A Bomb robbanása a hatszöges kialakítás miatt 6 irányban pusztít (1 hatszög sugarú hatótávolsággal).
mike_lefeautt (22.)
64 / 141
2009.05.14.
7.1. Prototípus interface definíció 7.1.1. Pálya leíró fileformátum /* multi line comment */ // one line comment
A sorok és oszlopok számozása 0-tól kezdődik. Páros sorok esetén a páros oszlopokba kerülnek az adatok, páratlan sorokban pedig kitöltő karakterek (#) lesznek, amelyekkel megakadályozzuk, hogy az egy sorban lévő egymás mellett álló elemek között kapcsolat alakuljon ki. Páratlan sorok esetén a páros oszlopokba kerülnek a kitöltő karakterek, páratlan oszlopokba pedig az adatok. Tehát akkor egy példa arra, hogyan tároljuk a fájlokban az egyes pályákat: <sorok száma> 0
1
2
3
4
5
0
w
#
w
#
w
#
1
#
b
#
g
#
b
2
w
#
j
#
b
#
3
#
r
#
B
#
l
4
w
#
l
#
d
#
5
#
l
#
d
#
l
//csak mankó, a fájlban nem szerepelnek!!
Egy szemléletes példa arra, hogyan gondoltuk a tárolást:
mike_lefeautt (22.)
65 / 141
2009.05.14.
Egy (x,y) koordinátákkal rendelkező mező szomszédjai akkor az alábbiak lesznek:
Bal-felső: (x-1,y-1)
Bal-alsó: (x-1,y+1)
Jobb-felső: (x+1,y-1)
Jobb-alsó: (x+1,y+1)
Felső: (x,y-2)
Alsó: (x,y+2)
7.1.2. Proto bemenet fileformátum /* multi line comment */ // one line comment
StartGame
// Új játék indítása
jk_move
// Júz Kéz mozgatása a megadott irányba
jl_move
// Júz Láb mozgatása a megadott irányba
jk_nop
// az adott ütemre Júz Kéz nem lép semmit
jl_nop
// az adott ütemre Júz Láb nem lép semmit
jk_bomb_plant
// Júz Kéz bombát helyez le
jl_bomb_plant
// Júz Láb bombát helyez le
mike_lefeautt (22.)
66 / 141
2009.05.14.
jk_looking //beállítja, hogy merre nézzen Júz Kéz jl_looking //beállítja, hogy merre nézzen Júz Láb restartLevel
// Adott pálya újrakezdése
exit
// kilépés a programból
7.1.3. Proto kimenet fileformátum /* multi line comment */ // one line comment
/* A program futása során folyamatosan keletkeznek eventek, ezek a következők lehetnek: */
/** a bemenet feldolgozásának eseményei: */ Error Map_File_Not_Found
//nem tudjuk megnyitni a pályát tart. fájlt
Error Syntax error:
//az adott parancs szintaktikai hibás
/** a játék eseményei: */ Event StartGame
// a játék elkezdése
Event ExitGame
// kilépés a játékból
Event NextLevel // szintlépés Event Load
// file betöltése
// a felszedendő gyémántok száma 1-el csökkent Event DiamondOnMap-1 remaining: Event MoveRequest
// mozgás kérése az adott irányba
Event MoveSuccess
//az actor mozgása sikeres volt
Event MoveFail
//az actor mozgása sikertelen volt
/* Amikor Júz Kéz vagy J. Láb adott irányba szeretne haladni, akkor kiírjuk, hogy mit találunk abban az irányban */ Event was found in direction Event KefirKilled
//Kefir megölte valamelyik főhőst
Event KefirMoved //Kefir adott irányba mozgott Event AmoebaMultiplied
//Amőba terjeszkedett
Event Fall
//szikla vagy gyémánt zuhanik
mike_lefeautt (22.)
67 / 141
2009.05.14.
Event Exploded
//adott mezőelem felrobbant
Event LookingDirectionChanged //vmelyik indiánt elforgattuk
/* ha gyémánt esik Kefirre, akkor kis csalással azonnali pályaugrás következik be
*/
Event CheatLevelStep(„feature”) Event TimeOut
//lejárt a rendelkezésre álló 60 másodperc
Event ExitAppeared
//elég gyémántunk van a kijárat láthatóvá vált
/* Ez az esemény következik be, ha gyémánt vagy szikla gördül le valamilyen irányba */ Event rolled down in direction
A paraméterek magyarázata:
: a szintaktikailag hibás parancs : a pálya sorszáma, amelyre lépünk : a file neve, amelyet nem tudott betölteni a prog. Pl: 1.txt : irány, számmal kifejezve (0..5); megfeleltetése alább látható : „JúzKéz” vagy „JúzLáb” lehet : a még összegyűjtendő gyémántok száma : egy mezőelem, pl.: Rock, Land, Kefir, stb…
Az irányok megfeleltetése számoknak:
7.2 Összes részletes use-case 1. Júz Kéz ás párat, majd falba ütközik, ekkor megfordul, tovább ás más irányba, majd felvesz egy gyémántot.
mike_lefeautt (22.)
68 / 141
2009.05.14.
2. Júz Kéz ás párat, majd gránitba ütközik, lerak egy bombát, arrébb áll, felrobbantja a gránitot, majd tovább halad 3. Júz Kéz ás párat, majd sziklába ütközik, melyet letol egy szakadékba, a szikla leesik, és ráesik egy gyémántra 4. Júz Kéz ás párat, majd sziklába ütközik, melyet nem tud tovább tolni, mert nincs mögötte kiásva a terület 5. Júz Kéz ás párat, majd sziklába ütközik, melyet megtol, ezáltal legördül egy szikla mely az eltolt felett volt 6. Júz Kéz egy sziklát tol, mely legördül egy verembe, ahol ráesik Kefírre 7. Júz Kéz egy olyan földet ás ki, ami egy tartó volt, először tart a fejével ám utána elmozdul és így a tartott 3 szikla leesik és ráesik Júz Kézre 8. Júz Kéz bombát rak le, gránitot akar robbantani a fal mellett, de felrobban ő is a gránittal együtt, mert nekimegy a falnak 9. Júz Kéz ás párat, ám kiás egy olyan földet, ami egy gyémántot tart, az leesik egy verembe, egy sziklára, ahonnan még legördül 10. Júz Kézt üldözi Kefír, ám Júz Kéz bombát rak le, Kefír pedig felrobban 11. Amőba terjeszkedik, ráesik egy szikla, nem történik semmi, ám utána Júz Kézt körbezárja Amőba 12. Amőba terjeszkedik, bomba robban mellette, nem történik semmi, ám Júz Kéz pályát tud lépni sikeresen 13. Júz Kézt üldözi Kefír, ám Kefírre gyémánt esik, mert Júz Kéz olyan földet ásott ki, így jön a cseles pályaugrás 14. Júz Kézt üldözi Kefír, ám Júz Kéz felszedi az utolsó gyémántot majd az üldözés közben eléri a kijáratot 15. Kefír üldözi Júz Kézt, ám ráesik egy szikla Kefírre aki így gyémánttá változik 16. Kefír üldözi Júz Kézt, akit utolér így Júz Kéz meghal 17. Kefír üldözi Júz Kézt, ám mielőtt Júz Kéz elérné a kijáratot lejár az idő és meghal
7.3. Tesztelési terv A program a standard inputon várja a parancsokat, a kimenet pedig a standard output lesz. Teszteléshez ezeket átirányítjuk fájlokra. A be- és kimeneti parancsformátumok úgy lettek meghatározva, hogy azok teljes mértékben elősegítsék a tesztelést. Ez a teljes program tesztelését, és a funkciók külön-külön való vizsgálatát is magában foglalja. A bemeneten egyszerűen, szövegesen lehet megadni a tesztelési forgatókönyvet. A program helyes működését a kimeneten lehet majd nyomon követni és ellenőrizni.
mike_lefeautt (22.)
69 / 141
2009.05.14.
7.3.1. A bemeneten előforduló hibák kezelése Egyszerű szintaktikai hiba: ezt a hibát nem lehet figyelmen kívül hagyni. A program futása egy hibaüzenettel leáll. Hibás állománynév: ez is végzetes hiba. A program hibaüzenettel leáll.
7.3.2. A tesztelés menete A program különböző funkcióinak tesztelésére létrehozunk tesztforgatókönyveket. Ezeket lefuttatjuk, majd elemezzük, hogy a kimeneten kapott eredmények megfelelnek-e a bemenet alapján vártaknak. A teszteket többször kell elvégezni, hiszen a programnak ugyanolyan bemenetekre ugyanúgy kell reagálnia. Fontos szempont az is, hogy több környezetben és különböző gépeken is tesztelésre kerüljön a program. Java alatti fejlesztésről lévén szó, a platformfüggetlenség megtartása nem nehéz feladat, de mivel sokfajta modul található a nyelv alatt, mégis ésszerű lehet a sokfajta környezetben folyó futtatási teszt - bár átfogó tesztelést elég csupán egy gépen folytatni -, hiszen így ráakadhatunk olyan apróbb környezeti hibákra, melyeket specifikálva a felhasználót már nem érheti meglepetés.
7.3.3. A szükséges tesztforgatókönyvek 1. Júz Kéz ás párat, majd falba ütközik, ekkor megfordul, tovább ás más irányba, majd felvesz egy gyémántot. 2. Júz Kéz ás párat, majd gránitba ütközik, lerak egy bombát, arrébb áll, felrobbantja a gránitot, majd tovább halad 3. Júz Kéz ás párat, majd sziklába ütközik, melyet letol egy szakadékba, a szikla leesik, és ráesik egy gyémántra 4. Júz Kéz ás párat, majd sziklába ütközik, melyet nem tud tovább tolni, mert nincs mögötte kiásva a terület 5. Júz Kéz ás párat, majd sziklába ütközik, melyet megtol, ezáltal legördül egy szikla mely az eltolt felett volt 6. Júz Kéz egy sziklát tol, mely legördül egy verembe, ahol ráesik Kefírre 7. Júz Kéz egy olyan földet ás ki, ami egy tartó volt, először tart a fejével ám utána elmozdul és így a tartott 3 szikla leesik és ráesik Júz Kézre 8. Júz Kéz bombát rak le, gránitot akar robbantani a fal mellett, de felrobban ő is a gránittal együtt, mert nekimegy a falnak 9. Júz Kéz ás párat, ám kiás egy olyan földet, ami egy gyémántot tart, az leesik egy verembe, egy sziklára, ahonnan még legördül 10. Júz Kézt üldözi Kefír, ám Júz Kéz bombát rak le, Kefír pedig felrobban
mike_lefeautt (22.)
70 / 141
2009.05.14.
11. Amőba terjeszkedik, ráesik egy szikla, nem történik semmi, ám utána Júz Kézt körbezárja Amőba 12. Amőba terjeszkedik, bomba robban mellette, nem történik semmi, ám Júz Kéz pályát tud lépni sikeresen 13. Júz Kézt üldözi Kefír, ám Kefírre gyémánt esik, mert Júz Kéz olyan földet ásott ki, így jön a cseles pályaugrás 14. Júz Kézt üldözi Kefír, ám Júz Kéz felszedi az utolsó gyémántot majd az üldözés közben eléri a kijáratot 15. Kefír üldözi Júz Kézt, ám ráesik egy szikla Kefírre aki így gyémánttá változik 16. Kefír üldözi Júz Kézt, akit utolér így Júz Kéz meghal 17. Kefír üldözi Júz Kézt, ám mielőtt Júz Kéz elérné a kijáratot lejár az idő és meghal
7.4 Tesztelést támogató segéd- és fordító programok specifikálása A kimenet helyességének ellenőrzéséhez egy egyszerű Java programot fogunk használni, amely soronként összehasonlít két állományt. Ennek az az értelme, hogy az egyik fájl lesz a proto kimenete, a másik pedig az általunk megadott bemenetre várt kimenet. Ha a 2 fájl sorról-sorra megegyezik, akkor az ellenőrző program egy OK-t ír ki a konzolra, egyébként pedig 2 sort: azokat, amelyek a proto kimenetben, és a várt kimenetben az első egymástól eltérő sorok.
mike_lefeautt (22.)
71 / 141
2009.05.14.
8. Részletes tervek 8.0. Változtatások az analízis modellben Az Alive és Dead ősosztályokat töröltük az osztályhierarchiából, mivel kiderült róluk, hogy tényleges funkciókkal nem tudjuk ellátni őket. Tehát ezentúl a különböző mezőelemek mind a FieldItem osztályból fognak közvetlenül származni. Másik változtatás, hogy a bomba „ketyegése” 2 másodpercet fog kitenni, majd robban.
8.1. Objektumok és metódusok tervei. (State chartok és Activity diagramok) 8.1.1 ActionKeyListener osztály Ez az osztály szolgál arra, hogy elkapja a felhasználói billentyűzet inputot, és továbbítsa azt a CommandProcessor számára feldolgozás végett. ActionKeyListener() Konstruktor. Átvesz paraméterként egy CommandProcessor objektumot, amelyet eltárol. void keyTyped(KeyEvent e) Ha q,w,e,a,s,d,x billentyűt nyomott meg a user, akkor a CommandProcessor setJK függvényét hívja meg, ha pedig u,i,o,j,k,l,m valamelyikét, akkor a setJL függvényét.
8.1.2. Amoeba osztály Ez az osztály reprezentálja az Amőbát, a terjeszkedésre/szaporodásra képes szörnyet, amelynek célja Júz Kéz és Júz Láb beszorítása, gyémántok elől való elzárása. Amoeba() Konstruktor. Minden új Amőba példány létrehozásakor be kell tenni az újat a Level osztályban található kollekcióba szaporítás céljára. A lehetséges irányokat listában tároljuk, és összekeverjük. Ilyen módon véletlenszerű lesz, hogy az amőba merre próbál terjeszkedni. grow() mike_lefeautt (22.)
72 / 141
2009.05.14.
Ez a metódus hívódik meg akkor, mikor az Amőba mozogni akar. Ilyenkor nem csinál mást, mint "klónozza" magat a szomszedos mezők egyikére. boolean catchMoveRequest(int,FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális amőba helyét szeretné megszerezni. Mivel sem robbantás, sem tárgyak ráejtése, sem bányászaink szorgos ásása nem árthat az amőbának, így a metódus külön vizsgálat nélkül false értéket ad vissza.
8.1.3 Blank osztály Ez az osztály reprezentálja az üres mezőelemet, amelyek teljesen átjárhatóak a játék többi szereplője által. Blank() Konstruktor. Az Blank mezők rendelkeznek egy speciális tulajdonsággal: szagosíthatóak. A konstuktor feladata, hogy az új Blank példányhoz példányosítson egy Smell objektumot. initSmell() Meghívásakor szagosítódik az üres mezőnk. Ez segítséget nyújt Kefírnek, hogy szagot foghasson, és becserkészhesse JuzKézt/JúzLábat. JúzKéz/JúzLáb minden mező elhagyásakor meghívódik, így úgymond "frissül" a szag. boolean getSmellState() Getter metódus. Visszaadja, hogy szagos-e a mező. boolean catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális üres mező helyét szeretné megszerezni. Az üres helyre minden típus léphet, így minden esetben konstans igazat adunk vissza. Ez a függvény vizsgálja az adott FieldItemeknél, hogy ki kerülhet vele interakcióba, vagyis ki léphet rá. Ez esetben szinte mindig true értékkel térünk vissza, mivel a Blank mező maga az üres mező, bárki ráléphet, nincs semmilyen megkötés. Azonban Diamond esetén nem tudjuk, hogy gördülünk-e vagy csak esünk. Esés esetén true-val térünk vissza, gördülés esetén viszont ez a mező egy átjáró, egy közvetítő.
mike_lefeautt (22.)
73 / 141
2009.05.14.
8.1.4. Bomb osztály Ez az osztály reprezentálja a robbanószert, amelyet Júz visszaszámlálását elindíthatja, majd adott idő leteltével felrobban.
Kéz/Láb
lehelyezhet,
explode() Az explode() függvény akkor hívódik meg, ha a bomba visszaszámlálása aktiválva lett, majd a visszaszámlálás befejeződött. A bomba detonációjakor megpróbálja megölni mind a hat közvetlen szomszédját. Ha sikerül neki, akkor a megölt/megsemmisített szomszédok helyen egy üres mező marad csak. A felrobbant bomba helyén is üres mező keletkezik! startTicking() Ezzel a metódussal aktiválhatjuk a bomba időzítőjét. Az idő lejárta után innen kerül meghívásra az explode() függvény. boolean catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális bomba helyét szeretné megszerezni. A bomba helyét semmi nem veheti át, így konstans false-t ad visszatérési értéknek.
8.1.5. CommandProcessor osztály Ez az osztály valósítja meg a billentyűzetről érkező gombnyomások parancsokká, utasításokká konvertálását. CommandProcessor(Level, File) Létrehoz egy HashMap-et amely a lehetséges parancsokhoz egész számokat társít. Valamint meghívja az initialize függvényt. void initialize() Megnyitja olvasásra a bemeneti parancsokat tartalmazó fájlt, és egy listát feltölt velük. String getNextCommandFromFile() Egyre növekvő indexszel kivesz egy újabb parancsot a parancsok listájából. void setJk(char key) A Júz Kézhez tartozó gombokhoz parancsokat társítunk.
mike_lefeautt (22.)
74 / 141
2009.05.14.
void setJl(char key) A Júz Kézhez tartozó gombokhoz parancsokat társítunk. boolean execute() Itt hajtjuk végre a várakozási idő alatt betárazott függvényhívásokat. Ez a motorja a játék irányításának.
parancsokhoz
tartozó
void reset() Ha végrehajtottuk a parancsokat és új kör jön, akkor előtte töröljük az előző parancsokat.
8.1.6. Diamond osztály Ez az osztály reprezentálja a Júz Kéz/Láb által összegyűjtendő Gyémánt objektumokat. Fontos, hogy tartalmaz egy flag változót (isFalling), amelyben azt tároljuk, hogy éppen zuhanás közben van-e a gyémánt. Ennek abban lesz szerepe, hogy eldöntsük, hogy ha egy gyémánt van egy Indián felett, akkor megöli-e. Diamond() Konstruktor. Minden új Diamond példány létrehozásakor eggyel növelni kell a Level objektumban számon tartott gyémántok-számát. boolean fall() Ezzel a metódussal idézhetjük elő, hogy a gyémánt zuhanjon egy mezőt lefelé. Ha sikertelen a zuhanás, akkor hamis értéket ad vissza, egyébként igazat. boolean roll() Ezzel a metódussal idézhetjük elő, hogy a gyémánt legördüljön az alatta lévő gyémántról. Ennek végrehajtásához először le kell ellenőriznünk, hogy alattunk valóban gyémánt van. Ha igen, akkor le kell ellenőrizni, hogy valamelyik oldalsó-alsó irányban Blank mező legyen. Ha ez is stimmel, akkor megtörténhet a gördülés egy sendMoveRequest() hívással. boolean catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális üres mező helyét szeretné megszerezni. Ha Júz Kéz/Láb szeretne a gyémánt helyébe lépni, akkor Level-ben csökkentjük a hátralévő gyémántok számát, és true-t adunk vissza.
mike_lefeautt (22.)
75 / 141
2009.05.14.
Ha egy gyémánt, vagy szikla akar a helyére lépni (lefelé iránnyal haladva), akkor felismerjük, hogy ezek le tudnak gördülni a gyémántunkon, és meghívjuk az ő roll() metódusukat. boolean sendMoveRequest(int, FieldItem) Ezzel a metódussal próbálhatjuk mozgatni a gyémántunkat a megadott irányba. Ezt egy saját Fieldünkre kiadott transmitMoveRequest() hívással kezdeményezhetjük. A visszatérési érték ugyanaz lesz, mint a transmitMoveRequest() visszatérési értékével lesz egyenlő. A sendMoveRequest() metódust csak a roll() fv. fogja meghívni. boolean isFalling() Getter metódus. setIsFalling(boolean) Setter metódus.
8.1.7. Direction osztály Segédosztály, amely az irányok egységes kezelését teszi lehetővé. Segítségével beszédes neveket adhatunk az egyes irányoknak, tehát nem kell jelentés nélküli számokat használni erre a célra. Statikus konstans értékeket tartalmaz, pl.: public static final int DOWN = 3;
8.1.8. Exit osztály Ez az osztály egy specializált, kitüntetett szerepű Fal osztály, amely a pályák közti átjárhatóságot teszi lehetővé. Az utolsó megszerzendő gyémánt felvételéig az exitnek zárva kell lennie. Exit() Konstruktor. Beállít egy flaget, hogy a kapu default zárva legyen. boolean isLocked() Getter metódus. Igazat ad vissza, ha a kijárat zárva van, hamisat ad, ha nyitva. setLock(boolean) Setter metódus. A zár flag állapotát állítja be a paraméterben kapott értékre.
mike_lefeautt (22.)
76 / 141
2009.05.14.
boolean catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális üres mező helyét szeretné megszerezni. Csak Júz Kéz/Láb léphet rá a kijáratra, mindenki más számára false értéket ad vissza a függvény. Viszont Júz Kéz/Láb is csak akkor léphet ide, ha összegyűlt a kellő mennyiségű gyémánt, és a kijárat megnyílt, egyúttal a kontroller Levelnek kiadjuk a következő pálya betöltésére szolgáló metódushívást.
8.1.9. Field osztály A Field osztály az építőeleme a játéktérnek. A Field osztályok láncolt lista jelleggel tartják egymással a kapcsolatot, és ezen a hálózaton keresztül utaznak a mozgással kapcsolatos hívások és visszatérések. Field(FieldItem fi) Konstruktor. Beállítja, hogy milyen mezőelem helyezkedik el a mezőn. Field() Paraméter nélküli konstruktor. Üres (Blank) mezőelemet állít rá az új mezőre. Field getNeighbor(int) Getter metódus, amely az adott irányba eső szomszéd referenciáját adja vissza. setNeigbor(int, Field) Setter metódus, amely az adott irányba eső szomszéd referenciáját állítja be. FieldItem getFieldItem() Getter metódus, amely az aktuális mezőn elhelyezkedő FieldItem-et adja vissza. boolean sendMoveRequest(int, FieldItem) Ezzel a metódussal próbálhatjuk mozgatni az aktuális Field-ünkön lévő FieldItemet a megadott irányba. A mozgás kérését átadjuk az paraméter irányba fekvő szomszédnak, annak transmitMoveRequest() fv-ének meghívásával. Ha a transmit sikert jelez egy igaz visszatérési értékkel, akkor a saját FieldItem-ünket Blankre állítjuk egy setEmpty() hívással, valamint, ha egy Indián volt a régi mezőelem, akkor szagosítani is kell mögötte.
mike_lefeautt (22.)
77 / 141
2009.05.14.
boolean transmitMoveRequest(int, FieldItem) Ezzel a metódussal továbbíthatjuk a saját FieldItemünk számára a másik Field felől érkező mozgási kéréseket. Ezt a FieldItem catchMoveRequest() függvényének meghívásával teszi meg a metódus. Tehát ez egyfajta kérelemtovábbító metódus, egy postás. A kérelem továbbítása után megvizsgáljuk a visszakapott eredményt. Ha hamis jelzést kapunk, akkor a FieldItem megtagadta a rá irányuló mozgás végrehajtását, tehát az oda mozogni szándékozó Item helyben marad. Ha viszont true értéket ad vissza a catchMoveRequest (a hozzánk tartozó FieldItem jóváhagyta a rá való mozgást), akkor további teendőink vannak: a paraméter FieldItem objektumnak be kell állítani a Field mezőjét magunkra, valamint saját magunk FieldItem mezőjét a paraméterre. Tehát odavissza. A visszatérési érték egyenlő lesz a beágyazott catchMoveRequest() visszatérési értékével. boolean compareToNeighbor(Class, int) Ezzel a metódussal megtehetjük azt, hogy összevetjük a paraméterben kapott osztálytípusú FieldItem specializáltat a Fieldtől megadott irányban lévő szomszéd FieldItem típusával. Egyezés esetén true, amúgy false értéket ad vissza. setEmpty() A setEmpty() metódus beállítja a Field FieldItemét Blank-re, illetve a visszacsatolást is elvégzi, tehát az új Blank Itemen beállítja a Field-et a hívó Field-re. setFieldItem(FieldItem) A Fieldhez tartozó FieldItem attribútum settere.
8.1.10. FieldItem osztály A FieldItem osztály egy ősosztály, melyből a különböző pályaelemek (Gyémánt, JúzKéz, Fal,…) származnak le. setField(Field) A FieldItemet aggregáló Field settere. catchMoveRequest() Absztrakt metódus, amelyet a leszármaztatott Itemek valósítanak meg.
8.1.11. Game osztály A Game osztály a játékunk belépési pontja. mike_lefeautt (22.)
78 / 141
2009.05.14.
Game(String) Konstruktor. Feladata a paraméterben kapott pályát realizáló Level objektum példányosítása. Itt készítünk Java File objektumot a .map és .txt fájlokból. Ha valamelyik nem nyitható meg/nem létezik, akkor a játék azonnal leáll. main(String[]) A program belépési pontja. Feladata a Game osztály példányosítása, ezáltal a program életre keltése. A paraméterében kapott parancssori paraméterből két dolgot tudunk meg: a bemeneti parancsokat tartalmazó file nevét, illetve az adott tesztesethez tartozó pályát leíró fájl nevét, pl. 1.txt és 1.map. Tehát a parancssorban csak annyit szükséges megadni, hogy java Game 1 startLevel(int) A megadott számú pályát betöltő függvény. startNextLevel() A sorban következő számú pályát betöltő függvény.
8.1.12. Granite osztály Ez az az osztály, amely a gránit szerepét valósítja meg a játékban. Mozgatni nem lehet, gravitációnak is ellenáll, és csak felrobbantással lehet az útból eltűntetni. catchMoveRequest(int, FieldItem fi) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális gránit helyét szeretné megszerezni. o Egy eset kivételével mindig negatív válasszal térünk vissza, mert szinte semmilyen interakcióra sem képes. o A kivétel ez alól a robbantás. Mivel a robbantás üres FieldItemekkel próbáljuk törölni a szomszédos mezőket, így ha azt érzékeljük, hogy Blank mező akar ránk lépni, akkor neki szabad utat adunk, és pozitív válasszal térünk vissza. explode() Ezt a mezőt hívja meg a catchMoveRequest abban az esetben,ha robbanást érzékel, melynek hatósugarába beletartozik. A gránit és az őt tartalmazó Field közötti kapcsolatot megszünteti, és maga helyére egy Blank típusú mezőt állít be.
mike_lefeautt (22.)
79 / 141
2009.05.14.
8.1.13. Gravitable interfész Ez az interfész arra szolgál, hogy könnyen meghatározhassuk egy objektumról, hogy képes-e az esés műveletére. fall() Az interfészt implementáló osztályoknak meg kell valósítani ezt a függvényt. Ez a függvény végzi el a lefele mozgást.
8.1.14. Indian osztály Ez az osztály valósítja meg azt az objektumot, amelyet a játék során a játékos irányíthat.
Indian() Az osztály konstruktora. A kezdő nézési irányt jobbra lefele állítjuk, bombáinak számát pedig nullára. getActualDirection() Visszaadja, hogy merre néz az aktuális indiánunk. Értéke a Direction osztályban leírtak közül az egyik. setActualDirection() Beállítjuk vele az osztály actualDirection nevű változóját, vagyis hogy az aktuális indiánunk melyik irányba nézzen. explode() Ez a függvény hívódik meg akkor, ha az aktuális indiánunkra kő, gyémánt esik, ha megöli őt Kefír, illetve ha a bomba hatókörében van, mikor az felrobban. move(int) Ha azt akarjuk, hogy az aktuális indiánunk mozogjon, akkor ezt a függvényt kell kiadnunk. Paraméter listájában adjuk meg a kívánt mozgás irányát. Ha a kívánt irányba tud mozogni, akkor meg is teszi, maga mögött pedig szagosított üres mezőt hagy. Ha nem tud a kívánt irányba menni, akkor ottmarad a helyén, mintha mi sem történt volna. placeBomb()
mike_lefeautt (22.)
80 / 141
2009.05.14.
Indiánunk ezzel a függvénnyel tud bombát lehelyezni abba az irányba, amerre néz. Az abba az irányba nem tehetünk bombát, mert nem üres a mező, akkor a felhasználó számára nem történik semmi. removeBomb() Ha sikeresen leraktunk magunk elé egy bombát, ez a függvény hívódik meg, hogy csökkentse a még lerakható bombát számát, amelyet a numOfBombs változó raktároz. catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely az aktuális indián helyét szeretné megszerezni. o Ha Kefír akar rálépni, akkor az azt jelenti, hogy indiánunkat megölte a szörny. Ekkor meghívódik az indián explode() függvénye, amely maga után vonja a pálya újraindítását. A visszatérési érték itt lényegtelen, mert úgy is pálya újraindítás van, így lényegtelen lesz a visszatérés értéke. o Ha szikla akar ráesni, akkor meg kell vizsgálni, hogy esés állapotában van-e a szikla. Ha igen, akkor itt is az explode() függvény hívódik meg, ami maga után vonja a pálya újraindítását. Ez a vizsgálat azért kell, mert az indiánunk meg tudja tartani fejével a sziklát, de csak akkor, ha ő álla ki a szikla alatti területet, vagy ő tolja el a szikla alóli sziklát, vagy szedi fel alóla a gyémántot. A visszatérési érték itt lényegtelen, mert úgy is pálya újraindítás van, így lényegtelen lesz a visszatérés értéke. o Ha gyémánt akar ráesni, akkor tökéletesen ugyan az történik, mint a szikla esetén. o Ha másik indián próbál rá menni, akkor negatív értékkel térünk vissza. o Minden más esetben negatív értékkel térünk vissza, vagyis nem lehet erre a mezőre jönni. addBomb() Ha indiánunk a pályán egy bombát tartalmazó mezőre akar lépni, és az nem élesített, akkor ezt a függvényt hívja meg. Ezzel növeli a lerakható bombáinak számát. getNumOfBombs() Visszaadja az indiánunknál lévő lerakható bombák számát. setNumOfBombs(int) A paraméterben megadott értékre állítja az indiánnál lévő bombák számát.
mike_lefeautt (22.)
81 / 141
2009.05.14.
8.1.15. Kefir osztály Ez az osztály valósítja meg a játékban a mozgó szörnyet, Kefírt, akinek célja a pályán lévő indiánok megölése. Kefir() Az alapértelmezett konstruktorban be kell állítani, hogy még nem szagfogott állapotban van. explode() Ha Kefírre szikla, gyémánt esik, vagy a bomba robbanásakor a robbanás hatósugarában van, akkor ezt a metódust hívjuk meg. getSmell(Smell) A paraméterben kapott „szagmintáról” visszaadja, hogy szagos-e, vagyis járt-e már ott nemrég egy Indian. move(int) Ha azt akarjuk, hogy Kefír mozogjon, akkor ezt a függvényt kell kiadnunk. Paraméter listájában adjuk meg a kívánt mozgás irányát. Ha a kívánt irányba tud mozogni, akkor meg is teszi, maga mögött pedig szagosított üres mezőt hagy. Ha nem tud a kívánt irányba menni, akkor ottmarad a helyén, mintha mi sem történt volna. A mozgás irányát úgy határozza meg, hogy szomszédjai között szagosak után kutat. Ha talál ilyet, akkor az első ilyen találatra megpróbál rálépni. Ha nem sikerül neki, akkor a következő szagosra próbál rálépni. Ha nincs vagy nem tud szagos szomszédra lépni, akkor a Direction osztályban lévő iránymegfeleltetések sorrendje szerinti irányokba próbál meg haladni. A lehetséges irányok így 0-tól 5ig lehetnek. Az első szabad irányba mozog ilyenkor. Ha sehova sem tud mozogni, akkor helyén marad.
setGoodWay(boolean) Ezzel a metódussal mondhatjuk meg Kefírnek, hogy szagot fogott-e. catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely Kefír helyét szeretné megszerezni. o Ha gyémánt akar a helyére menni, akkor helyzettől függetlenül a következő pályára ugrunk. Visszatérési értéke emiatt lényegtelen. o Ha szikla akar a helyére menni, akkor explode() metódusa hívódik meg, és igaz értékkel térünk vissza.
mike_lefeautt (22.)
82 / 141
2009.05.14.
o Ha Blank mező akar a helyére kerülni az azt jelenti, hogy egy közelben lévő bomba robbanásának hatósugarába esett! Ilyenkor is az explode() függvénye hívódik meg, és igaz értékkel térünk vissza. o Minden más esetben negatív értékkel térünk vissza, vagyis nem lehet erre a mezőre jönni.
8.1.16. Land osztály Ez az osztály valósítja meg játékunkban a kiásható földet. explode() Ezt a függvényt hívjuk meg, ha a bomba hatósugarában benne van. Ekkor úgymond kiásódik. catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely föld helyét szeretné megszerezni. o Indian esetén engedélyezzük a műveletet, így igaz értékkel térünk vissza. o Amoeba esetén engedélyezzük a műveletet, így igaz értékkel térünk vissza. o Ha Blank mező akar a helyére lépni, akkor az azt jelnti, hogy egy bomba hatósugarában volt. Így meghívjuk az explode() függvényét. o Minden más esetben negatív értékkel térünk vissza, vagyis nem lehet erre a mezőre jönni.
8.1.17. Moveable interfész Az interfész biztosítja az őt implementáló függvények számára, hogy kívülről meg tudják hívni az ő move(int) függvényüket.
8.1.18. Rock osztály Ez az osztály valósítja meg a játékban a sziklát. fall() Ez a metódusa hívódik meg akkor, ha azt szeretnénk, hogy próbáljon meg lefele esni az aktuális szikla. Ha tud, ha nem, meg hívja roll() függvényét, és megpróbál gördülni is. roll()
mike_lefeautt (22.)
83 / 141
2009.05.14.
A fall() végén ezt a metódust hívjuk meg. Meg kell vizsgálni, hogy az adott szikla alatt szikla, vagy gyémánt van-e. Ha erre a válasz igen, akkor megpróbálunk balra lefele menni. Ha ez nem sikerül, akkor jobbra lefele próbálkozunk. Ha ez sem sikerül, akkor nem csinál semmit. Ellenkező maga a mozgás a kívánt cellára helyezi a sziklát. catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely szikla helyét szeretné megszerezni. o Indian esetén gördülés következik be, melynek menete a következő. Megpróbál a szikla arra mozogni, amerre az Indian mozgott, mikor a sziklába ütközött. Ekkor a move(int) függvényét hívjuk meg. Ha ez a függvény pozitív válasszal tér vissza, akkor maga a gördülés is sikeres, és az a catchMove Request is igazzal tér vissza. Ellenkező esetben nem történik semmi, és negatív válaszzal térünk vissza. o Minden más esetben negatív értékkel térünk vissza, vagyis nem lehet erre a mezőre jönni. move(int) A paraméterként kapott irányba próbál meg haladni. Ha sikerül neki igazzal tér vissza, ellenkező esetben hamissal. isFalling() Igazat ad vissza abban az esetben, ha a szikla előző állapota is zuhanás volt. Hamisat ha sem. setIsFalling(boolean) Ezzel a függvénnyel állíthatjuk be, hogy az esés művelete sikeres volt.
8.1.19. Smell osztály Ez az osztály valósítja meg azt a virtuális szagot, amelyet az Indian típusúak hagynak akkor, ha másik Field-re mennek. Minden Blank típus tartalmaz egyet. Smell() A konstruktorában alapból negatívra állítjuk szagértékét. getState() Visszaadja, hogy van-e szag. Igaz ha szagosított, hamis ha nem szagosított. setState(boolean)
mike_lefeautt (22.)
84 / 141
2009.05.14.
E függvény segítségével állíthatjuk be egy, hogy egy mező szagosságát a paraméterben megadottra.
8.1.20. Wall osztály Ez az osztály valósítja meg a játék során a játékteret körülvevő falat, amely biztosítja, hogy mozgó objektumaink ne tudjanak lelépni róla. catchMoveRequest(int, FieldItem) Ezt a metódust egy másik FieldItem hívhatja meg közvetetten, amely a fal helyét szeretné megszerezni. Minden esetben negatív válasszal tér vissza. Mást nem csinál.
8.1.21. Level osztály Az aktuális pálya inicializálója és egyben kontrollere. Level(File, File) A konstruktor első paramétere a térképet tartalmazó fájl referenciája, míg a második, az ott végrehajtandó parancsokat tartalmazó fájl. Ha nem fájlból olvassuk be a parancsokat, akkor a második paraméter értéke null. A metódus elején beolvassuk a fájl első két sorát, amely tartalmazza, hogy a játékterünk mennyi sorból és mennyi oszlopból áll. Ezután létrehozunk a beolvasott értékek alapján egy karaktermátrixot, amelybe beolvassuk a fájl tartalmát. Miután a térképet tartalmazó fájl beolvasása megtörténik, létrehozunk a korábban beolvasott sor+oszlop értékek alapján egy Field-ekből álló mátrixot. Ezután ezen mátrix minden elemén végigmegyünk, és létrehozzuk a tartalmazott FieldItemjüket. Az új FieldItemek típusát azt határozza meg, hogy milyen karakter áll a karaktermátrix ugyanazon koordinátáján, mint ahol a Field mátrixban vagyunk. A karakter FieldItem típus-meghatározást a chooseFieldItemByCharCode(char) függvény végzi. Miután ezzel is végeztünk, kialakítjuk az egyes Field-ek közötti kapcsolatot, vagyis, hogy kinek kik a szomszédjai. Ezzel a pálya felépítése kész! Az utolsó lépésben még végigmegyünk a pályán, és kigyűjtjük azon elemeket, amelyek valamilyen mozgásra képesek azért, hogy később az egyes parancsokat mindig sorrendhelyesen tudjuk végrehajtani. Utolsó utáni lépésként, pedig a Level osztály run() metódusának meghívásával elindítjuk a már betöltött pálya kontrollerét. chooseFieldItemByCharCode(Character)
mike_lefeautt (22.)
85 / 141
2009.05.14.
A megadott paraméterből megállapítja, hogy milyen típusú FieldItem tartozik hozzá. Ha megfeleltetett típusból létrehoz egy új példányt, és azzal tér vissza. Ezt fogjuk az egyes Field-ek FieldItem-jeiként beállítani. run() Ebben a metódusban kezeljük a játék menetét a pálya betöltése után. Egy végtelen ciklus fog futni, amelyben az elején azt vizsgáljuk, hogy Júz Kéz illetve Júz Láb milyen mozgási parancsokat kaptak akár billentyűzetről, akár fájlból, és ezeket a mozgatásokat elvégezzük. Ezután következik a gyémántok, sziklák, kefirek mozgatása, és amőbáink szaporítása. Ha ezek is megtörténtek, akkor töröljük az utoljára leütött billentyűt, majd beiktatunk egy várakozást (Thread.sleep()), amely időkeret hossza alatt a felhasználónak lehetősége van gombot nyomni az indiánok irányítása végett. Egy másik szálban futó KeyAdapter fogja a billentyűzetről érkező parancsokat egy változóba pakolgatni, tehát ha a várakozás ideje alatt több gombot is nyomunk, akkor is csak az utolsó fog érvényesülni. toString() Segítségével kiírhatjuk, hogy hányadik pályán vagyunk. incrementNumberOfDiamond() A pályán található gyémántok számát növeli meg egyel. Akkor hívjuk meg, ha egy gyémántot létrehozunk. diamondCollected() Akkor hívódik meg ez a függvény, ha egy Indian egy gyémántra lépett. Ezáltal csökkenteni kell a felszedhető gyémántok számát, valamint meg kell vizsgálni, hogy kinyitható-e a kijárat. checkExit() Megvizsgálja, hogy van-e még összegyűjtendő gyémánt a pályán. Ha nincs, akkor a kaput nyitott állapotba helyezi. NextLevel() Ha a következő pályát akarjuk betölteni, ezt a metódust hívjuk meg. Restart() Ha újra kell indítani az adott pályát, akkor ez a metódus hívódik meg.
mike_lefeautt (22.)
86 / 141
2009.05.14.
A tolás aktivitás diagramja
A gördülés aktivitás diagramja
mike_lefeautt (22.)
87 / 141
2009.05.14.
Az Indiánok gyémántfelvételének aktivitás diagramja
Kefir mozgásának aktivitás diagramja
mike_lefeautt (22.)
88 / 141
2009.05.14.
Az esés aktivitás diagramja
mike_lefeautt (22.)
89 / 141
2009.05.14.
Amőba növekedésének aktivitás diagramja
Inicializálás állapotdiagramja
mike_lefeautt (22.)
90 / 141
2009.05.14.
8.2. A tesztek részletes tervei, leírásuk a teszt nyelvén 18. Teszt célja: Júz Kéz ás egyet, majd falba ütközik, ekkor megfordul, tovább ás más irányba, majd felvesz egy gyémántot. Megvalósítás: Júz Kéz a pálya bal széléről indul, majd egyet ás jobbra-lefelé, de másodjára falba ütközik, ekkor ás egyet lefelé, a második lefelé ásással pedig felveszi a gyémántot. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: A gyémántok száma 1-gyel csökken. Lehetséges hibaforrások: A fal nem akadályozza meg a továbbmenetelt, így annak catchMoveRequest metódusában keresendő a hiba. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_move <3> jl_nop jk_move <3> jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* jobbra lefelé ásás helyett lefelé ásás jön, mert falnak ütköztünk. */
/* felvettük a gyémántot */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <1.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Wall> was found in <4> direction Event MoveFail sikertelen volt Event MoveRequest <3> <JuzKez> irányba Event was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event MoveRequest <3> <JuzKez> irányba Event was found in <3> direction
mike_lefeautt (22.)
91 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott
2009.05.14.
Event MoveSuccess <3><JuzKez> volt Event DiamondOnMap-1 remaining: <6> Event ExitGame
//az actor mozgása sikeres // kilépés a játékból
19. Teszt célja: Júz Kéz ás egyet, majd gránitba ütközik, lerak egy bombát, arrébb áll, felrobbantja a gránitot, majd tovább halad Megvalósítás: Júz Kéz a pálya bal széléről indul, jobbra lefelé ás, másodikra gránitba ütközik. Ütközés után visszább lefelé ás kettőt, hogy ne ölje meg a bomba, a felrobbanás után felfelé lép, majd jobbra felfelé, a gránit helyén áll így. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Sikeres robbantás után folytatja Júz Kéz a lépéseit. Lehetséges hibaforrások: Nem robban fel a bomba. A bomba nem tűnteti el a gránitot. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_bomb_plant jk_move <3> jl_nop jk_looking <0> */ jl_nop jk_move <3> jl_nop jk_move <0> jl_nop jk_move <5> jl_nop exit
/* Pálya betöltése */ /* Jobbra-lefelé ásás */ /* Jobbra-lefelé ásás */ /* The Bomb has been planted! */ /* Lefelé ásás */ /* Megfordulunk, hogy lerakjunk előző helyünkre a bombát /* Elmenekülünk robbanás elől */ /* Felrobban a bomba! */ /* Felfelé ásás */ /* Gránit helyén állunk itt */ /* Kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <2.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveFail <4><JuzKez> sikertelen volt
mike_lefeautt (22.)
92 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása
2009.05.14.
Event irányba Event Event volt Event Event Event Event Event irányba Event Event volr
MoveRequest <3> <JuzKez>
// mozgás kérése az adott
was found in <3> direction MoveSuccess <3><JuzKez>
//az actor mozgása sikeres
LookingDirectionChanged <0> <JuzKez> was found in <0> direction TheBombHasBeenPlanted Exploded MoveRequest <0> <JuzKez>
//adott mezőelem felrobbant // mozgás kérése az adott
was found in <3> direction MoveSuccess <0><JuzKez>
//az actor mozgása sikeres
Event irányba Event Event volr Event
MoveRequest <5> <JuzKez>
// mozgás kérése az adott
was found in <3> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
ExitGame
// kilépés a játékból
20. Teszt célja: Júz Kéz ás párat, majd sziklába ütközik, melyet letol egy szakadékba, a szikla leesik, és ráesik egy gyémántra. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé. A második lépésben már sziklát is tolja, szintén jobbra lefele, a szakadék felé. A szikla ráesik a gyémántra, Júz Kéz pedig a szikla helyére kerül. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: A szikla lezuhan. Lehetséges hibaforrások: Júz Kéz nem tudja tolni a sziklát. A szikla nem esik rá a gyémántra. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> gyémántra */ jl_nop exit
/* Pálya betöltése */ /* Lefelé ásás */ /* A második jobbra lefelé ásásnál lezuhan a szikla a /* Kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event irányba Event
StartGame Load <3.txt> MoveRequest <4> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <4> direction
mike_lefeautt (22.)
93 / 141
2009.05.14.
Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> sikertelen volt Event Fall Event ExitGame
mike_lefeautt (22.)
94 / 141
//az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása //szikla zuhan // kilépés a játékból
2009.05.14.
21. Teszt célja: Júz Kéz ás párat, majd sziklába ütközik, melyet nem tud tovább tolni, mert nincs mögötte kiásva a terület Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé. Másodjára már a sziklát is tolná, szintén jobbra lefelé, de nem sikerül neki. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: A szikla nem mozdul el, nem tudjuk eltolni, és a tolási irányban haladni. Lehetséges hibaforrások: Elmozdul a szikla. Ennek az oka az is lehet, hogy ki van mögötte ásva a terület. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> el. */ jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* A második jobbra lefelé ásás sikertelen,nem mozdulunk /* kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <4.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> sikeres volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveFailed <4><JuzKez> sikertelen volt Event ExitGame
mike_lefeautt (22.)
95 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása // mozgás kérése az adott //az actor mozgása // kilépés a játékból
2009.05.14.
22. Teszt célja: Júz Kéz ás párat, majd sziklába ütközik, melyet megtol, ezután visszalép egyet, ezáltal lezuhan egy szikla, mely az előbb még Júz Kéz felett volt. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé, másodikra az alsó sziklát szintén jobbra lefelé tolja tovább. Majd balra felfelé visszalép egyet, ezáltal a felső szikla lezuhan. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Az eltolt feletti szikla lezuhan, Júz Kéz életben marad. Lehetséges hibaforrások: Júz Kéz nem tudja eltolni az alsó sziklát. A felső szikla úgy is lezuhan, ahelyett, hogy JúzKék megtartaná a felyével. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_move <1> jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* 2. jobbra lefelé ásás, Júz Kéz felett szikla van. */ /* balra felfelé lépés, zuhanás bekövetkezik */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event irányba Event Event volt Event irányba Event Event volt Event Event irányba Event Event volt Event Event
StartGame Load <5.txt> MoveRequest <4> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <4> direction MoveSuccess <4><JuzKez>
//az actor mozgása sikeres
MoveRequest <4> <JuzKez>
// mozgás kérése az adott
was found in <4> direction MoveSuccess <4><JuzKez>
//az actor mozgása sikeres
was found in <0> direction MoveRequest <1> <JuzKez>
// mozgás kérése az adott
was found in <1> direction MoveSuccess <1><JuzKez>
//az actor mozgása sikeres
Fall ExitGame
//szikla zuhan // kilépés a játékból
mike_lefeautt (22.)
96 / 141
2009.05.14.
23. Teszt célja: Júz Kéz egy sziklát tol, mely lezuhan egy verembe, ahol ráesik Kefírre. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé, a sziklát szintén jobbra lefelé tolja tovább, a szakadék felé, a szikla ráesik Kefírre, Júz Kéz pedig a szikla helyére kerül. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Szikla ráesik Kefírre. Lehetséges hibaforrások: Júz Kéz nem tudja eltolni a sziklát. Kefírre ráesik a szikla, de nem hal meg. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_nop semmit */ jl_nop jk_nop jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* 2. jobbra lefelé ásásnál lezuhan a szikla */ /* A szikla esésének idején Júz Kéz és Júz Láb sem csinál /* Két ütemet várnak */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <6.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> sikertelen volt Event Fall Event Exploded Event ExitGame
mike_lefeautt (22.)
97 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása //szikla zuhan // Kefír meghalt. // kilépés a játékból
2009.05.14.
24. Teszt célja: Júz Kéz egy olyan földet ás ki, ami egy tartó volt, először tart a fejével ám utána elmozdul és így a tartott 3 szikla leesik és ráesik Júz Kézre. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé, ekkor a sziklák alá kerül, majd egyet lép lefelé és ráesik a fejére a legalsó szikla. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Ráesik Júz Kézre a szikla, és meghal. Lehetséges hibaforrások: Júz Kéz nem hal meg, nem zuhan le a szikla, illetve nem tudja megtartani a sziklákat, amikor alatta áll. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_move <3> Kézre. */ jl_nop jk_nop */ jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* jobbra lefelé ásás */ /* lefelé ásásnál lezuhan a 3 közül a legalsó szikla Júz /* Egy ütemmel később fog Júz Kézre esni a legalsó szikla /* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event irányba Event Event volt Event irányba Event Event volt Event Event irányba Event Event volt Event Event Event
StartGame Load <7.txt> MoveRequest <4> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <4> direction MoveSuccess <4><JuzKez>
//az actor mozgása sikeres
MoveRequest <4> <JuzKez>
// mozgás kérése az adott
was found in <4> direction MoveSuccess <4><JuzKez>
//az actor mozgása sikeres
was found in <0> direction MoveRequest <3> <JuzKez>
// mozgás kérése az adott
was found in <3> direction MoveSuccess <3><JuzKez>
//az actor mozgása sikeres
Fall <JuzKez> Exploded ExitGame
//szikla zuhan //Júz Kéz meghalt. // kilépés a játékból
mike_lefeautt (22.)
98 / 141
2009.05.14.
25. Teszt célja: Júz Kéz bombát rak le, gránitot akar robbantani a fal mellett, de felrobban ő is a gránittal együtt, mert nekimegy a falnak. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé, ekkor fal mellé kerül, felette üres mező található, felette 1 mezővel pedig gránit. Júz Kéz lehelyezi a bombát a fölötte lévő az üres mezőre, Ezután viszont jobbra akar haladni, de nem sikerül neki, mert falba ütközik, így bent marad a bomba hatósugarában! Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: A bomba felrobban, gránit összetörik, Júz Kéz elpusztul. Lehetséges hibaforrások: A bomba nem robban fel, nem kerülünk fal mellé, illetve a bomba robbanása előtt elmozdulunk biztonságos helyre. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_looking <0> jl_nop jk_bomb_plant jk_move <4> jl_nop jk_nop jl_nop exit
/* Pálya betöltése */ /* Jobbra lefelé ásás */ /* Jobbra lefelé ásás */ /* A leendő bomba helye felé fordulás */ /* /* /* /*
The Bomb has been planted! */ Menne tovább jobbra lefelé,de fal van mellette. */ Felrobban a bomba, Júz Kéz és a gránit felrobban! */ A bomba robbanását megvárjuk */
/* Kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <8.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveFail sikertelen volt Event LookingDirectionChanged <0> <JuzKez> Event was found in <0> direction Event TheBombHasBeenPlanted Event MoveRequest <4> <JuzKez> irányba Event <Wall > was found in <4> direction Event MoveFail <4><JuzKez> sikertelen volt Event Exploded
mike_lefeautt (22.)
99 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása
// mozgás kérése az adott //az actor mozgása //Júz Kéz meghalt.
2009.05.14.
Event <JuzKez> Exploded Event ExitGame
mike_lefeautt (22.)
//Júz Kéz meghalt. // kilépés a játékból
100 / 141
2009.05.14.
26. Teszt célja: Júz Kéz ás párat, ám kiás egy olyan földet, ami egy gyémántot tart, az leesik egy verembe, egy sziklára, ahonnan még legördül jobbra lefelé. Megvalósítás: Júz Kéz a pálya bal széléről indul, kettőt ás jobbra lefelé, ekkor a gyémánt alatt fog állni, egyet visszalép balra felfelé, ekkor lezuhan a gyémánt a szikla tetejére, majd legördül róla. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Lezuhan a gyémánt, és legördül a szikláról. Lehetséges hibaforrások: Júz Kéz nem tudja megtartani a gyémántot, a gyémánt nem gördül le a szikláról. A bemeneti tesztfájl: StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_move <1> jl_nop jk_nop jl_nop jk_nop jl_nop exit
/* pálya betöltése */ /* jobbra lefelé ásás */ /* jobbra lefelé ásás */ /* Júz Kéz ellép a gyémánt alól, lezuhan a mélybe, majd legördül */ /* a 2. kiásott föld tartotta a gyémántot. Majd Júz Kéz feje. */ /* A gördülésnek és zuhanásnak hagyunk időt */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <9.txt> Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event was found in <4> direction Event MoveSuccess sikertelen volt Event was found in <0> direction Event MoveRequest <1> <JuzKez> irányba Event was found in <1> direction Event MoveSuccess <1><JuzKez> volt Event Fall Event rolled down in direction <4> Event ExitGame
mike_lefeautt (22.)
101 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása // mozgás kérése az adott //az actor mozgása sikeres //gyémánt zuhan // kilépés a játékból
2009.05.14.
27. Teszt célja: Júz Kézt és/vagy Júz Lábat körbezárja Amőba, addig tart a teszteset, amíg legalább egyiket nem zárta körbe. (egyszerre is megtörténhet) Megvalósítás: Hosszú ideig nem lépünk a két indiánnal, addig, amíg körbe nem valamelyiket Amőba. Várt eredmény: Valamelyik játékost körbeéri az Amőba. Lehetséges hibaforrások: Az Amőba megöli Júz Kézt, pedig nem képes rá. A bemeneti tesztfájl: StartGame jk_nop jl_nop jk_nop jl_nop …
/* pálya betöltése */
/* hosszú szakasz…amíg megtörténik a körbezárás. */ exit
/* kilépés a pályáról */
A kimeneti tesztfájl: /Ha JuzKez-t keríti be előbb…/ Event StartGame Event Load <10.txt> Event AmoebaMultiplied Event AmoebaMultiplied Event AmoebaMultiplied Event AmoebaMultiplied Event AmoebaMultiplied Event MoveRequest <0><JuzKez> irányba Event was found in <0> Event MoveFail <0><JuzKez> sikertelen volt Event MoveRequest <1><JuzKez> irányba Event was found in <1> Event MoveFail <1><JuzKez> sikertelen volt Event MoveRequest <2><JuzKez> irányba Event was found in <2> Event MoveFail <2><JuzKez> sikertelen volt Event MoveRequest <3><JuzKez> irányba Event was found in <3> Event MoveFail <3><JuzKez> sikertelen volt Event MoveRequest <4><JuzKez> irányba Event was found in <4>
mike_lefeautt (22.)
// a játék elkezdése // file betöltése //Amőba terjeszkedett //Amőba terjeszkedett //Amőba terjeszkedett //Amőba terjeszkedett //Amőba terjeszkedett… // mozgás kérése az adott direction //az actor mozgása // mozgás kérése az adott direction //az actor mozgása // mozgás kérése az adott direction //az actor mozgása // mozgás kérése az adott direction //az actor mozgása // mozgás kérése az adott direction
102 / 141
2009.05.14.
Event MoveFail <4><JuzKez> sikertelen volt Event MoveRequest <5><JuzKez> irányba Event was found in <5> direction Event MoveFail <5><JuzKez> sikertelen volt Event MoveRequest <6><JuzKez> irányba Event was found in <6> direction Event MoveFail <6><JuzKez> sikertelen volt Event ExitGame
mike_lefeautt (22.)
103 / 141
//az actor mozgása // mozgás kérése az adott //az actor mozgása // mozgás kérése az adott //az actor mozgása // kilépés a játékból
2009.05.14.
28. Teszt célja: Júz Kézt üldözi Kefír, ám Júz Kéz bombát rak le, Kefír pedig felrobban Megvalósítás: Kefír a pálya tetejéről indul, 2-vel alatta lévő mezőn Júz Kéz helyezkedik el. Kefír egyből üldözné Júz Kézt, de ő lehelyez egy bombát, mellyel elzárja Kefír útját. Júz Kéz még kettőt ás lefelé, Kefír pedig éppen a bomba melletti mezőre lépve felrobban. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Az üldözés során Kefír nem kapja el Júz Kézt, hanem az általa lerakott bomba miatt meghal, Júz Kéz pedig elmenekül. Lehetséges hibaforrások: Kefír elkapja Júz Kézt, vagy bomba mellett marad Júz Kéz, ezért meghal. Előfordulhat, hogy Kefír nem áll a bomba melletti mezőn a robbanás pillanatában, így nem hal meg. A bemeneti tesztfájl: StartGame /* pálya betöltése */ jk_looking <0> /*beállítja, hogy merre nézzen Júz Kéz*/ jk_bomb_plant jk_move <3> jl_nop jk_move <3> jl_nop
/* The Bomb has been planted! */ /* 2x lefelé ásás */
/* felrobban a bomba! */ /* kilépés a pályáról */
exit
A kimeneti tesztfájl: Event Event Event Event Event irányba Event Event volt Event irányba Event Event volt Event Event
StartGame Load <11.txt> LookingDirectionChanged <0> <JuzKez> TheBombHasBeenPlanted MoveRequest <3> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <3> direction MoveSuccess <3><JuzKez>
//az actor mozgása sikeres
MoveRequest <3> <JuzKez>
// mozgás kérése az adott
was found in <3> direction MoveSuccess <3><JuzKez>
//az actor mozgása sikeres
Exploded ExitGame
//Kefír felrobbant // kilépés a játékból
mike_lefeautt (22.)
104 / 141
2009.05.14.
29. Teszt célja: Amőba terjeszkedik, bomba robban mellette, nem történik semmi, ám Júz Kéz pályát tud lépni sikeresen Megvalósítás: Júz Kéz a pálya legalsó sorában áll, lerak egy bombát, majd felfelé ás kétszer, vár a bomba felrobbanásáig, mely nincs hatással Amőbára, egy balra felfelé lépéssel pedig az Exit kapuba lép. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Amőba nem hal meg a bombától, Júz Kéz sem hal meg, mert biztonságos helyre áll, aztán pályát áll. Lehetséges hibaforrások: A bemeneti tesztfájl: StartGame jk_bomb_plant jl_nop jk_move <5> jl_nop jk_move <5> jl_nop jk_move <5> exit
/* pálya betöltése */ /* The Bomb has been planted! */ /* 2x jobbra felfelé ásás */
/* felrobban a bomba! */ /* jobbra felfelé lépéssel új pályára lépés */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event Event Event Event irányba Event Event volt Event irányba Event Event volt Event irányba Event Event volt Event Event
StartGame Load <12.txt> AmoebaMultiplied was found in <2> direction TheBombHasBeenPlanted MoveRequest <5> <JuzKez>
// a játék elkezdése // file betöltése //Amőba terjeszkedett // mozgás kérése az adott
was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
MoveRequest <5> <JuzKez>
// mozgás kérése az adott
was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
MoveRequest <5> <JuzKez>
// mozgás kérése az adott
<Exit> was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
NextLevel <13> ExitGame
// szintlépés // kilépés a játékból
mike_lefeautt (22.)
105 / 141
2009.05.14.
30. Teszt célja: Júz Kézt üldözi Kefír, ám Kefírre gyémánt esik, mert Júz Kéz olyan földet ásott ki, így jön a cseles pályaugrás Megvalósítás: Kefír a pálya bal alsó sarkából indul, felette két mezővel pedig Júz Kéz. Júz Kéz feletti mező pedig egy gyémánt van. Júz Kéz egyet ás jobbra felfelé, így már nem tartja meg fejével a gyémántot, emiatt a gyémánt Kefír felé kezd zuhanni. Mivel Kefír a pálya szerkezete miatt nem tud a zuhanó gyémánt elől kitérni, így a gyémánt meg fogja ölni, ezáltal a következő pályára ugrunk. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Kefír meghal, és ezután pályaugrás következik be Lehetséges hibaforrások: Ha Júz Kéz rossz irányba lép (lefele), akkor vagy Kefír ölheti meg meg, vagy a gyémánt esik rá pár ütemmel később, így meghal. Másik hibalehetőség, ha Kefír meghal, de nem következik be a pályaugrás. A bemeneti tesztfájl: StartGame jk_move <5> jl_nop jk_nop jl_nop jk_nop jl_nop exit
/* pálya betöltése */
/* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event Event irányba Event Event volt Event Event Event Event
StartGame Load <13.txt> was found in <0> direction MoveRequest <5> <JuzKez> was found in <5> direction MoveSuccess <5><JuzKez> Fall Exploded CheatLevelStep(”feature”) ExitGame
mike_lefeautt (22.)
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres // gyémánt zuhan //Kefir meghal. // kilépés a játékból
106 / 141
2009.05.14.
31. Teszt célja: Júz Kézt üldözi Kefír, ám Júz Kéz felszedi az utolsó gyémántot majd az üldözés közben eléri a kijáratot Megvalósítás: Kefír a pálya bal felső sarkából indul, Júz Kéz sok mezővel arrébbról, s üres mezők által út vezet közöttük. Júz Kéz amikor először lép jobbra lefelé,felszedi az utolsó gyémántot, majd a következő jobbra lefelé lépéssel eléri a kijáratot. Júz Láb végig mozdulatlan áll a pálya jobb szélén. Várt eredmény: Júz Kéz felszedi a gyémántot, és belép az Exit kapun. Lehetséges hibaforrások: Ha Júz Kéz más irányba megy, Kefír elkaphatja. A bemeneti tesztfájl: StartGame /* pálya betöltése */ jk_move <5> /* jobbra lefelé lépés, gyémántot felveszi, és kinyílik az Exit kapu */ jl_nop jk_move <5> /* jobbra lefelé lépés,exit kapu */ jl_nop exit /* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event irányba Event Event volt Event Event Event irányba Event Event volt Event Event
StartGame Load <14.txt> MoveRequest <5> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
DiamondOnMap-1 remaining: <0> ExitAppeared MoveRequest <5> <JuzKez>
//a kijárat megnyílik // mozgás kérése az adott
<Exit> was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
NextLevel <15> ExitGame
// szintlépés // kilépés a játékból
mike_lefeautt (22.)
107 / 141
2009.05.14.
32. Teszt célja: Kefír üldözi Júz Kézt, ám ráesik egy szikla Kefírre aki így gyémánttá változik Megvalósítás: Kefír a pálya bal alsó sarkából indul, felette két mezővel pedig Júz Kéz. Júz Kéz egy mezőt ás felfelé, megtart a fejével egy sziklát, majd jobbra felfelé ás egyet, a szikla pedig rázuhan Kefírre. Júz Láb végig mozdulatlan áll a pálya bal szélén Várt eredmény: Kefírt megöli a szikla. Lehetséges hibaforrások: Ha Júz Kéz rossz irányba lép, akkor Kefír öli meg, vagy a szikla ráesik a fejére. A bemeneti tesztfájl: StartGame jk_move <0> jl_nop jk_move <5> jl_nop jk_nop jl_nop jk_nop jl_nop exit
/* pálya betöltése */
/* kilépés a pályáról */
A kimeneti tesztfájl: Event Event Event Event irányba Event Event volt Event Event Event
StartGame Load <15.txt> was found in <0> direction MoveRequest <5> <JuzKez>
// a játék elkezdése // file betöltése // mozgás kérése az adott
was found in <5> direction MoveSuccess <5><JuzKez>
//az actor mozgása sikeres
Fall Exploded ExitGame
//szikla zuhan //Kefir elpusztul. // kilépés a játékból
mike_lefeautt (22.)
108 / 141
2009.05.14.
33. Teszt célja: Kefír üldözi Júz Kézt, akit utolér így Júz Kéz meghal Megvalósítás: Júz Kéz és Kefír a pálya jobb felső sarkából indul. Júz Kéz két mezővel Kefír alatt áll, lefelé próbál lépni, de gránittal el van torlaszolva az út. Ezáltal Kefír utoléri őt, így meghal. Júz Láb végig mozdulatlan áll a pálya bal szélén. Várt eredmény: Júz Kéz meghal. Lehetséges hibaforrások: Kefír nem öli meg Júz Kézt, illetve Júz Kéz-t nem állítja meg a gránit. A bemeneti tesztfájl: StartGame jk_move <3> jl_nop jk_nop jl_nop exit
/* pálya betöltése */ /* lefelé lépés próbálkozása */ /* Vesztére nem mozdul Júz Kéz, mert így beéri Kefír */ /* kilépés a pályáról */
A kimeneti tesztfájl: Event StartGame Event Load <16.txt> Event MoveRequest <3> <JuzKez> irányba Event was found in <3> direction Event MoveFail <3><JuzKez> sikertelen volt Event <JuzKez> Exploded Event KefirKilled <JuzKez> Event ExitGame
mike_lefeautt (22.)
109 / 141
// a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása //JuzKez meghalt. //Kefir megölte JuzKezt. // kilépés a játékból
2009.05.14.
8.3. A tesztelést támogató programok tervei A kimenet helyességének ellenőrzéséhez egy egyszerű Java programot fogunk használni, amely soronként összehasonlít két állományt. Ennek az az értelme, hogy az egyik fájl lesz a prototípus kimenete, a másik pedig az általunk megadott bemenetre várt kimenet. Ha a 2 fájl sorról-sorra megegyezik, akkor az ellenőrző program egy OK-t ír ki a konzolra, egyébként pedig 2 sort: azokat, amelyek a prototípus kimenetben és a várt kimenetben az első egymástól eltérő sorok. A program parancssorból lesz futtatható, és 2 fájlnevet vár paraméterül: az első lesz a prototípus futtatásának kimenete, a második pedig az elvárt kimenet. pl.: java ComparerTool kapott.txt vart.txt
mike_lefeautt (22.)
110 / 141
2009.05.14.
9. Prototípus - beadás 9.1. A prototípus fordítása és futtatása 9.1.1. Indítás a batch file-al 1. A mellékelt mike_lefeautt_csapat_prototipus.zip file-t ki kell csomagolni egy könyvtárba. 2. A játékot a start.bat file-al indíthatjuk, például start1.bat 3. A JavaDoc dokumentációt a doc.bat segítségével tekinthetjük meg, amely elindítja a javadoc mappa index.html lapját, a JavaDoc kezdőoldalát, így rendelkezésünkre áll egy jól használható objektumkatalógus. Az itt szereplő leírások a forráskódban is megtalálhatóak kommentek formájában. Előfordulhat, hogy a HSZK-s gépeken nincs a PATH útvonalhoz hozzáadva a java.exe és a javac.exe. Ebben az esetben a tesztelőnek kell gondoskodnia arról, hogy kitallózza és/vagy hozzáadja e két fájl útvonalát.
mike_lefeautt (22.)
111 / 141
2009.05.14.
9.2. A mellékelt állomány tartalma 9.2.1. A játékprogram (src mappa) fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja
Fájl mérete
Fájl neve
2009.04.16.
06:19
1389
ActionKeylistener.java
2009.04.16.
04:04
1395
Amoeba.java
2009.04.16.
03:56
2055
Blank.java
2009.04.16.
04:20
1934
Bomb.java
2009.04.16.
06:19
11257
CommandProcessor.java
2009.04.16.
06:19
3387
Diamond.java
2009.04.01.
00:55
1393
Direction.java
2009.04.16.
03:01
1856
Exit.java
2009.03.19.
10:34
159
Explodeable.java
2009.04.16.
12:05
7805
Field.java
2009.04.16.
03:01
587
FieldItem.java
2009.04.16.
06:19
1558
Game.java
2009.04.16.
03:01
651
Granite.java
2009.03.19..
10:34
250
Gravitable.java
2009.04.16.
11:49
5809
Indian.java
2009.04.16.
06:19
3006
Kefir.java
2009.04.16.
03:17
767
Land.java
2009.04.16.
10:45
13261
Level.java
2009.04.16.
03:01
900
Logger.java
2009.04.02.
01:48
392
Moveable.java
2009.04.16.
06:19
2605
Rock.java
2009.04.16.
03:42
1227
Smell.java
2009.04.16.
06:19
280
TimerTask.java
2009.04.15.
19:14
249
Wall.java
9.2.2. A játékprogram kimenetét ellenőrző program fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja 2009.04.16.
mike_lefeautt (22.)
11:49
112 / 141
Fájl mérete 1478
Fájl neve ComparerTool.java
2009.05.14.
9.2.3. A játékprogram térképeit tartalmazó maps mappa fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja
Fájl mérete
Fájl neve
2009.04.16.
03:01
77
1.map
2009.04.16.
03:01
89
2.map
2009.04.16.
03:01
117
3.map
2009.04.16.
03:01
87
4.map
2009.04.16.
03:01
87
5.map
2009.04.16.
03:01
98
6.map
2009.04.16.
03:01
98
7.map
2009.04.16.
03:01
69
8.map
2009.04.16.
03:01
113
9.map
2009.04.16.
03:01
101
10.map
2009.04.16.
03:01
98
11.map
2009.04.16.
03:01
111
12.map
2009.04.16.
03:01
85
13.map
2009.04.16.
06:19
117
14.map
2009.04.16.
03:01
85
15.map
2009.04.16.
03:01
98
16.map
9.2.4. A játékprogram parancsfájljait tartalmazó test mappa fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja
Fájl mérete
Fájl neve
2009.04.16.
03:01
99
1.pro
2009.04.16.
06:19
252
2.pro
2009.04.16.
04:11
57
3.pro
2009.04.16.
04:11
57
4.pro
2009.04.16.
04:11
78
5.pro
2009.04.16.
04:12
89
6.pro
2009.04.16.
12:10
94
7.pro
2009.04.16.
01:49
133
8.pro
2009.04.16.
04:12
110
9.pro
2009.04.16.
12:42
379
10.pro
2009.04.16.
04:13
88
11.pro
2009.04.16.
04:13
93
12.pro
2009.04.16.
06:19
116
13.pro
2009.04.16.
12:42
57
14.pro
2009.04.16.
04:13
89
15.pro
2009.04.16.
04:13
52
16.pro
mike_lefeautt (22.)
113 / 141
2009.05.14.
9.2.5. A játékprogram kimenetét tartalmazó out mappa fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja 2009.04.16.
Fájl mérete
Fájl neve
77
1.out
2009.04.16.
12:08 12:08
89
2.out
2009.04.16.
12:08
117
3.out
2009.04.16.
12:08
87
4.out
2009.04.16.
12:08
87
5.out
2009.04.16.
12:08
98
6.out
2009.04.16.
12:08
98
7.out
2009.04.16.
69
8.out
2009.04.16.
13:14 13:14
113
9.out
2009.04.16.
13:14
101
10.out
2009.04.16.
13:14
98
11.out
2009.04.16.
13:14
111
12.out
2009.04.16.
13:14
85
13.out
2009.04.16.
117
14.out
2009.04.16.
12:08 13:14
85
15.out
2009.04.16.
13:14
98
16.out
9.3. A tesztelés egy példánya 9.3.1. Teszt pálya példa
13 5 #w#w# w#w#w #L#r# w#l#w #l#r# w#l#w #j#r# w#l#w #l#l# w#l#w #l#l#
mike_lefeautt (22.)
114 / 141
2009.05.14.
w#w#w #w#w#
9.3.2. Bemeneti tesztparancsfájl példa StartGame jk_move <4> jl_nop jk_move <4> jl_nop jk_move <3> jl_nop jk_nop jl_nop exit
9.3.3. Teszt kimenet példa Event Event Event Event Event Event Event Event Event Event Event Event Event Event
StartGame Load <7.map> MoveRequest <4><JuzKez> was found in <4> direction MoveSuccess <4><JuzKez> MoveRequest <4><JuzKez> was found in <4> direction MoveSuccess <4><JuzKez> MoveRequest <3><JuzKez> was found in <3> direction MoveSuccess <3><JuzKez> Fall Fall ExitGame
9.4. A tesztelés eredményeinek összefoglalása ./test/1 Teszt: Júz Kéz ás egyet, majd falba ütközik, ekkor megfordul, tovább ás más irányba, majd felvesz egy gyémántot. Hiba: Apró szóköz hibák. Javítás: A szóköz hibák javítása. ./test/2
mike_lefeautt (22.)
115 / 141
2009.05.14.
Teszt: Júz Kéz ás egyet, majd gránitba ütközik, lerak egy bombát, arrébb áll, felrobbantja a gránitot, majd tovább halad Hiba: Többször lett loggolva a JúzKéz nézési irányának módosítása. A program jól működik, de több adat van a kimeneten, mint ami meg lett határozva, így változtatás kell. Volt olyan, hogy valami felrobbant, de nem generált Eventet. Javítás: Egy loggolás nélküli irányállító függvényt hoztunk létre setActualDirection_private néven, amit csak a programon belül, az osztályok hívhatnak meg! Hiányzó explode Event javítása. ./test/3 Teszt: Júz Kéz ás párat, majd sziklába ütközik, melyet letol egy szakadékba, a szikla leesik, és ráesik egy gyémántra. Hiba: Szóköz hibák. Javítás: Szóköz hibák javítása. ./test/4 Teszt: Júz Kéz ás párat, majd sziklába ütközik, melyet nem tud tovább tolni, mert nincs mögötte kiásva a terület. Hiba: Nem volt. Javítás: ./test/5 Teszt: Júz Kéz ás párat, majd sziklába ütközik, melyet megtol, ezután visszalép egyet, ezáltal lezuhan egy szikla, mely az előbb még Júz Kéz felett volt. Hiba: A kimeneti fájlban egy plusz sor található: Event < Rock> was found in <0> direction, ami feleslegesen került a várt kimenetbe. Ettől eltekintve teljesen OK volt az eredmény. Javítás: A hiba javítva globális szinten, mivel máshol is hibát okozott. ./test/6 Teszt: Júz Kéz egy sziklát tol, mely lezuhan egy verembe, ahol ráesik Kefírre. Hiba: Kefír nem halt meg, és utána is mozoghatott. Egyébként tartalmazott még olyan sort a várt eredmény, amelyet nem kellett volna megkapnunk. Javítás: Kefír halálának vizsgálatát helyeztük el, lépése előtt. ./test/7 Teszt: Júz Kéz egy olyan földet ás ki, ami egy tartó volt, először tart a fejével ám utána elmozdul és így a tartott 3 szikla leesik és ráesik Júz Kézre.
mike_lefeautt (22.)
116 / 141
2009.05.14.
Hiba: A kimeneten több elírás volt, ezért a javított várt és legyártott eredmény lett a kiragadott példánk az előző pontban. Megjegyzés: Végtelenített ciklusba leszünk, mert JúzKéz minden tesztesetben meghal, így újrakezdődik a pálya, de ott ugyan úgy meghal. Kézi kikapcsolást igényel a program! Egy teszt futását itt is az Event StartGame - Event ExitGame páros adja! Javítás: Végtelen ciklusú pályaújratöltés javítva, a pálya végigjátszása utána leállunk. ./test/8 Teszt: Júz Kéz bombát rak le, gránitot akar robbantani a fal mellett, de felrobban ő is a gránittal együtt, mert nekimegy a falnak.
Hiba: Bomba robbanásakor hiányzott a hozzá tartozó Event. Javítás: Hiányzó Event javítva. ./test/9 Teszt: Júz Kéz ás párat, ám kiás egy olyan földet, ami egy gyémántot tart, az leesik egy verembe, egy sziklára, ahonnan még legördül jobbra lefelé. Hiba: 2 zuhanás Event hiányzott, amúgy rendben volt. Javítás: Hiányok pótlása. ./test/10 Teszt: Júz Kézt és/vagy Júz Lábat körbezárja Amőba, addig tart a teszteset, amíg legalább egyiket nem zárta körbe. (egyszerre is megtörténhet) Hiba: Nem volt. Megjegyzés: Hosszabb lett a bemeneti parancsfájl (+jk_nop-ok, +jl_nop-ok), hogy az amőba az egész játékteret be tudja borítani. Így már korrekt volt a kimenet. Javítás: ./test/11 Teszt: Júz Kézt üldözi Kefír, ám Júz Kéz bombát rak le, Kefír pedig felrobban Hiba: Egy Event Exploded lemaradt a várt eredményeknél. Javítás: 11.out fájl javítása. ./test/12 Teszt: Amőba terjeszkedik, bomba robban mellette, nem történik semmi, ám Júz Kéz pályát tud lépni sikeresen Hiba: Nem nyílt ki az Exit kapu. Hiányoztak az AmoebaMultiplied eventek a várt eredményeknél a 12.pro-ban.
mike_lefeautt (22.)
117 / 141
2009.05.14.
Megjegyzés: a prototípus az elvárthoz képest, elindítja a következő pályát is, és azt is lejátssza a 13.pro alapján! Javítás: A pálya kezdetén is egy ellenőrzést vezettünk be a kapu állapotára, a gyémántok függvényében. 12.out fájl kiegészítése. ./test/13 Teszt: Júz Kézt üldözi Kefír, ám Kefírre gyémánt esik, mert Júz Kéz olyan földet ásott ki, így jön a cseles pályaugrás. Hiba: A várt kimeneti fájlban több elírás volt. Javítás: Az egész várt kimeneti fájl újragyártásra került! ./test/14 Teszt: Júz Kézt üldözi Kefír, ám Júz Kéz felszedi az utolsó gyémántot majd az üldözés közben eléri a kijáratot . Hiba: Tévesen nem 4-es, hanem 5-ös irányba vezéreltük az Indiánt, így nem olyan eredményeket kaptunk, mint amire számítottunk, tehát nem tudtunk gyémántot felvenni. Javítás: 14.pro fájlban az irányok javítása ./test/15 Teszt: Kefír üldözi Júz Kézt, ám ráesik egy szikla Kefírre aki így gyémánttá változik Hiba: Kefír nem akart gyémánttá változni. Lemaradt egy jk_move --- success páros a 15.outból Javítás: Kefír catchMoveRequest(int dir, FieldItem fi) metódusát kellett módosítani. ./test/16 Teszt: Kefír üldözi Júz Kézt, akit utolér így Júz Kéz meghal Hiba: Nem volt. Javítás: -
9.5 Értékelés A munka minőségét illetően most sincs ok a panaszra. Pár helyen elírások még mindig akadnak az átolvasások ellenére, de szerencsére sem a programozás során, sem a hozzá tartozó fájlok nem tartalmaztak hibát, megkönnyítve ezzel nagyban a hibakeresést. A feladatokat most én osztottam ki, amit minden csapattag elfogadott. A tempó az utolsó másfél
mike_lefeautt (22.)
118 / 141
2009.05.14.
napban igen feszített volt, azonban csak kisebb összehasonlítási-logikai műveletek voltak a hibák okozói, így javításuk könnyű volt. A sok tesztesetnek hála úgy gondolom a legtöbb hibát kijavítottuk a programban, és megfelelő pályafájlok alkalmazásával már most játszható állapotú a játékunk. A feladatok kiosztásakor volt egy kis kommunikációs hiba, de szerencsére időben fény derült az esetre, így még tesztelés előtt kijavításra kerültek azok a pálya fájlok. Szerencsére a megvalósítás eddigi szakasza viszonylag gördülékenyen ment, nem találkoztunk nagy változtatást igénylő problémával, csak apró módosítások, egyszerűsítések kerültek bele a programba a szkeleton óta. Bár itt a programozás sok időt elvett, a többi elvégezendő munka is volt olyan fontos, mint az, így mondhatom, hogy egyenlő mértékben osztoztunk a feladatok nagyságában.
mike_lefeautt (22.)
119 / 141
2009.05.14.
11. Grafikus felület specifikálása 11.1. A menürendszer, a kezelői felület grafikus képe A játékunk grafikus felülete nem fog menürendszerrel rendelkezni. A felhasználónak annyi interaktív lehetősége lesz, hogy gombokat nyomogatva a játék 2 indiánját irányítja, illetve bombát helyeztet le velük. A játékból való kilépést a standard ablak [X] gombja fogja biztosítani. A játék újraindítása a bezárás-újraindítás párossal érhető el. A játék grafikus felületét alapvetően 2 részre, egy bal, és egy jobb oldalra osztjuk. A baloldalon helyezzük el a játékteret, ide rajzoljuk a barlangot az indiánokkal, gyémántokkal, szörnyekkel együtt. Az ablak jobb oldalán lesznek megjelenítve a játékkal kapcsolatos aktuális információk: adott pálya sorszáma, hátralévő idő, az Exit megnyílásáig felszedendő gyémántok száma és a bombák száma az egyes indiánoknál. A felhasználói felület terve:
mike_lefeautt (22.)
120 / 141
2009.05.14.
11.2. A felület működési elve, a grafikus rendszer architektúrája A grafikus felület megjelenítéséért, karbantartásáért egy GraphicsController nevű osztály fog felelni. Ez az osztály a Java Frame osztályának leszármazottja lesz. Az ablak bal oldalán lévő területet a Cave osztály fogja megvalósítani, amely a Java Canvas-ból fog öröklődni. Erre a vászonra fogjuk felrajzolni a pályát. A pálya hatszögekből áll. Az egyes játékbeli tárgyakhoz, szereplőkhöz készítünk 1-1 grafikus reprezentációt, amelyet a pálya szerkezete szerinti pozíciókra felhelyezünk a Canvas-ra. A jobb oldalon lévő információkat egy InfoPanel osztály fogja össze. Ez az osztály is egy Canvas lesz, amelyre a pályaszámot, hátralévő időt, gyémántok számát, és a bombák számát rajzoljuk fel. A modellt igyekszünk a lehető legjobban érintetlenül hagyni a GUI kidolgozása során, de sajnos 1-2 plusz getter metódust kénytelenek leszünk bevenni a Level osztályba, az InfoPanel kitöltése miatt. A model és view kombinációjából álló architektúra alapvető működése a következő: A modelben az eseményeket egy időzítő adta ritmusra vezényeljük. Ez tehát egy ciklus, amelynek minden fordulásakor kiadunk a GraphicsController-nek egy invalidate() üzenetet, amellyel azt jelezzük, hogy megváltozott a model állapota. Ezután a GraphicsController a Level getterei által lekérdezi a modell aktuális állapotát, és frissíti a megfelelő komponenseket.
11.3. Grafikus objektumok GraphicsController Alaposztály
jawa.awt.Frame
Példányok száma
1
Perzisztencia
dinamikus
Komponensek HashMap
fieldPicMap
Cave
cave
InfoPane
infoPanel
Relációk
nincs
Változók
nincs
Szolgáltatások void
repaint
Az egész ablak újrarajzolását idézi elő úgy, hogy meghívja a cave és infoPanel komponenseinek újrarajzoló metódusát
void
setLevel
A level átadásával kijelöljük, hogy melyik pályát írjuk ki
mike_lefeautt (22.)
121 / 141
2009.05.14.
Cave Alaposztály
jawa.awt.Canvas
Példányok száma
1
Konkurencia
passzív
Perzisztencia
dinamikus
Komponensek Relációk
nincs
Változók
nincs
Szolgáltatások void
paint
void
update
Kirajzolja a teljes játékteret.
InfoPanel Alaposztály
jawa.awt.Canvas
Példányok száma
1
Konkurencia
passzív
Perzisztencia
dinamikus
Komponensek Relációk
nincs
Változók
nincs
Szolgáltatások void
paint
void
update
Frissíti az osztály tagváltozóit, majd kirajzolja az új értékeket az ablakra.
11.4 Grafikus osztályok részletes tervei 11.4.1. Cave osztály A Cave osztály valósítja meg a barlangot: a játékteret, ahol az indiánok mozognak. Egy Canvas leszármazott osztály. Cave(HashMap, Field[][], Character[][], Dimension) Cave kontruktor. Beállítjuk a canvas méretét, és előkészítjük a duplapufferelést. A Dimension paraméter kell, hogy tudjuk mekkora a játéktér. A HashMapre azért van szükségünk, mert itt tároljuk, hogy az egyes objektumokhoz milyen kép tartozik. A
mike_lefeautt (22.)
122 / 141
2009.05.14.
Character mátrix azért kell, hogy tudjuk, hol vannak a speciális (6szöges felépítésből adódó) kihagyandó objektumok, amiket a pályát leíró fájlokban a # karakter jelöl. A Field mátrix szolgál a játéktér megjelenítésének alapjául, mivel ez tárolja az aktuális, friss állapotát a játéktérnek. void paint(Graphics g) Egy speciális algoritmus segítségével a játéktér elemeit itt rajzoljuk egymás mellé a megfelelő elrendezésben.
11.4.2. GraphicsController osztály A GraphicsController osztály képezi a játék keretét, mivel egy Frame leszármazottról van szó. Itt aggregálunk egy Cave és egy InfoPanel osztályt, amelyek a játékteret és a játék aktuális információit mutatják. GraphicsController() Bezárhatóvá tesszük az ablakot, létrehozunk egy adott sorszámú betöltőképernyőt, beállítjuk az ablak méretét, és elrendezését, majd egy HashMap-et feltöltünk osztálynévImage párosokkal, a kirajzoláshoz. void setLevel(Level) Kitöröljük a korábbi komponenseket (Cave, InfoPanel). Ha a játék véget ért: megjelenítjük a WinnerScreen-t, majd 20 másodperc múlva kilép a játék. Ha még nem végeztünk: létrehozunk egy új barlangot + információs sávot, és a töltő képernyőt aktualizáljuk a megadott szinthez. Majd töröljük a töltő-képernyőt, és felrajzoljuk a Cave-t és az InfoPanel-t. void repaint() Biztosítjuk, hogy ne vesszen el a fókusz a játék során, és hogy a 2 komponenst újrarajzolja az operációs rendszer.
11.4.2. InfoPanel osztály Az InfoPanel arra szolgál, hogy rárajzoljuk a játékból hátralévő időt, a hátralévő gyémántok számát, és az indiánok által felvett bombák számát. Ez egy Canvas leszármazott. InfoPanel(Level) Felrajzoljuk a logót, beállítjuk a hátteret, és előkészítjük a duplabufferelést. void paint(Graphics) Az infoPanel adatainak frissítése és kiírása, duplabufferelés használatával.
mike_lefeautt (22.)
123 / 141
2009.05.14.
void update(Graphics)
11.4.3. Loading osztály Ez az osztály valósítja meg az egyes pályák betöltődése előtt megjelenő Betöltés képernyőt. Loading(int) Beállítjuk a Canvas méretét, és előkészítjük a háttérképet. void paint(Graphics) Kirajzoljuk a háttérképet, majd ráírjuk az aktuális szint számát.
11.4.4. WinnerScreen osztály Ez az osztály valósítja meg a játék végén betöltődő győzelmet mutató képet. WinnerScreen() Beállítjuk a Canvas méretét, és előkészítjük a háttérképet. void paint(Graphics) Kirajzoljuk a háttérképet.
11.4.5. TimerTask osztály Ezt az objektumot kell átadni a Timer-nek, amely a játék menetét időzíti periodikusan. TimerTask(int) Eltároljuk, hogy hány másodpercet engedélyezünk a játékosnak. int getActTime() Ezzel a metódussal lekérhetjük a még hátralévő időt. void run() Ebben a metódusban szerepelnek olyan dolgok, amelyeket minden másodpercben végrehajtunk/ellenőrzünk. Ha lejár az idő: újraindítjuk a pályát.
mike_lefeautt (22.)
124 / 141
2009.05.14.
mike_lefeautt (22.)
125 / 141
2009.05.14.
11.5. Szekvencia diagram
mike_lefeautt (22.)
126 / 141
2009.05.14.
13. Grafikus változat beadása 13.1. A letölthető program fordításával és futtatásával kapcsolatos útmutatás 13.1.1. Indítás batch fájllal 1. A mellékelt mike_lefeautt_grafikus.zip file-t ki kell csomagolni egy könyvtárba. 2. A játékot a start.bat file-al fordíthatjuk és indíthatjuk egyúttal. 3. A JavaDoc dokumentációt a doc.bat segítségével tekinthetjük meg, amely elindítja a javadoc mappa index.html lapját, a JavaDoc kezdőoldalát, így rendelkezésünkre áll egy jól használható objektumkatalógus. Az itt szereplő leírások a forráskódban is megtalálhatóak kommentek formájában. Előfordulhat, hogy a HSZK-s gépeken nincs a PATH útvonalhoz hozzáadva a java.exe és a javac.exe. Ebben az esetben a tesztelőnek kell gondoskodnia arról, hogy kitallózza és/vagy hozzáadja e két fájl útvonalát.
13.2 A mellékelt állomány tartalma 13.2.1 A játékprogram fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja 2009.05.07.
Fájl mérete
Fájl neve
1524
ActionKeylistener.java
2009.05.07.
13:21 13:21
1962
Amoeba.java
2009.05.07.
13:21
2495
Blank.java
2009.05.07.
13:21
2139
Bomb.java
2009.05.07.
13:21
3227
Cave.java
2009.05.07.
13:21
11587
CommandProcessor.java
2009.05.07.
13:21
3783
Diamond.java
2009.05.07.
13:21
1609
Direction.java
2009.05.07.
13:21
1838
Exit.java
2009.05.07.
13:21
232
Explodeable.java
2009.05.07.
13:21
8015
Field.java
2009.05.07.
13:21
734
FieldItem.java
2009.05.07.
13:21
1905
Game.java
mike_lefeautt (22.)
127 / 141
2009.05.14.
2009.05.07.
13:21
991
Granite.java
2009.05.07.
13:21
5638
GraphicsController
2009.05.07.
13:21
274
Gravitable.java
2009.05.07.
13:21
6210
Indian.java
2009.05.07.
13:21
3234
InfoPanel.java
2009.05.07.
13:21
3962
Kefir.java
2009.05.07.
13:21
1163
Land.java
2009.05.07.
13:21
17891
Level.java
2009.05.07.
13:21
1210
Loading.java
2009.05.07.
13:21
994
Logger.java
2009.05.07.
13:21
390
Moveable.java
2009.05.07.
13:21
3518
Rock.java
2009.05.07.
13:21
1490
Smell.java
2009.05.07.
13:21
888
TimerTask.java
2009.05.07.
13:21
529
Wall.java
2009.05.07.
13:21
813
WinnerScreen.java
13.2.2. A játékprogram térképeit tartalmazó maps mappa fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja
Fájl mérete
Fájl neve
2009.05.07.
11:32
402
1.map
2009.05.07.
11:32
420
2.map
2009.05.07.
11:33
402
3.map
2009.05.07.
11:32
402
4.map
13.2.3. A játékprogram képeit tartalmazó pics mappa fájllistája: Utolsó módosítás dátuma Utolsó módosítás időpontja
Fájl mérete
Fájl neve
2009.04.29.
01:05
9270
amoeba.png
2009.04.29.
01:13
8264
blank.png
2009.04.29.
01:34
8296
bomb.png
2009.04.28.
23:50
8791
diamond.png
2009.05.07.
01:33
6657
exit_closed.png
2009.04.29.
00:39
6400
exit_open.png
2009.04.28.
23:38
8037
granite.png
2009.04.29.
01:11
9148
jk.png
2009.04.29.
01:11
9022
jl.png
2009.04.29.
00:39
9167
kefir.png
mike_lefeautt (22.)
128 / 141
2009.05.14.
2009.04.29.
00:43
8469
land.png
2009.05.07.
13:36
440923
loading.png
2009.04.28.
16:57
11586
logo.png
2009.04.28.
23:52
8069
rock.png
2009.04.28.
23:53
8582
wall.png
2009.05.07.
02:44
55932
winner.png
mike_lefeautt (22.)
129 / 141
2009.05.14.
14. A projekt értékelése Értékelésünkben szeretnénk megosztani a tárggyal kapcsolatos tapasztalatainkat, miként fejlődött játékunk, s mi magunk hogyan éltük meg a melót. Mivel csapatunk tagjai nem vettek részt eddig éles, munkahelyi projectekben, a Szoftver Labor 4 tárgy keretein belül kiváló lehetőségünk nyílt arra, hogy ennek kicsit „családiasabb” formájú, ámde hasonlóan precíz, komoly követelményeket felvonultató modellezését mi magunk vigyük véghez. Habár kezdetben a rengeteg papírmunka sokszor kedvünket szegte, a project végére láttuk, hogy megérte részletes terveket kidolgozni, mindent ábrákkal szemléletessé tenni, mert a project végén egészen tetszetős játék teljesedett ki szemünk láttára. És nem csak egy játék. Hanem a MI SAJÁT játékunk. Ezt az élményt nem veheti el tőlünk senki, legfeljebb csak sejtheti. Kis csapatunk a kezdeti (de akkortájt is csak apróbb), programunk megvalósítását érintő különbségek (milyen szereplők, szerkezeti elemek legyenek) után egyre több pontban értett egyet. Az analízis modell felállítása volt a legnehezebb az összes rész közül. A fejlesztési folyamat során azért ez volt meglátásom szerint a legnehezebb, mert nemcsak precíz munkát kellett végezni, de minden esetre figyelni kellett, és eszerint kialakítani a modellünket. Szerencsére az első elgondolásunkból egy jól használható modellt tudtunk megvalósítani, és emiatt a fejlesztés további menete sokkal egyszerűbb volt. Ennek segítségével mellőzni tudtuk a program fejlesztés közbeni kitalálását/formálását, így nemcsak időt, de energiát is megtakarítottunk. Véleményem szerint ez volt a tárgy egyik leghasznosabb tanulsága. Megtanított minket arra, hogy előre gondolkozzunk, és ne menet közben próbáljunk kitalálni mindent. A nehéz részekhez sorolnám a részletes use-case-ek megtalálását, valamint az egyes tesztesetek kitalálását. Ezeket is amiatt, mert itt szinte az összes esetet meg kellett találnunk annak érdekében, hogy a programunkat valóban hibamentessé tudjuk tenni. Megtanultunk helyesen dokumentálni, igaz van még mit fejlődnünk benne, mert a dokumentációink részletezettsége nem volt mindig azonos szintű. Legkönnyebb részt nagyon nem is nagyon tudok írni, mindegyik feladat kihívás volt, mind programozás, mind dokumentálás terén. Talán a grafikus kinézet kialakítását sorolnám a könnyű részek közé. Rendkívül sok segítséget jelentett, hogy Déri Tamástól egy kész és nagyon tetszetős grafikus felület képet kaptunk, így nekünk csak a programozás részével kellett foglalkoznunk. A tagok közül mindenki megtalálta a számára ideális feladatot. Ketten kódolásban remekeltek, egy emberke kreativitását csillogtatva tervezte a trükkös pályákat, és persze egy tesztelő pedig annál is több vért izzadva leküzdötte azokat . Sokféle változás zajlott le a hónapok során, pályaszerkezetet módosítottunk, új elemeket vittünk bele a játékba, de egyvalami biztos volt: az Alvásmennyiség. (nem aludtunk semmit ). De úgy érezzük mindannyian, megérte az álmatlan éjszakák, órák számát növelni, mert a projectre kapott pontjaink motiválttá tettek minket. Én személy szerint a szkeleton beadására kapott pontokat keveselltem, mert úgy érzem tisztességes munkát végeztünk vele, helyesen és hibamentesen működött, és szerintem letisztultabb volt, mint az általunk tesztelt csapaté, akik több pontot kaptak nálunk. Ezen kívül a többi pontszámokkal meg vagyok elégedve, a határidőket betartva, mindig lelkiismeretesen dolgoztunk, addig, amíg azt nem konstatáltuk: „Kész vagyunk, most pont jó.”
mike_lefeautt (22.)
130 / 141
2009.05.14.
Habár a külsőnkre nem hatott túl pozitívan (növekvő szakáll, karikás szemek), ámde a project pozitívan formálta belső énünket, kitartásban, szorgalomban, és ez a lényeg, valamint a csapategység győzedelme . Összefoglalva a leírtakat: a félév előrehaladtával kedvünket leltük a tárgyban, és szakmailag sokat tudtunk fejlődni, valamint játszani öröm.
Összesített értékelés
Mikes Péter Déri András Tündik Máté Ákos Sóskuthy Zalán
mike_lefeautt (22.)
25% 25% 25% 25%
131 / 141
2009.05.14.
Naplók 2. Napló – Követelmény, projekt, funkcionalitás Dátum 2008.február 14. 14:00 – 15:00
Érintett személyek Déri, Tündik, Sóskuthy, Mikes
Tevékenységek Alakuló megbeszélés Live Messenger program segítségével. Az alábbi döntések születtek: a következő megbeszélés február 16. 12:00kor a csapat összes tagja lejegyzi saját értelmezését és ötleteit a megvalósítandó feladatról Saját előzetes értelmezés elkészítése és feltöltése a projekt tárhelyére Első élő értekezlet. Az értekezlet eseményei: a példaként megadott BoulderDash játékprogram többszöri tesztelése a megvalósítandó program specifikációjának pontosítása a játékmenet részleteinek fixálása az egyes feladatok kiosztása Feladatok: Tündik elkészíti a feladat részletes magyar nyelvű leírását február 18. 20:00-ig Sóskuthy megcsinálja a követelmény definíciót és a projekt tervet február 18. 22:00-ig Sóskuthy elkészíti február 17. 20:00-ra essential use-case-eket és diagramjukat Déri írja a szótárt Tündik munkája alapján február 18. 23:00-ig Déri beszerzi a modellezéshez szükséges programot Mikes naplózza az eseményeket, ügyel az időpontok tartására, beszerzi a leadáshoz szükséges anyagokat
2008.február 15. 13:00 – 15:00 2008.február 16. 11:00 – 13:00
Tündik
2008. február 17. 00:00 – 00:45 2008. február 17. 00:45 – 01:30 2008. február 17. 01:15 – 01:30 2008. február 17. 21:45 – 23:00 2008. február 17.
Sóskuthy
Követelmény definíció elkészítése és feltöltése
Sóskuthy
Projekt terv elkészítése és feltöltése
Sóskuthy
Essential use-case-ek és diagramjuk elkészítése és feltöltése A feladat részletezett magyar nyelvű leírásának készítése A részletes leírás folytatása
mike_lefeautt (22.)
Déri, Tündik, Sóskuthy, Mikes
Tündik Déri
132 / 141
2009.05.14.
23:30 – 00:30 2008. február 18. 00:30 – 00:45 2008. február 18. 00:45 – 02:00 2008. február 18. 00:45 – 00:50 2008. február 18. 01:13 2008. február 18. 02:00 – 02:15 2008. február 18. 01:00 – 01:30 2008. február 18. 20:30 – 21:30 2008. február 18. 21:45 – 23:00 2008. február 18. 23:30 – 23:45
Az eddig elkészült részletes leírás átnézése és pontosítások helyének átadása a csapat többi tagjának A részletes leírás folytatása
Mikes Déri Sóskuthy Mikes Tündik, Déri, Mikes, Sóskuthy Sóskuthy
Pontosításra és egyéb hiányosságra hívja fel a figyelmet Döntés: ha egy szikla vagy gyémánt mindkét oldalra gördülhet, akkor mindig a bal irányra gördül A részletes leírást a csapat véglegesnek tekinti A szótár írásának elkezdése
Tündik
A szótár folytatása
Déri
A szótár javítása, helyesírás ellenőrzése, egységes dokumentum-kinézet kialakítása Az elkészült dokumentumok utolsó minőségi ellenőrzésre nyomtatás előtt
Mikes
3-4. Napló – Analízis modell Dátum
Érintett személyek 2009.február 22. Mikes 00:30 – 01:30 2009.február 22. Tündik 13:00 – 15:00 2009.február 22. Déri 16:00 – 17:00 2009.február 23. Déri, Tündik, 14:00 – 16:00 Sóskuthy, Mikes 2009.február 23. Mikes 16:00 2009.február 23. Déri, Mikes, 17:30 – 00:20 Tündik 2009.február 24. Mikes, Déri 21:30 – 23:30 2009.február 24. Mikes, Déri, 23:30 – 01:30 Tündik 2009.február 25. Déri 01:30 2009.február 25. Déri, Tündik, mike_lefeautt (22.)
Tevékenységek Az analízis modellhez lévő saját ötletek megfogalmazása és feltöltése a csapat cetlire Az analízis modellhez lévő saját ötletek megfogalmazása és feltöltése a csapat cetlire Az analízis modellhez lévő saját ötletek megfogalmazása és feltöltése a csapat cetlire Az analízis modell elkezdése. A modellnek még csak pár lényeges osztályáról tudtunk megállapodni, így még feladat, amit ki tudtam volna osztani. A modell felállításának folytatása. A lefektetett osztályok közötti kommunikáció lehetőségének keresése, és megoldási javaslatok átbeszélése. Az analízis modell statikus struktúra diagramjának felállítása. Déri a programkezelő, Mikes a lektor és jóváhagyó. A modell alapján az egyes use-case-ek alatti folyamatok végigkövetése, és helyességük vizsgálata a specifikáció alapján A statikus struktúra diagram elnyerte végső változatát, így feltöltésre került a csapat közös tárhelyére. A megbeszélés keretében kiosztásra kerültek a 133 / 141
2009.05.14.
01:30 – 01:45
Sóskuthy, Mikes feladatok, amelyek az alábbiak szerint alakultak: Déri elkészíti az objektum katalógust február 26. 12:00 –ig. Tündik elkészíti az osztályok leírását február 26. 10:00 –ig. Az elkészült munkát Mikes és Déri ellenőrzi, és szükség esetén javítja február 26. 13:00 –ig. Mikes megcsinálja a szekvencia diagramokat (inicializálásra, use-case-ekre, a belső működésre) február 26. 11:00 –ig. Déri a kész munkát ellenőrzi, és javítja február 26. 12:00 – ig. Déri megcsinálja a use-case diagramot a február 25. 21:00 –ig. Sóskuthy megcsinálja valamint az állapot diagramokat (inicializálásra, use-case-ekre, a belső működésre) 2009.február 25. Tündik Osztályok leírásának elkezdése 01:30 – 02:30 2009.február 25. Déri A use-case diagramok elkészítése 19:30 – 20:00 2009.február 25. Tündik Az osztályok leírásának befejezése 23:30 – 2:45 2009.február 25. Déri Az objektum katalógus elkészítése 23:30 – 3:00 2009.február 26. Sóskuthy Az állapot diagramok elkészítése 00:00 – 2:30 2009.február 26. Mikes A szekvencia diagramok elkészítése 01:00 – 04:30 2009.február 26. Déri Az osztályok leírásának ellenőrzése 03:00 – 04:30 2009.február 26. Déri Állapot diagramok digitalizálása 10:30 – 13:30 2009.február 26. Mikes Szekvencia dia grammok befejezése 10:30 – 13:30 2009.március 5. Mikes Az analízis modell felülvizsgálata: 00:15 – 03:00 A modell szekvencia diagramjainak átnézése és javítása. Az inicializálás szekvencia diagramjának hiánypótlása a dokumentumba. Az egész dokumentáció átnézése.
mike_lefeautt (22.)
134 / 141
2009.05.14.
5. Napló – Szkeleton tervezése Dátum 2009.március 9. 21:00 – 21:30
2009.március 9. 22:00 – 00:30 2009.március 9. 21:00 – 22:00 2009.március 10. 20:30 – 22:45 2009.március 11. 17:30 – 19:45 2009.március 11. 22:00 – 22:45 2009.március 12. 00:30 – 01:00 2009.március 12. 01:30 – 02:30 2009.március 12. 02:30 – 03:30
Érintett személyek Mikes, Déri, Tündik
Tevékenységek
Tündik
Kiosztott feladatok: Tündik megtervezi és legyártja a valóságos usecase-ek kipróbálásához szükséges játékteret Déri utána néz és megvalósítja a játéktér beolvasását biztosító osztályokat Mikes megvalósítja azt a függvényt, amely Déri beolvasó függvényét felhasználva létrehozza magát a játékteret Mikes leírja a kezelőfelület tervét, és a tervezett dialógusokat Sóskuthy megkeresi és dokumentálja a program valóságos use-case-eit Az architektúra megvalósításának elkezdése
Sóskuthy
A valóságos use-case-ek kidolgozása és leadása
Déri
A játéktér fájlból való beolvasását megvalósító függvény implementálása. Déri függvényének felhasználásával a játékteret létrehozó logika implementálása. A szkeleton modell valóságos use-case-einek listájának bővítése. Az architektúra részleteinek kidolgozásának befejezése
Mikes Tündik Tündik Mikes Déri
A skeleton kezelői felületének tervének és dialógusainak dokumentálása. A kezelő felület tervének és dialógusainak kiegészítése és formázása.
6. Napló – Szkeleton beadása Dátum 2009.március 16. 22:00 – 00:45 2009.március 17. 19:00 – 00:45 2009.március 17. 22:00 – 00:45 2009.március 18.
mike_lefeautt (22.)
Érintett személyek Mikes Mikes Déri Déri, Mikes,
Tevékenységek A FieldItem-ből származó osztályok metódusainak szkeleton szintű implementálásának elkezdése. Az egyes osztályok összes catchMoveRequest metódusának szkeleton szintű implementálása. Az egyes osztályok összes sendMoveRequest és transmitMoveRequest metódusának szkeleton szintű implementálása. Az utolsó napi teendők kiosztása:
135 / 141
2009.05.14.
00:45 – 01:00
Tündik, Sóskuthy
2009.március 18. 22:00 – 22:45
Tündik
Mikes és Déri befejezik március 18. 24:00-ra az Java fájlok implementálását. Közben folyamatosan teszteket tartanak a helyes működésről való meggyőzést illetően. Tündik március 18. 23:00-ra elkészíti az egyes tesztesetekhez tartozó pályák fájlbeli reprezentációját. Munkájához az előzőleg leadott pályaterveket veszi alapul. Sóskuthy elkészíti az írásbeli dokumentáció sablonját, gyorsítva a programozói munka utáni dokumentálását Pályák megtervezése és az őket reprezentáló fájlok elkészítésre.
7. Napló – Prototípus koncepciója Dátum 2009.március 23. 19:00 – 19:45
Érintett személyek Mikes, Déri, Tündik, Sóskuthy
2009.március 23. 20:00 – 23:45
Déri, Mikes
2009.március 24. 16:00 – 17:45 2009.március 24. 18:00 – 21:30 2009.március 24. 19:00 – 20:00 2009.március 25. 20:00 – 20:30 2009.március 25. 22:00 – 22:45
Déri
mike_lefeautt (22.)
Tündik Sóskuthy Déri Déri
Tevékenységek Konzultáció a feladatspecifikáció változását iletően: Tündik áttervezi az eddigi pályákat az új követelménynek megfelelően Déri és Mikes megtervezi az új pályatárolási architektúrát, és felépítésének algoritmusát Sóskuthy összegyűjti a részletes use-case-eket, amelyek alapján tesztfogatókönyvet is elkészíti. Déri megtervezi, és egyezteti a tesztelést segítő program specifikációját Mikessel. Minden kiosztott feladatnak a határideje 2009. március 25. 20:00 Az új bemeneti pálya-fájlformátum lefektetése, a specifikáció kiadása Tündiknek. Ezzel egy időben a bemeneti fájl alkalmazása esetén milyen parancsokat fogad el a program. A proto bemenetének és kimenetének specifikálása Az új pályafájlok elkészítése, melyek tekinthetők végleges pályaterveknek is. A részletes use-case-ek kidolgozása és a tesztforgatókönyvek átadása Tündik-nek A tesztet segítő program specifikációjának dokumentálása. Az elkészített dokumentációk összedolgozása
136 / 141
2009.05.14.
8. Napló – Részletes tervek Dátum 2009.március 29. 21:00 – 21:30
2009.március 30. 21:00 – 00:30 2009.március 31. 00:30 – 01:30 2009.március 31. 18:00 – 22:00 2009.március 31. 19:00 – 21:00 2009.március 31. 23:00 – 02:00 2009.március 31. 19:00 – 23:30 2009.április 1. 20:00 – 01:00 2009.április 1. 19:00 – 00:00 2009.április 2. 01:00 – 01:30 2009.április 2. 01:15 – 02:30 2009.április 2. 08:00 – 09:00
mike_lefeautt (22.)
Érintett személyek Mikes, Déri, Tündik, Sóskuthy
Tündik Mikes Tündik
Tevékenységek Kiosztott feladatok: Tündik kifejti a use-case-ekhez tartozó tesztterveket, bemeneti- és kimeneti adatokat is készít hozzájuk Déri dokumentálja az objektumokat, és azok metódusait ABC sorrend szerint a lista elejétől a Game osztályig. Digitalizálja Sóskuthy activity diagramjait és leírja a tesztelés segítő szoftver tervét Mikes dokumentálja az objektumokat, és azok metódusait Game-től a lista végéig. Dérivel együtt megtervezik, és dokumentálják a Controll osztály működését, és metódusait. A tesztek részletes terveinek elkészítése, hozzájuk bemeneti parancsok leírása. Tündik munkájának ellenőrzése, javítása
Sóskuthy
A tesztek kiegészítése a várt kimenetek dokumentálásával A diagramok elkészítése
Mikes
Az rábízott osztályok dokumentációjának elkezdése
Déri
Az rábízott osztályok dokumentációjának elkezdése
Mikes
Az rábízott osztályok dokumentációjának befejezése
Déri
Az rábízott osztályok dokumentációjának befejezése
Mikes
A diagramok digitalizálása
Déri
A kész dokumentáció összeszerkesztése
Déri
A tesztelést segítő program tervének elkészítése, és hozzáadása a dokumentációhoz
137 / 141
2009.05.14.
9-10. Napló – Prototípus beadás Dátum
Érintett személyek
Tevékenységek
2009.április 8. Mikes, Déri, Kiosztott feladatok: 20:30 – 21:00 Tündik, Tündik a leadott tesztsorozatokhoz megcsinálja Sóskuthy az egyes tesztesetekhez tartozó pályák grafikus képét, amely alapján Sóskuthy megcsinálja a pályák fájl-beli megvalósítását.
2009.április 9. Tündik 14:30 – 16:00 2009.április 20:30 – 21:30 2009.április 22:30 – 23:00 2009.április 23:30 – 00:45 2009.április 15:30 – 18:00 2009.április
9. Sóskuthy
A tesztesetekhez tartozók *.map fájlok legyártása
9. Sóskuthy
A tesztesetekhez tartozók *.map fájlokban lévő hiba javítása A tesztesetekhez tartozó beviteli parancsfájlok(*.pro) legyártása a leadott dokumentációból A loggolást végző Logger osztály megírása, és tesztelése A controller egység megírása, a fájlból való
9. Tündik 12. Mikes 13. Déri
12:00 – 19:00 2009.április 14. Déri 16:30 – 19:45 2009.április 14. Mikes 17:00 – 20:00
2009.április
Mikes megírja a loggolást végző osztályt és a Timer osztályt, valamint folyamatosan ellenőrzi Déri munkáját a Controller osztályon Déri megírja a parancsok fájlból való feldolgozását, valamint a billentyű parancsok feldolgozását. A tesztesetekhez tartozó pályák grafikus nézetének legyártása
14. Tündik
18:00 – 19:00 2009.április 15. Mikes, Déri 18:00 – 06:45
mike_lefeautt (22.)
parancsbeolvasás kész A billentyűzetből való beolvasás kész A Timer osztály megírása, és felhasználása a bomba és a Smell időbeli változásának leprogramozásához. Mozgási logika megírása a Kefír, az Amoeba osztályokhoz, valamint a bomba robbanásának tesztelése. A tesztelési kimenetek kigyűjtése a leadott dokumentációból A tesztesetek lefuttatása és az esetleges hibák javítása, dokumentálása
138 / 141
2009.05.14.
2009.április 21:00 – 21:30 2009.április 09:30 – 10:30 2009.április 11:00 – 13:30 2009.április 13:30 – 13:50
14. Tündik
16. Mikes
A beadandó fájllista dokumentációsablonjának előkészítése A programkimenet és a specifikált kimenet összehasonlítását végző program megírása, és tesztelése Dokumentáció összeillesztése
16. Déri
Feltöltendő dokumentumok összeállítása és feltöltése
16. Déri
11. Napló – Grafikus felület specifikációja Dátum 2009.április 20. 12:00 – 12:30
2009.április 20. 14:00 – 15:00 2009.április 20. 14:00 – 22:15 2009.április 20. 15:00 – 21:30
Érintett személyek Mikes, Déri, Tündik
Tündik Déri Mikes
Tevékenységek Kiosztott feladatok: Tündik elkészíti a grafikus felület tervezett képét, és összegyűjti a megvalósításához szükséges eszközöket, fogalmakat Déri elkészíti az osztály diagramot, és a hozzá tartozó dokumentációt Mikes elkészíti a megjelenítéshez tartozó szekvencia diagramokat. A grafikus felület tervezett képének megrajzolása, és leadása dokumentálásra. Az osztálydiagram megtervezése Mikessel. Közben dokumentáció folyamatos vezetése. A megtervezett grafikus felület és a megtervezett osztálydiagram alapján a szekvencia diagramok elkészítése.
13. Napló – Grafikus változat beadása Dátum 2009.április 27. 12:00 – 12:30
mike_lefeautt (22.)
Érintett személyek Mikes, Déri, Tündik, Sóskuthy
Tevékenységek Kiosztott feladatok: Tündik elkészíti a végleges pályákat reprezentáló .map fájlokat Déri elkészíti a játék során felhasznált grafikus képeket Mikes és Déri elkészíti a grafikus változatot, és a felmerülő hibákat kijavítja
139 / 141
2009.05.14.
2009.április 29. 14:00 – 16:00 2009.április 30. 12:00 – 03:30 2009.április 30. 15:00 – 16:30 2009.május 4. 14:00 – 14:45 2009.május 4. 18:00 – 21:30 2009.május 6. 18:00 – 18:30 2009.május 6. 16:00 – 02:30 2009.május 7. 10:00 – 12:30
mike_lefeautt (22.)
Tündik
Sóskuthy teszteli teljes körűen a készhez közeli programot, és feljegyzi a tapasztalt hibákat, skálázási tanácsokat készít A pályákat tartalmazó fájlok leadása
Déri
A grafikus változat elkészítése, a játék játszható, és végigvihető. A játék során felmerült hibák feljegyzése A grafikus elemek elkészítése és leadása
Déri
A villódzás kijavítása a játékban.
Sóskuthy
A program tesztelése, a javítási/skálázási tanácsok leadása A pályák szerkezetének finomítása, nehezítése
Mikes
Tündik Mikes Déri
Sóskuthy által leadott hibák kijavítása és a javaslatai alapján a játékélmény növelése A programfájlok kommentezettségének ellenőrzése, és szükség esetén pótlása
140 / 141
2009.05.14.