Júz Kéz The Game. 22 Mike Lefeautt

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Júz Kéz The Game. 22 Mike Lefeautt"

Átírás

1 Júz Kéz The Game 22 Mike Lefeautt Konzulens: Szigeti Szabolcs Csapattagok Mikes Péter SXK8B7 Déri András RK2PNE Tündik Máté Ákos YRB9LC Sóskuthy Zalán MKZQ9T május 14.

2 Tartalomjegyzék 2. Követelmény, projekt, funkcionalitás Követelmény definíció A program célja, alapvető feladata A fejlesztőkörnyezet A futtatáshoz szükséges környezet A felhasználói felület Minőségi tényezők A szoftver minősítése A kibocsátás Projekt terv A fejlesztői csapat Életciklus modell Szervezési struktúra Fejlesztési ütemterv Határidők Szükséges dokumentációk Kibővített feladatleírás Szótár Essential use-case-ek és diagramjuk Diagramok Use-case-ek leírása: Analízis modell Osztályok és interfészek katalógusa Level osztály Field osztály FieldItem osztály Explodeable interfész Bomb osztály Indian osztály Kefir osztály Amoeba osztály Moveable interfész Direction osztály Rock osztály Diamond osztály Land osztály Gravitable interfész Wall osztály Blank osztály Granite osztály Exit osztály Smell osztály Osztályok leírása Field FieldItem Direction Level Rock Diamond Land Wall Blank Granite mike_lefeautt (22.) 1 /

3 Amoeba Kefir Indian Bomb Exit Smell Moveable Gravitable Explodable Kibővített use-case diagram Statikus struktúra diagram Szekvencia diagramok Állapot diagramok Szkeleton tervezése A szkeleton model valóságos use-case-ei A skeleton valóságos use-case diagramja: A skeleton valóságos use-case-einek leírása Architektúra A szkeleton kezelői felületének terve, dialógusok 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 Szekvencia diagram a kiássa a földet use casehez Szekvencia diagram a gyémántot gyűjt use casehez Szekvencia diagram a sziklát tol use casehez Szekvencia diagram a bombát élesít use casehez Szekvencia diagram a Kefir öl use casehez Skeleton beadása A skeleton fordítása és futtatása Indítás a batch file-al Indítás DOS parancssorból A mellékelt zip állomány tartalma: A skeleton használata: Pálya felépítése (levezetés egy konkrét példán keresztül) Értékelés Prototípus koncepciója Változtatások a követelmények módosulása miatt Prototípus interface definíció Pálya leíró fileformátum Proto bemenet fileformátum Proto kimenet fileformátum Összes részletes use-case Tesztelési terv A bemeneten előforduló hibák kezelése A tesztelés menete A szükséges tesztforgatókönyvek Tesztelést támogató segéd- és fordító programok specifikálása Részletes tervek Változtatások az analízis modellben Objektumok és metódusok tervei. (State chartok és Activity diagramok) ActionKeyListener osztály Amoeba osztály Blank osztály Bomb osztály mike_lefeautt (22.) 2 /

4 CommandProcessor osztály Diamond osztály Direction osztály Exit osztály Field osztály FieldItem osztály Game osztály Granite osztály Gravitable interfész Indian osztály Kefir osztály Land osztály Moveable interfész Rock osztály Smell osztály Wall osztály Level osztály A tesztek részletes tervei, leírásuk a teszt nyelvén A tesztelést támogató programok tervei Prototípus - beadás A prototípus fordítása és futtatása Indítás a batch file-al A mellékelt állomány tartalma A játékprogram (src mappa) fájllistája: A játékprogram kimenetét ellenőrző program fájllistája: A játékprogram térképeit tartalmazó maps mappa fájllistája: A játékprogram parancsfájljait tartalmazó test mappa fájllistája: A játékprogram kimenetét tartalmazó out mappa fájllistája: A tesztelés egy példánya Teszt pálya példa Bemeneti tesztparancsfájl példa Teszt kimenet példa A tesztelés eredményeinek összefoglalása Értékelés Grafikus felület specifikálása A menürendszer, a kezelői felület grafikus képe A felület működési elve, a grafikus rendszer architektúrája Grafikus objektumok GraphicsController Cave InfoPanel Grafikus osztályok részletes tervei Cave osztály GraphicsController osztály InfoPanel osztály Loading osztály WinnerScreen osztály TimerTask osztály Szekvencia diagram Grafikus változat beadása A letölthető program fordításával és futtatásával kapcsolatos útmutatás Indítás batch fájllal A mellékelt állomány tartalma A játékprogram fájllistája: mike_lefeautt (22.) 3 /

5 14. A projekt értékelése Összesített értékelés Naplók Napló Követelmény, projekt, funkcionalitás Napló Analízis modell Napló Szkeleton tervezése Napló Szkeleton beadása Napló Prototípus koncepciója Napló Részletes tervek Napló Prototípus beadás Napló Grafikus felület specifikációja Napló Grafikus változat beadása mike_lefeautt (22.) 4 /

6 2. Követelmény, projekt, funkcionalitás 2.1 Követelmény definíció 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ó 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 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 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 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 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 /

7 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 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 A fejlesztői csapat CSAPATTAG NEVE Mikes Péter Tündik Máté Ákos Déri András Sóskuthy Zalán FELADATKÖRE 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 É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 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 /

8 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 -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 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 Határidők Febr. 13. Febr. 19. Febr. 26. Márc. 5. Márc. 12. Márc. 19. Márc. 26. Ápr. 2. Ápr. 16. Ápr. 23. Máj. 7. Máj. 14. 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 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 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 /

9 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 /

10 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 a kincskereső indián, a játék egyik főszereplője Júz Láb a kincskereső indián, a játék másik főszereplője Gyémánt 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, Barlang emellett többféle terepelemnek ad teret, pl. a már említett Gyémántnak, emellett gránitnak, sziklának, földnek Gránit olyan terepelem, mely mozdíthatatlan, azonban robbantás után át lehet haladni helyén Fal a Barlang-ot (játékteret) veszi körül, mozdíthatatlan és megsemmisíthetetlen terepelem Szikla 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., Kiásható föld mely annyit tesz, hogy az ilyen típusú mezőre lépve üres területté válik Üres terület 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 Mező a barlangot felépítő elemek, mezőn állhat szikla, gyémánt, szörny, stb felveszi Júz Kéz begyűjti, felveszi a gyémántot, ekkor a gyémánt helyén üres terület lesz Begyűjtött 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 /

11 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 megjelentek, bónuszokat nem számítjuk bele.), hisz csak ebben az esetben teljesíthető a pálya, ekkor jelenik meg a kijárat Odébb tolni Júz Kéz képes a sziklát a pálya üres mezőjére mozgatni, odébb tolni Halál 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ő Zuhanó(!) szikla 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 Zuhanó gyémántokra 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! Kupacban omlanak le a zuhanó sziklák és a gyémántok is, melynek előzményeként egymáson legördülnek Legördülés 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ószer lyukfúrása 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 Szörny-pusztítása robbanószerrel és sziklával lehetséges, annak halálát okozza Lehelyezés a robbanószert a megfelelő helyre lehelyezve Kefírt ölhetünk, illetve gránitot robbanthatunk Szörny 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 Amőba 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 Kefír ü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 Gyémánttá változik kefírre igaz, ha zuhanó szikla pusztítja el Kijárat 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 /

12 Időtúllépés Oldalsó támasz 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. Nem üres mező, amely meggátolja, hogy meginduljon a gördülés 2.5 Essential use-case-ek és diagramjuk Diagramok 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 /

13 3. Analízis modell 3.1 Osztályok és interfészek katalógusa 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 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 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 Explodeable interfész Ez az az interfész, amelyet azok az osztályok implementálnak, amelyek bomba hatására felrobbanak, megsemmisülnek 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 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 /

14 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 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 Moveable interfész Ez az az interfész, amelyet a mozgásra képes objektumok implementálnak 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 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 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 Land osztály Ez az osztály reprezentálja az indián által kiásandó Földet. Ha robbanó bomba mellett van, ő is felrobban 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 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 Blank osztály Ez az osztály reprezentálja azokat a mezőelemeket, amelyek üresek, teljesen átjárhatóak. mike_lefeautt (22.) 13 /

15 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 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é 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 /

16 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 /

17 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 setfield Beállítja az adott, FieldItem típusú mezőt. Absztrakt függvény. 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 /

18 Indian jk Indian jl static Exit e static Game g List amobas List gravitables List kefirs Relációk nincs Változók int nrofdiamonds E változóban tároljuk a pályán lévő, 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. Szolgáltatások Level(int, Game) Létrehozza a mezők hálóját és felhelyezi a mezőelemeket is. static void incrementnumberofdiamond() Növeljük a pályán található 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 /

19 adja vissza. static int getnumoflevel() Az adott pálya azonosítóját adja vissza. int gettime() Az adott időt adja vissza másodpercben int getjkbombnumb() Visszaadja Júz Kéz lerakható bombáinak számát. int getjlbombnumb() Visszaadja Júz Kéz lerakható bombáinak számát. 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 boolean isfalling Az esés állapotát tárolja Szolgáltatások 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 tér vissza, egyébként hamissal. boolean move(direction) Tolás esetén eza függvénye hívódik meg, boolean catchmoverequest Igazat ad vissza, ha az adott, szikla (int, FieldItem) 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) Az isfalling változó értékét változtathatjuk vele. mike_lefeautt (22.) 18 /

20 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 Szolgáltatások 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 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 void explode() Ha a bombarobbanás hatósugarában van, üres mezőre vált. boolean catchmoverequest(int,fielditem) Igazat ad vissza, ha az adott, föld típusú mezőre lépés mike_lefeautt (22.) 19 /

21 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 Igazat ad vissza, ha az adott, fal típusú (int,fielditem) 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 az adott üres mezőt. 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 initsmell() Ezzel szagosítjuk az adott mezőt. mike_lefeautt (22.) 20 /

22 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 void explode() Ha a bombarobbanás hatósugarában van, üres mezőre vált. 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 az adott gránit mezejét. Amoeba Alaposztály Alive Példányok száma [0..N] Konkurencia Passzív Komponensek Field f Változók LinkedList l A terjeszkedés random irányát tároljuk benne. Szolgáltatások 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 Igazat ad vissza, ha az adott, (int,fielditem) Amoeba típusú mezőre lépés sikeresen végbement. Kefir Alaposztály Alive mike_lefeautt (22.) 21 /

23 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. Szolgáltatások void explode() Kefír meghal, helyére gyémánt kerül. boolean move(int) Igazzal tér vissza, ha megtörtént Kefír mozgása a megadott irányba. 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 /

24 Indian Alaposztály Moveable Explodeable Példányok száma 1 Konkurencia Passzív Perzisztencia Dinamikus Komponensek List<Bomb> 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 Júz Kéz bombakészletéből int getactualdirection() Beállíthatjuk, hogy merre nézzen az indián boolean catchmoverequest Igazat ad vissza, ha az adott, indián (int,fielditem) típusú mezőre lépés sikeresen végbement. void addbomb() Egyel megnöveli a felhasználható 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 Bomb Alaposztály FieldItem mike_lefeautt (22.) 23 /

25 Példányok száma Konkurencia Perzisztencia Komponensek Field Relációk Változók Timer boolean Szolgáltatások Explodeable [0..N] Aktív dinamikus f nincs timer isactivated void explode() Robban a bomba. void startticking() A bomba lehelyezésekor boolean beindul egy visszaszámláló mechanizmus, 2 másodperc után robbanás. 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 setfield(field) Beállítja azon mező adottságait, melyre a Bomba került. mike_lefeautt (22.) 24 /

26 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 boolean islocked Igaz, ha zárva van az Exit objektum, azaz nem tudunk rálépni. Szolgáltatások 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 az Exit kapu mezejét. 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 a kapu statusza mike_lefeautt (22.) 25 /

27 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 boolean state Igaz, ha szagos a mező. Szolgáltatások boolean getstate() Visszaadja State értékét. void setstate(boolean) Beallíto metodus a szag ertekenek beallítasara. void startsmell() Ezzel szagosíthatjuk az adott mezőt Moveable Alaposztály Nincs Konkurencia Passzív Perzisztencia dinamikus Változók nincs Szolgáltatások boolean move(int) Igazzal tér vissza, ha megtörtént a mozgás. Gravitable Alaposztály Nincs Példányok száma 0 Konkurencia Passzív Perzisztencia dinamikus Változók nincs Szolgáltatások void fall() Kő és gyémánt zuhanásakor hívódik meg. Explodable Alaposztály nincs Példányok száma 0 mike_lefeautt (22.) 26 /

28 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 Kibővített use-case diagram mike_lefeautt (22.) 27 /

29 mike_lefeautt (22.) 28 /

30 3.4. Statikus struktúra diagram mike_lefeautt (22.) 29 /

31 3.5 Szekvencia diagramok mike_lefeautt (22.) 30 /

32 mike_lefeautt (22.) 31 /

33 mike_lefeautt (22.) 32 /

34 mike_lefeautt (22.) 33 /

35 mike_lefeautt (22.) 34 /

36 mike_lefeautt (22.) 35 /

37 mike_lefeautt (22.) 36 /

38 mike_lefeautt (22.) 37 /

39 mike_lefeautt (22.) 38 /

40 mike_lefeautt (22.) 39 /

41 mike_lefeautt (22.) 40 /

42 3.6 Állapot diagramok mike_lefeautt (22.) 41 /

43 5. Szkeleton tervezése 5.1. A szkeleton model valóságos use-case-ei A skeleton valóságos use-case diagramja: 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 /

44 USE CASE ACTOR LEÍRÁS gyémántot gyűjt játékos 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 Architektúra mike_lefeautt (22.) 43 /

45 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. Utolsó lehetőségként még lefelé is tud lépni,a föld típusú mezőre. Bomba gránit szikla üres exit mike_lefeautt (22.) 44 /

46 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 /

47 5.teszteset Jelmagyarázat: 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 /

48 7.teszteset Jelmagyarázat: 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 /

49 10.teszteset Jelmagyarázat: 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 Az amőba mozgását vizsgáljuk.szaporodni képes,ez azt jelenti,hogy a föld és az üres típusú mezők helyén meg fog jelenni,a pálya többi Szag Bomba 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 /

50 12.teszteset Jelmagyarázat: 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 /

51 14.teszteset Jelmagyarázat: 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 /

52 16.teszteset Jelmagyarázat: 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 /

53 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 /

54 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 /

55 Szekvencia diagram a kiássa a földet use casehez mike_lefeautt (22.) 54 /

56 Szekvencia diagram a gyémántot gyűjt use casehez Szekvencia diagram a sziklát tol use casehez mike_lefeautt (22.) 55 /

57 Szekvencia diagram a bombát élesít use casehez Szekvencia diagram a Kefir öl use casehez mike_lefeautt (22.) 56 /

58 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 A skeleton fordítása és futtatása 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 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 /

59 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: :12 <DIR> :59 <DIR> javadoc :12 <DIR> :00 33 doc.bat :39 34 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 : txt : txt : txt : txt : txt : txt : txt : txt : txt : txt : txt : txt : txt : txt : output.txt : txt mike_lefeautt (22.) 58 /

60 : txt : txt 43 fájl bájt \javadoc tartalma: :59 <DIR> :59 <DIR> resources :57 2 package-list :59 <DIR> index-files :59 <DIR> class-use :59 <DIR> : stylesheet.css : Bomb.html : Blank.html : constant-values.html : Dead.html : deprecated-list.html : Diamond.html : Direction.html : Exit.html : Explodeable.html : Field.html : FieldItem.html : Game.html : Granite.html : Amoeba.html : help-doc.html : allclasses-noframe.html : index.html : JuzKez.html : Kefir.html : Land.html : Level.html : Monster.html : Moveable.html : overview-tree.html : package-frame.html : allclasses-frame.html : package-summary.html : package-tree.html : package-use.html : Alive.html : Rock.html : Smell.html : Gravitable.html : Wall.html 36 fájl bájt \javadoc\class-use tartalma: :59 <DIR> :59 <DIR> : Alive.html : Amoeba.html mike_lefeautt (22.) 59 /

61 : Blank.html : Bomb.html : Dead.html : Diamond.html : Direction.html : Exit.html : Explodeable.html : Field.html : FieldItem.html : Game.html : Granite.html : Gravitable.html : JuzKez.html : Kefir.html : Land.html : Level.html : Monster.html : Moveable.html : Rock.html : Smell.html : Wall.html 23 fájl bájt \javadoc\index-files tartalma: :59 <DIR> :59 <DIR> : index-1.html : index-10.html : index-11.html : index-12.html : index-13.html : index-14.html : index-15.html : index-16.html : index-17.html : index-18.html : index-19.html : index-2.html : index-3.html : index-4.html : index-5.html : index-6.html : index-7.html : index-8.html : index-9.html 19 fájl bájt C:\src\javadoc\resources tartalma: :59 <DIR> :59 <DIR> :57 57 inherit.gif 1 fájl 57 bájt A Game.java a skeleton főosztálya, ez vezérli a tesztelést. mike_lefeautt (22.) 60 /

62 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 /

63 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: 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) 4 /* A.txt első sora adja meg,hogy a pálya hány sorból áll.*/ 5 /* A 2. sorban megadjuk, hogy a pálya hány oszlopból áll.*/ wwwww /* Ezek után feltöltjük a pályát FieldItemekkel, melynek */ wjbgw /* darabszáma sor*oszlop,jelen esetben 4*5=20 lesz. */ wlllw /*Egy betű egy rekeszt jelöl. Pl. ezen a pályán látható, hogy */ wwwww /*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). Ismertetjük a FieldItemek jelölésrendszerét! w fal g gránit a Amőba j Júz Kéz r szikla d Gyémánt l föld n üres s Szag B bomba e exit a Amőba k Kefír mike_lefeautt (22.) 62 /

64 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 /

65 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 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 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 /

66 7.1. Prototípus interface definíció 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> <oszlopok száma> //csak mankó, a fájlban nem szerepelnek!! 0 w # w # w # 1 # b # g # b 2 w # j # b # 3 # r # B # l 4 w # l # d # 5 # l # d # l Egy szemléletes példa arra, hogyan gondoltuk a tárolást: mike_lefeautt (22.) 65 /

67 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) Proto bemenet fileformátum /* multi line comment */ // one line comment StartGame jk_move <irany> jl_move <irany> jk_nop jl_nop jk_bomb_plant jl_bomb_plant // Új játék indítása // Júz Kéz mozgatása a megadott irányba // Júz Láb mozgatása a megadott irányba // az adott ütemre Júz Kéz nem lép semmit // az adott ütemre Júz Láb nem lép semmit // Júz Kéz bombát helyez le // Júz Láb bombát helyez le mike_lefeautt (22.) 66 /

68 jk_looking <irány> //beállítja, hogy merre nézzen Júz Kéz jl_looking <irány> //beállítja, hogy merre nézzen Júz Láb restartlevel // Adott pálya újrakezdése exit // kilépés a programból 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: <command> //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 <level> // szintlépés Event Load <filename> // file betöltése // a felszedendő gyémántok száma 1-el csökkent Event DiamondOnMap-1 remaining: <remainingdiamonds> Event MoveRequest <direction><actor> // mozgás kérése az adott irányba Event MoveSuccess <direction><actor> //az actor mozgása sikeres volt Event MoveFail <direction><actor> //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 <fielditem> was found in <direction> direction Event KefirKilled <actor> //Kefir megölte valamelyik főhőst Event KefirMoved <direction> //Kefir adott irányba mozgott Event AmoebaMultiplied //Amőba terjeszkedett Event <fielditem> Fall //szikla vagy gyémánt zuhanik mike_lefeautt (22.) 67 /

69 Event <fielditem> Exploded //adott mezőelem felrobbant Event LookingDirectionChanged <irány> <actor> //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 <fielditem> rolled down in direction <direction> A paraméterek magyarázata: <command>: a szintaktikailag hibás parancs <level>: a pálya sorszáma, amelyre lépünk <filename>: a file neve, amelyet nem tudott betölteni a prog. Pl: 1.txt <direction>: irány, számmal kifejezve (0..5); megfeleltetése alább látható <actor>: JúzKéz vagy JúzLáb lehet <remainingdiamonds>: a még összegyűjtendő gyémántok száma <fielditem>: 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 /

70 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 /

71 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 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 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 /

72 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 /

73 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 Objektumok és metódusok tervei. (State chartok és Activity diagramok) 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 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 /

74 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 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 /

75 Bomb osztály Ez az osztály reprezentálja a robbanószert, amelyet Júz Kéz/Láb lehelyezhet, visszaszámlálását elindíthatja, majd adott idő leteltével felrobban. 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 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 /

76 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 parancsokhoz tartozó függvényhívásokat. Ez a motorja a játék irányításának. void reset() Ha végrehajtottuk a parancsokat és új kör jön, akkor előtte töröljük az előző parancsokat 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 /

77 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 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; 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 /

78 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 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 /

79 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 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 Game osztály A Game osztály a játékunk belépési pontja. mike_lefeautt (22.) 78 /

80 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 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 /

81 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 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 /

82 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 /

83 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 /

84 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 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 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 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 /

85 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 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 /

86 E függvény segítségével állíthatjuk be egy, hogy egy mező szagosságát a paraméterben megadottra 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 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 /

87 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 /

88 A tolás aktivitás diagramja A gördülés aktivitás diagramja mike_lefeautt (22.) 87 /

89 Az Indiánok gyémántfelvételének aktivitás diagramja Kefir mozgásának aktivitás diagramja mike_lefeautt (22.) 88 /

90 Az esés aktivitás diagramja mike_lefeautt (22.) 89 /

91 Amőba növekedésének aktivitás diagramja Inicializálás állapotdiagramja mike_lefeautt (22.) 90 /

92 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* jobbra lefelé ásás helyett lefelé ásás jön, mert falnak ütköztünk. */ jl_nop jk_move <3> jl_nop jk_move <3> /* felvettük a gyémántot */ jl_nop exit /* 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 <Land> 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 <direction><actor> sikertelen volt Event MoveRequest <3> <JuzKez> irányba Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event MoveRequest <3> <JuzKez> irányba Event <Diamond> was found in <3> direction // 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 mike_lefeautt (22.) 91 /

93 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 /* Pálya betöltése */ jk_move <4> /* Jobbra-lefelé ásás */ jl_nop jk_move <4> /* Jobbra-lefelé ásás */ jl_nop jk_bomb_plant /* The Bomb has been planted! */ jk_move <3> /* Lefelé ásás */ jl_nop jk_looking <0> /* Megfordulunk, hogy lerakjunk előző helyünkre a bombát */ jl_nop jk_move <3> /* Elmenekülünk robbanás elől */ jl_nop /* Felrobban a bomba! */ jk_move <0> /* Felfelé ásás */ jl_nop jk_move <5> /* Gránit helyén állunk itt */ jl_nop exit /* 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 <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Granite> was found in <4> direction Event MoveFail <4><JuzKez> sikertelen volt // 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 mike_lefeautt (22.) 92 /

94 Event MoveRequest <3> <JuzKez> irányba Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event LookingDirectionChanged <0> <JuzKez> Event <Blank> was found in <0> direction Event TheBombHasBeenPlanted Event <Granite> Exploded Event MoveRequest <0> <JuzKez> irányba Event <Blank > was found in <3> direction Event MoveSuccess <0><JuzKez> volr Event MoveRequest <5> <JuzKez> irányba Event <Blank > was found in <3> direction Event MoveSuccess <5><JuzKez> volr Event ExitGame // mozgás kérése az adott //az actor mozgása sikeres //adott mezőelem felrobbant // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása sikeres // 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 /* Pálya betöltése */ jk_move <4> /* Lefelé ásás */ jl_nop jk_move <4> /* A második jobbra lefelé ásásnál lezuhan a szikla a gyémántra */ jl_nop exit /* Kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <3.txt> Event MoveRequest <4> <JuzKez> irányba Event <Land> was found in <4> direction // a játék elkezdése // file betöltése // mozgás kérése az adott mike_lefeautt (22.) 93 /

95 Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Rock> was found in <4> direction Event MoveSuccess <4><JuzKez> sikertelen volt Event <Rock> Fall Event ExitGame //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 mike_lefeautt (22.) 94 /

96 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* A második jobbra lefelé ásás sikertelen,nem mozdulunk el. */ jl_nop exit /* 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 <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> sikeres volt Event MoveRequest <4> <JuzKez> irányba Event <Rock> was found in <4> direction Event MoveFailed <4><JuzKez> sikertelen volt Event ExitGame // 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 mike_lefeautt (22.) 95 /

97 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* 2. jobbra lefelé ásás, Júz Kéz felett szikla van. */ jl_nop jk_move <1> /* balra felfelé lépés, zuhanás bekövetkezik */ jl_nop exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <5.txt> Event MoveRequest <4> <JuzKez> irányba Event <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Rock> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event <Rock> was found in <0> direction Event MoveRequest <1> <JuzKez> irányba Event <Blank> was found in <1> direction Event MoveSuccess <1><JuzKez> volt Event <Rock> Fall Event ExitGame // 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 sikeres // mozgás kérése az adott //az actor mozgása sikeres //szikla zuhan // kilépés a játékból mike_lefeautt (22.) 96 /

98 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* 2. jobbra lefelé ásásnál lezuhan a szikla */ jl_nop jk_nop /* A szikla esésének idején Júz Kéz és Júz Láb sem csinál semmit */ jl_nop /* Két ütemet várnak */ jk_nop jl_nop exit /* 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 <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Rock> was found in <4> direction Event MoveSuccess <4><JuzKez> sikertelen volt Event <Rock> Fall Event <Kefir> Exploded Event ExitGame // 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 mike_lefeautt (22.) 97 /

99 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <3> Kézre. */ jl_nop jk_nop */ /* 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 jl_nop exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <7.txt> Event MoveRequest <4> <JuzKez> irányba Event <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Rock> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event <Rock> was found in <0> direction Event MoveRequest <3> <JuzKez> irányba Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event <Rock> Fall Event <JuzKez> Exploded Event ExitGame // 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 sikeres // mozgás kérése az adott //az actor mozgása sikeres //szikla zuhan //Júz Kéz meghalt. // kilépés a játékból mike_lefeautt (22.) 98 /

100 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 /* Pálya betöltése */ jk_move <4> /* Jobbra lefelé ásás */ jl_nop jk_move <4> /* Jobbra lefelé ásás */ jl_nop jk_looking <0> /* A leendő bomba helye felé fordulás */ jl_nop jk_bomb_plant /* The Bomb has been planted! */ jk_move <4> /* Menne tovább jobbra lefelé,de fal van mellette. */ jl_nop /* Felrobban a bomba, Júz Kéz és a gránit felrobban! */ jk_nop /* A bomba robbanását megvárjuk */ jl_nop exit /* 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 <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Land> was found in <4> direction Event MoveFail <direction><actor> sikertelen volt Event LookingDirectionChanged <0> <JuzKez> Event <Blank> 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 <Granite> Exploded // 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. mike_lefeautt (22.) 99 /

101 Event <JuzKez> Exploded Event ExitGame //Júz Kéz meghalt. // kilépés a játékból mike_lefeautt (22.) 100 /

102 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 /* pálya betöltése */ jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <4> /* jobbra lefelé ásás */ jl_nop jk_move <1> /* Júz Kéz ellép a gyémánt alól, lezuhan a mélybe, majd jl_nop legördül */ /* a 2. kiásott föld tartotta a gyémántot. Majd Júz Kéz feje. */ jk_nop jl_nop /* A gördülésnek és zuhanásnak hagyunk időt */ jk_nop jl_nop exit /* 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 <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> volt Event MoveRequest <4> <JuzKez> irányba Event <Land> was found in <4> direction Event MoveSuccess <direction><actor> sikertelen volt Event <Diamond> was found in <0> direction Event MoveRequest <1> <JuzKez> irányba Event <Blank> was found in <1> direction Event MoveSuccess <1><JuzKez> volt Event <Diamond> Fall Event <Diamond>rolled down in direction <4> Event ExitGame // 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 mike_lefeautt (22.) 101 /

103 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 /* pálya betöltése */ jk_nop jl_nop jk_nop jl_nop /* 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 <Amoba> was found in <0> direction Event MoveFail <0><JuzKez> sikertelen volt Event MoveRequest <1><JuzKez> irányba Event <Amoba> was found in <1> direction Event MoveFail <1><JuzKez> sikertelen volt Event MoveRequest <2><JuzKez> irányba Event <Amoba> was found in <2> direction Event MoveFail <2><JuzKez> sikertelen volt Event MoveRequest <3><JuzKez> irányba Event <Amoba> was found in <3> direction Event MoveFail <3><JuzKez> sikertelen volt Event MoveRequest <4><JuzKez> irányba Event <Amoba> was found in <4> direction // 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 //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 // mozgás kérése az adott //az actor mozgása // mozgás kérése az adott mike_lefeautt (22.) 102 /

104 Event MoveFail <4><JuzKez> sikertelen volt Event MoveRequest <5><JuzKez> irányba Event <Amoba> was found in <5> direction Event MoveFail <5><JuzKez> sikertelen volt Event MoveRequest <6><JuzKez> irányba Event <Amoba> was found in <6> direction Event MoveFail <6><JuzKez> sikertelen volt Event ExitGame //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 mike_lefeautt (22.) 103 /

105 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 /* The Bomb has been planted! */ jk_move <3> /* 2x lefelé ásás */ jl_nop jk_move <3> jl_nop /* felrobban a bomba! */ exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <11.txt> Event LookingDirectionChanged <0> <JuzKez> Event TheBombHasBeenPlanted Event MoveRequest <3> <JuzKez> irányba Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event MoveRequest <3> <JuzKez> irányba Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> volt Event <Kefir> Exploded Event ExitGame // 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 sikeres //Kefír felrobbant // kilépés a játékból mike_lefeautt (22.) 104 /

106 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 /* pálya betöltése */ jk_bomb_plant /* The Bomb has been planted! */ jl_nop jk_move <5> /* 2x jobbra felfelé ásás */ jl_nop jk_move <5> jl_nop /* felrobban a bomba! */ jk_move <5> /* jobbra felfelé lépéssel új pályára lépés */ exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <12.txt> Event AmoebaMultiplied Event <Amoba> was found in <2> direction Event TheBombHasBeenPlanted Event MoveRequest <5> <JuzKez> irányba Event <Land> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event MoveRequest <5> <JuzKez> irányba Event <Land> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event MoveRequest <5> <JuzKez> irányba Event <Exit> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event NextLevel <13> Event ExitGame // a játék elkezdése // file betöltése //Amőba terjeszkedett // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása sikeres // mozgás kérése az adott //az actor mozgása sikeres // szintlépés // kilépés a játékból mike_lefeautt (22.) 105 /

107 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 /* pálya betöltése */ jk_move <5> jl_nop jk_nop jl_nop jk_nop jl_nop exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <13.txt> Event <Diamond> was found in <0> direction Event MoveRequest <5> <JuzKez> irányba Event <Land> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event <Diamond> Fall Event <Kefir> Exploded Event CheatLevelStep( feature ) Event ExitGame // 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 mike_lefeautt (22.) 106 /

108 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 StartGame Event Load <14.txt> Event MoveRequest <5> <JuzKez> irányba Event <Diamond> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event DiamondOnMap-1 remaining: <0> Event ExitAppeared Event MoveRequest <5> <JuzKez> irányba Event <Exit> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event NextLevel <15> Event ExitGame // a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres //a kijárat megnyílik // mozgás kérése az adott //az actor mozgása sikeres // szintlépés // kilépés a játékból mike_lefeautt (22.) 107 /

109 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 /* pálya betöltése */ jk_move <0> jl_nop jk_move <5> jl_nop jk_nop jl_nop jk_nop jl_nop exit /* kilépés a pályáról */ A kimeneti tesztfájl: Event StartGame Event Load <15.txt> Event <Rock> was found in <0> direction Event MoveRequest <5> <JuzKez> irányba Event <Diamond> was found in <5> direction Event MoveSuccess <5><JuzKez> volt Event <Rock> Fall Event <Kefir> Exploded Event ExitGame // a játék elkezdése // file betöltése // mozgás kérése az adott //az actor mozgása sikeres //szikla zuhan //Kefir elpusztul. // kilépés a játékból mike_lefeautt (22.) 108 /

110 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 /* pálya betöltése */ jk_move <3> /* lefelé lépés próbálkozása */ jl_nop jk_nop /* Vesztére nem mozdul Júz Kéz, mert így beéri Kefír */ jl_nop exit /* 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 <Granite> was found in <3> direction Event MoveFail <3><JuzKez> sikertelen volt Event <JuzKez> Exploded Event KefirKilled <JuzKez> Event ExitGame // 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 mike_lefeautt (22.) 109 /

111 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 /

112 9. Prototípus - beadás 9.1. A prototípus fordítása és futtatása 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<teszteset>.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 /

113 9.2. A mellékelt állomány tartalma 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 : ActionKeylistener.java : Amoeba.java : Blank.java : Bomb.java : CommandProcessor.java : Diamond.java : Direction.java : Exit.java : Explodeable.java : Field.java : FieldItem.java : Game.java : Granite.java : Gravitable.java : Indian.java : Kefir.java : Land.java : Level.java : Logger.java : Moveable.java : Rock.java : Smell.java : TimerTask.java : Wall.java 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 Fájl mérete Fájl neve : ComparerTool.java mike_lefeautt (22.) 112 /

114 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 : map : map : map : map : map : map : map : map : map : map : map : map : map : map : map : map 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 : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro : pro mike_lefeautt (22.) 113 /

115 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 Fájl mérete Fájl neve : out : out : out : out : out : out : out : out : out : out : out : out : out : out : out : out 9.3. A tesztelés egy példánya 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 /

116 w#w#w #w#w# 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 Teszt kimenet példa Event StartGame Event Load <7.map> Event MoveRequest <4><JuzKez> Event <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> Event MoveRequest <4><JuzKez> Event <Land> was found in <4> direction Event MoveSuccess <4><JuzKez> Event MoveRequest <3><JuzKez> Event <Land> was found in <3> direction Event MoveSuccess <3><JuzKez> Event <Rock> Fall Event <Rock> Fall Event 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 /

117 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 /

118 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 <Land> 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 /

119 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: É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 /

120 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 /

121 11. Grafikus felület specifikálása 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 /

122 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 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 /

123 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 Kirajzolja a teljes játékteret. void update 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 Frissíti az osztály tagváltozóit, majd kirajzolja az új értékeket az ablakra. void update 11.4 Grafikus osztályok részletes tervei 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 /

124 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 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év- Image 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 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 /

125 void update(graphics) 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 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 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 /

126 mike_lefeautt (22.) 125 /

2. Követelmény, projekt, funkcionalitás

2. Követelmény, projekt, funkcionalitás 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.

Részletesebben

2. Követelmény, projekt, funkcionalitás

2. Követelmény, projekt, funkcionalitás 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.

Részletesebben

A követelmények leírása

A követelmények leírása A követelmények leírása Júz Kéz az indián kincskereső barlangokban gyémántra vadászik. Ehhez korlátozott mennyiségű robbanószer és élet áll rendelkezésére. A játékos feladata az indián irányítása, és a

Részletesebben

Kincskereső játék. 78 TeraCorp DT. Bíró Barna. Konzulens:

Kincskereső játék. 78 TeraCorp DT. Bíró Barna. Konzulens: Kincskereső játék 78 TeraCorp DT Konzulens: Bíró Barna Csapattagok: Schmidt Antonio IW3JDL santoni87@hotmail.com Tahi Bálint X0818E tahi.balint@hotmail.com Zsoldos Tamás EBNZZS thomastheronin@msn.com 1.

Részletesebben

Követelmény, projekt, funkcionalitás 41 CSK 1

Követelmény, projekt, funkcionalitás 41 CSK 1 Követelmény, projekt, funkcionalitás 41 CSK 1 konzulens Eredics Péter csapattagok Olasz Ákos G34NIY olaszakos@gmail.com Panyiczky Péter Zoltán T533FJ panyika@gmail.com Lágler Krisztián FYMGQ8 lagler.krisztian@gmail.com

Részletesebben

KINDERGARTEN. 46 InFoka. Dady Róbert. Csapattagok: Konzulens:

KINDERGARTEN. 46 InFoka. Dady Róbert. Csapattagok: Konzulens: KINDERGARTEN 46 InFoka Konzulens: Dady Róbert Csapattagok: Bors Alpár Szabolcs Z0AVHU alpijoe@sch.bme.hu Szegedi Tamás AASWGX szedzsi@sch.bme.hu Tóth Tamás EWYXK4 tommey@freemail.hu 2006. május 15. 2006.

Részletesebben

Szkeleton beadása. 100 Generalis faliora. Csapattagok: Konzulens: Szabó András. 2005. március 29.

Szkeleton beadása. 100 Generalis faliora. Csapattagok: Konzulens: Szabó András. 2005. március 29. Szkeleton beadása 100 Generalis faliora Konzulens: Szabó András Csapattagok: Kenéz Tamás TLSXNP arachnus@tvn.hu Kiss Gergely KNJU43 6er6e1y@gmail.com Papp Gergely L584UF pg554@hszk.bme.hu Rostás Gábor

Részletesebben

2011.11.29. JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

2011.11.29. JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése Tartalom Integrált fejlesztés Java platformon JUnit JUnit használata Tesztelési technikák Demo 2 A specifikáció alapján teszteljük a program egyes részeit, klasszikus V-modell szerint Minden olyan metódust,

Részletesebben

Verkehrsmeldungen am UML

Verkehrsmeldungen am UML Verkehrsmeldungen am UML 27 Led Zeppelin Konzulens: Budai Péter Csapattagok Bodó Péter MKA2DY carter89@freemail.com Pál Tamás UVKSGJ paltamas89@gmail.com Szárnyas Gábor U944EQ szarnyasg@gmail.com 2010-05-13

Részletesebben

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1 Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1 Készítette: Gipsz Jakab Neptun-azonosító: A1B2C3 E-mail: gipszjakab@vilaghalo.hu Kurzuskód: IP-08PAED Gyakorlatvezető

Részletesebben

Space Invaders Dokumenta cio

Space Invaders Dokumenta cio Space Invaders Dokumenta cio 0. Tartalomjegyzék 0. Tartalomjegyzék... 1 1. Követelmény feltárás... 2 1.1. Célkitűzés, projektindító dokumentum... 2 1.2. Szakterületi tartalomjegyzék... 2 1.3. Használatieset-modell,

Részletesebben

ELTE, Informatikai Kar december 12.

ELTE, Informatikai Kar december 12. 1. Mi az objektum? Egy olyan változó, vagy konstans, amely a program tetszőleges pontján felhasználható. Egy olyan típus, amelyet a programozó valósít meg korábbi objektumokra alapozva. Egy olyan változó,

Részletesebben

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1 Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1 Készítette: Gipsz Jakab Neptun-azonosító: ABC123 E-mail: gipszjakab@seholse.hu Kurzuskód: IT-13AAT1EG 1 A fenti

Részletesebben

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás? Bevezetés Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések Forráskód Hibajegyzék p2p.wrox.com xiii xiii xiv xiv xvi xvii xviii

Részletesebben

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport 10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)

Részletesebben

Név: Neptun kód: Pontszám:

Név: Neptun kód: Pontszám: Név: Neptun kód: Pontszám: 1. Melyek a szoftver minőségi mutatói? Fejlesztési idő, architektúra, programozási paradigma. Fejlesztőcsapat összetétele, projekt mérföldkövek, fejlesztési modell. Karbantarthatóság,

Részletesebben

és az instanceof operátor

és az instanceof operátor Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában

Részletesebben

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában

Részletesebben

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

A dokumentáció felépítése A dokumentáció felépítése Készítette: Keszthelyi Zsolt, 2010. szeptember A szoftver dokumentációját az itt megadott szakaszok szerint kell elkészíteni. A szoftvert az Egységesített Eljárás (Unified Process)

Részletesebben

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

KIRA. KIRA rendszer. Telepítési útmutató v1 KIRA rendszer Telepítési útmutató v1 1. Bevezetés A dokumentáció, illetve a dokumentáció mellékleteként megtalálható állományok segítségével készíthető fel a kliens oldali számítógép a KIRA rendszer működtetésére.

Részletesebben

Már megismert fogalmak áttekintése

Már megismert fogalmak áttekintése Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése Eseménykezelési módszerek 2 Már megismert fogalmak

Részletesebben

2. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció 2. Beadandó feladat dokumentáció Készítette: Giachetta Roberto E-mail: groberto@inf.elte.hu Feladat: Készítsünk programot a következő memóriajátékhoz. A játéktáblán mező foglal helyet, amelyek különböző

Részletesebben

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1 OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat Különféle élőlények egy túlélési versenyen vesznek részt. A lények egy pályán haladnak végig, ahol váltakozó terep viszonyok vannak.

Részletesebben

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás.   Szénási Sándor. Eseménykezelés előadás http://nik.uni-obuda.hu/sztf2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar Függvénymutatókkal Származtatással Interfészekkel Egyéb

Részletesebben

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1 Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1 Készítette: Gipsz Jakab Neptun-azonosító: ABC123 E-mail: gipszjakab@seholse.hu Kurzuskód: IT-13AAT1EG Gyakorlatvezető

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java statikus programszerkezet Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 2. előadás csomag könyvtárak könyvtárak forrásfájlok bájtkódok (.java) (.class) primitív osztály

Részletesebben

Szkeleton tervezése. 100 Generalis faliora. Csapattagok: Konzulens: Szabó András. 2005. március 21.

Szkeleton tervezése. 100 Generalis faliora. Csapattagok: Konzulens: Szabó András. 2005. március 21. Szkeleton tervezése 100 Generalis faliora Konzulens: Szabó András Csapattagok: Kenéz Tamás TLSXNP arachnus@tvn.hu Kiss Gergely KNJU43 6er6e1y@gmail.com Papp Gergely L584UF pg554@hszk.bme.hu Rostás Gábor

Részletesebben

Modell alapú tesztelés mobil környezetben

Modell alapú tesztelés mobil környezetben Modell alapú tesztelés mobil környezetben Micskei Zoltán Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék A terület behatárolása Testing is an activity performed

Részletesebben

Szkeleton. 8 datcode. Konzulens: Budai Péter

Szkeleton. 8 datcode. Konzulens: Budai Péter Szkeleton 8 datcode Konzulens: Budai Péter Csapattagok Botos Péter WR3TXC rapgolya@gmail.com Csonka Lóránt QXNTN8 csonkalorant@gmail.com QPGL2R garancsya@gmail.com EJ9PEC b.komaromi22@gmail.com 6. Szkeleton

Részletesebben

Alkalmazások fejlesztése A D O K U M E N T Á C I Ó F E L É P Í T É S E

Alkalmazások fejlesztése A D O K U M E N T Á C I Ó F E L É P Í T É S E Alkalmazások fejlesztése A D O K U M E N T Á C I Ó F E L É P Í T É S E Követelmény A beadandó dokumentációját a Keszthelyi Zsolt honlapján található pdf alapján kell elkészíteni http://people.inf.elte.hu/keszthelyi/alkalmazasok_fejlesztese

Részletesebben

Mesterséges Intelligencia I. kötelező program

Mesterséges Intelligencia I. kötelező program 1. Feladat kiírás Mesterséges Intelligencia I. kötelező program A feladat az Othello (más neveken Reversi, Fonákollós, Színcserélő) játékot játszó ágens írása. A játékot egyik oldalán világos, a másikon

Részletesebben

Interfészek. PPT 2007/2008 tavasz.

Interfészek. PPT 2007/2008 tavasz. Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése 2 Már megismert fogalmak áttekintése Objektumorientált

Részletesebben

Kígyófarm játék. 16 Háztartási Létra. Konzulens: Bóka Gábor

Kígyófarm játék. 16 Háztartási Létra. Konzulens: Bóka Gábor Kígyófarm játék 16 Háztartási Létra Konzulens: Bóka Gábor Csapattagok Bertók Zsófia A6MHQV zso.bme@gmail.com Tönköl Viktor VU6IT6 tonkol@chello.hu Veres-Szentkirályi András YZIOAW veresbandi@spirituart.hu

Részletesebben

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május) Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május) Teszt kérdések 1. Melyik állítás igaz a folytonos integrációval (CI) kapcsolatban? a. Folytonos

Részletesebben

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat 2012. április 13. Például (bemenet/pelda.

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat 2012. április 13. Például (bemenet/pelda. Berezvai Dániel 1. beadandó/4. feladat 2012. április 13. BEDTACI.ELTE Programozás 3ice@3ice.hu 11. csoport Feladat Madarak életének kutatásával foglalkozó szakemberek különböző településen különböző madárfaj

Részletesebben

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22 Unit Teszt Tóth Zsolt Miskolci Egyetem 2013 Tóth Zsolt (Miskolci Egyetem) Unit Teszt 2013 1 / 22 Tartalomjegyzék 1 Bevezetés 2 Unit Teszt 3 Példa Tóth Zsolt (Miskolci Egyetem) Unit Teszt 2013 2 / 22 Szoftvertesztelés

Részletesebben

Java I. A Java programozási nyelv

Java I. A Java programozási nyelv Java I. A Java programozási nyelv története,, alapvető jellemzői Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2007. 02. 12. Java I.: Történet, jellemzők, JDK JAVA1 / 1 Egy kis történelem

Részletesebben

Szoftverminőségbiztosítás

Szoftverminőségbiztosítás NGB_IN003_1 SZE 2014-15/2 (8) Szoftverminőségbiztosítás Szoftvertesztelési folyamat (folyt.) Szoftvertesztelési ráfordítások (Perry 1995) Tesztelésre fordítódik a projekt költségvetés 24%-a a projekt menedzsment

Részletesebben

Objektum elvu alkalmaza sok fejleszte se

Objektum elvu alkalmaza sok fejleszte se Objektum elvu alkalmaza sok fejleszte se 3. beadandó feladat Szerző Név: Budai Martin Neptun-kód: PLAB9E E-mail: budai.martin@outlook.com Kurzuskód: 4 Feladat sorszáma: 2 Feladat Egy bolygón különböző

Részletesebben

Mesterséges Intelligencia II. kötelező feladat (3. forduló) - Ajánló rendszer 2.

Mesterséges Intelligencia II. kötelező feladat (3. forduló) - Ajánló rendszer 2. Mesterséges Intelligencia II. kötelező feladat (3. forduló) - Ajánló rendszer 2. 1. Feladat kiírása A második forduló feladata hasonlóan az előző fordulóhoz egy ajánló rendszer modelljének elkészítése.

Részletesebben

Bánsághi Anna anna.bansaghi@mamikon.net. 2014 Bánsághi Anna 1 of 31

Bánsághi Anna anna.bansaghi@mamikon.net. 2014 Bánsághi Anna 1 of 31 IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 9. ELŐADÁS - OOP TERVEZÉS 2014 Bánsághi Anna 1 of 31 TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív paradigma

Részletesebben

Tamagocsi Projektterv

Tamagocsi Projektterv Tamagocsi Projektterv Csapat: CamelCase { Laczik Sándor János; Szőke Gábor; Vasas Szabolcs; } Évfolyam: PTI MSc II. 2011/2012 1. Összefoglaló A feladat egy PC-n futtatható tamagocsi játék fejlesztése.

Részletesebben

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

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban OpenCL alapú eszközök verifikációja és validációja a gyakorlatban Fekete Tamás 2015. December 3. Szoftver verifikáció és validáció tantárgy Áttekintés Miért és mennyire fontos a megfelelő validáció és

Részletesebben

Szerepjáték Project Story of my life

Szerepjáték Project Story of my life Szerepjáték Project Story of my life Leírás A feladat egy konzol felületű játék elkészítése, amely betekintést kíván adni egy egyetemista életébe. A játék felépítését tekintve szerepjáték, de nem a szokásos

Részletesebben

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben? 1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben? 3. Ismertesse a névtér fogalmát! 4. Mit értünk a "változó hatóköre"

Részletesebben

Analízis modell kidolgozása I.

Analízis modell kidolgozása I. Analízis modell kidolgozása I. 65 Konzulens: Zsolnai Károly Csapattagok Balogh Péter Tamás B6E4VC b4logh.peter@gmail.com Gál István László EKCBOK galpityu@gmail.com Kárász Gábor QHTQ8N raknepseg@gmail.com

Részletesebben

Osztályok. 4. gyakorlat

Osztályok. 4. gyakorlat Osztályok 4. gyakorlat Az osztály fogalma Az objektumok formai leírása, melyek azonos tulajdonsággal és operációkkal rendelkeznek. Osztályból objektum készítését példányosításnak nevezzük. Minden objektum

Részletesebben

Programozás Minta programterv a 1. házi feladathoz 1.

Programozás Minta programterv a 1. házi feladathoz 1. Programozás Minta programterv a 1. házi feladathoz 1. Gregorics Tibor 1. beadandó/0.feladat 2008. december 6. EHACODE.ELTE gt@inf.elte.hu 0.csoport Feladat Egy osztályba n diák jár, akik m darab tantárgyat

Részletesebben

3. Osztályok II. Programozás II

3. Osztályok II. Programozás II 3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt

Részletesebben

Android alapok. Android játékfejlesztés

Android alapok. Android játékfejlesztés Az Android Studio fejlesztőkörnyezet letöltése, telepítése képernyőképekkel bemutatva, illetve az első programunk létrehozása. (Hello World) Android alapok Android játékfejlesztés Készítette: Soós András

Részletesebben

Kalandjáték dokumentáció

Kalandjáték dokumentáció Követelmény feltárás Kalandjáték dokumentáció A program grafikus interfészen keresztül kommunikáljon a felhasználóval. Egyszerű, érthető irányítási funkciók segítsék a játékost. Meg kell teremteni az egyensúlyt

Részletesebben

Algoritmizálás, adatmodellezés tanítása 6. előadás

Algoritmizálás, adatmodellezés tanítása 6. előadás Algoritmizálás, adatmodellezés tanítása 6. előadás Tesztelési módszerek statikus tesztelés kódellenőrzés szintaktikus ellenőrzés szemantikus ellenőrzés dinamikus tesztelés fekete doboz módszerek fehér

Részletesebben

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

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05 Geodéziai Feldolgozó Program A GeoEasy telepítése GeoEasy V2.05 Geodéziai Feldolgozó Program (c)digikom Kft. 1997-2008 Tartalomjegyzék Hardver, szoftver igények GeoEasy telepítése A hardverkulcs Hálózatos hardverkulcs A GeoEasy indítása

Részletesebben

Technikai információk fejlesztőknek

Technikai információk fejlesztőknek Technikai információk fejlesztőknek Különbségek a Java-s nyomtatványkitöltő program és az Abev2006 között 1. A mezőkód kijelzés bekapcsolása a Szerviz/Beállítások ablakban érhető el. 2. Az xml állományok

Részletesebben

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás Objektum orientáltság alapjai Objektum: A való világ egy elemének ábrázolása, amely minden esetben rendelkezik: Állapottal,Viselkedéssel,Identitással

Részletesebben

Delphi programozás I.

Delphi programozás I. Delphi programozás I. Konzol alkalmazások készítése Delphiben A Delphi konzol alkalmazása (console application) olyan 32 bites program, amely nem grafikus felületen, hanem egy szöveges konzol ablakban

Részletesebben

Rendszerterv. Makoviczki András. Neptun: JJ26AR 2012.11.29.

Rendszerterv. Makoviczki András. Neptun: JJ26AR 2012.11.29. Rendszerterv Makoviczki András Neptun: JJ26AR 2012.11.29. Rendszerterv 2. Tartalomjegyzék 1. A program célja... 3 2. A rendszerterv célja... 3 3. A program adatkezelése... 3 3.1. Adatfájlok... 4 4. A program

Részletesebben

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

TERC V.I.P. hardverkulcs regisztráció TERC V.I.P. hardverkulcs regisztráció 2014. második félévétől kezdődően a TERC V.I.P. költségvetés-készítő program hardverkulcsát regisztrálniuk kell a felhasználóknak azon a számítógépen, melyeken futtatni

Részletesebben

Rendszermodellezés: házi feladat bemutatás

Rendszermodellezés: házi feladat bemutatás Rendszermodellezés: házi feladat bemutatás Budapest University of Technology and Economics Fault Tolerant Systems Research Group Budapest University of Technology and Economics Department of Measurement

Részletesebben

Programozás I. gyakorlat

Programozás I. gyakorlat Programozás I. gyakorlat 1. gyakorlat Alapok Eszközök Szövegszerkesztő: Szintaktikai kiemelés Egyszerre több fájl szerkesztése pl.: gedit, mcedit, joe, vi, Notepad++ stb. Fordító: Szöveges file-ban tárolt

Részletesebben

Hardver és szoftver követelmények

Hardver és szoftver követelmények Java-s Nyomtatványkitöltő Program Súgó Telepítési útmutató Hardver és szoftver követelmények A java-s nyomtatványkitöltő program az alábbi hardverigényt támasztja a számítógéppel szemben: 400 MHz órajelű

Részletesebben

Java és web programozás

Java és web programozás Budapesti Műszaki Egyetem 2015. 02. 11. 2. Előadás Mese Néhány programozási módszer: Idők kezdetén való programozás Struktúrált Moduláris Funkcionális Objektum-orientált... Mese Néhány programozási módszer:

Részletesebben

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE Email cím: Név: vp.05@hotmail.com Kurzuskód:

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE Email cím: Név: vp.05@hotmail.com Kurzuskód: Szerző Név: Varga Péter ETR azonosító: VAPQAAI.ELTE Email cím: vp.05@hotmail.com Kurzuskód: IP-08PAEG/27 Gyakorlatvezető neve: Kőhegyi János Feladatsorszám: 20 1 Tartalom Szerző... 1 Felhasználói dokumentáció...

Részletesebben

UML (Unified Modelling Language)

UML (Unified Modelling Language) UML (Unified Modelling Language) UML (+ Object Constraint Language) Az objektum- modellezés egy szabványa (OMG) UML A 80-as, 90-es években egyre inkább terjedő objektum-orientált analízis és tervezés (OOA&D)

Részletesebben

A FileZilla program beállítása az első belépés alkalmával

A FileZilla program beállítása az első belépés alkalmával 6. A záróvizsga-jegyzőkönyv készítése A záróvizsga-jegyzőkönyveketa Karok többsége a jegyzőkönyvkészítésre Dr. Tánczos László által kifejlesztett Access alkalmazás használatával készíti el. A záróvizsga-jegyzőkönyv

Részletesebben

Software Engineering Babeş-Bolyai Tudományegyetem Kolozsvár

Software Engineering Babeş-Bolyai Tudományegyetem Kolozsvár Software Engineering Dr. Barabás László Ismétlés/Kitekintő Ismétlés Software Engineering = softwaretechnológia Projekt, fogalma és jellemzői, személyek és szerepkörök Modell, módszertan Kitekintés Elemzés/

Részletesebben

Egészségterv és edzésprogram használati utasítás

Egészségterv és edzésprogram használati utasítás TELEPÍTÉS (1) Üdvözli a Bi-LINK. Az alkalmazás használatával követheti, megértheti és irányíthatja legfontosabb egészségügyi paramétereit. Az első lépés készüléke adatainak megtekintéséhez, hogy letölti,

Részletesebben

OOP: Java 8.Gy: Abstract osztályok, interfészek

OOP: Java 8.Gy: Abstract osztályok, interfészek OOP: Java 8.Gy: Abstract osztályok, interfészek 26/1 B ITv: MAN 2019.04.03 Abszrakt metódus és absztrakt osztály. Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus

Részletesebben

Modellező eszközök, kódgenerálás

Modellező eszközök, kódgenerálás Modellező eszközök, kódgenerálás Budapesti Műszaki és Gazdaságtudományi Egyetem Hibatűrő Rendszerek Kutatócsoport Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek

Részletesebben

01. gyakorlat - Projektalapítás

01. gyakorlat - Projektalapítás 2 Követelmények 01. gyakorlat - Projektalapítás Szoftvertechnológia gyakorlat OE-NIK A félév során egy nagyobb szoftverrendszer prototípusának elkészítése lesz a feladat Fejlesztési módszertan: RUP CASE-eszköz:

Részletesebben

S01-7 Komponens alapú szoftverfejlesztés 1

S01-7 Komponens alapú szoftverfejlesztés 1 S01-7 Komponens alapú szoftverfejlesztés 1 1. A szoftverfejlesztési modell fogalma. 2. A komponens és komponens modell fogalma. 3. UML kompozíciós diagram fogalma. 4. A szoftverarchitektúrák fogalma, összetevői.

Részletesebben

Szoftvertechnolo gia gyakorlat

Szoftvertechnolo gia gyakorlat Szoftvertechnolo gia gyakorlat Dr. Johanyák Zsolt Csaba http://johanyak.hu 1. Dependency Injection (függőség befecskendezés) tervezési minta A tervezési minta alapgondolata az, hogy egy konkrét feladatot

Részletesebben

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

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05+ Geodéziai Feldolgozó Program A GeoEasy telepítése GeoEasy V2.05+ Geodéziai Feldolgozó Program (c)digikom Kft. 1997-2010 Tartalomjegyzék Hardver, szoftver igények GeoEasy telepítése A hardverkulcs Hálózatos hardverkulcs A GeoEasy indítása

Részletesebben

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok Bevezetés a programozásba II 8. Előadás: Osztályok, objektumok, osztályszintű metódusok vektor.h #ifndef VEKTOR_H #define VEKTOR_H class Vektor { int meret, *mut; public: Vektor(int meret); int szamlal(int

Részletesebben

Java gyakorlat feladatai e s megolda sai (2014.04.10)

Java gyakorlat feladatai e s megolda sai (2014.04.10) Java gyakorlat feladatai e s megolda sai (2014.04.10) 1. Feladat Számítsuk ki a Fibonacci sorozat első 20 tagját! / Fibonacci számsorozat tagjait kiszámoló, egyetlen osztályból álló program @author Bence

Részletesebben

7. fejezet: Mutatók és tömbök

7. fejezet: Mutatók és tömbök 7. fejezet: Mutatók és tömbök Minden komolyabb programozási nyelvben vannak tömbök, amelyek gondos kezekben komoly fegyvert jelenthetnek. Először is tanuljunk meg tömböt deklarálni! //Tömbök használata

Részletesebben

2. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció 2. Beadandó feladat dokumentáció Készítette: Giachetta Roberto E-mail: groberto@inf.elte.hu Feladat: Készítsünk programot a következő memóriajátékhoz. A játéktáblán mező foglal helyet, amelyek különböző

Részletesebben

UML Feladatok. UML Feladatok

UML Feladatok. UML Feladatok UML Feladatok 2008.01.08 4. Feladat Az alábbi ábrán három UML2 modell elemet megjelöltünk. Adja meg elemenként, hogy az melyik UML2 meta-modell elem példánya! 2008.01.15 4. Feladat Jelölje meg, hogy a

Részletesebben

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*; Java osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés. ( Előfeltétel 12. Tétel ) Az osztály egy olyan típus leíró struktúra, amely

Részletesebben

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés Bevezetés a programozásba 2 7. Előadás: Objektumszű és osztályszű elemek, hibakezelés ISMÉTLÉS Osztály class Particle { public: Particle( X, X, Y); virtual void mozog( ); ); virtual void rajzol( ) const;

Részletesebben

Rendszer szekvencia diagram

Rendszer szekvencia diagram Rendszer szekvencia diagram Célkitűzések A rendszer események azonosítása. Rendszer szekvencia diagram készítése az eseményekre. 2 1.Iteráció Az első igazi fejlesztési iteráció. A projekt kezdeti szakaszában

Részletesebben

Tartalom jegyzék 1 BEVEZETŐ 2 1.1 SZOFTVER ÉS HARDVER KÖVETELMÉNYEK 2 2 TELEPÍTÉS 2 3 KEZELÉS 5

Tartalom jegyzék 1 BEVEZETŐ 2 1.1 SZOFTVER ÉS HARDVER KÖVETELMÉNYEK 2 2 TELEPÍTÉS 2 3 KEZELÉS 5 Tartalom jegyzék 1 BEVEZETŐ 2 1.1 SZOFTVER ÉS HARDVER KÖVETELMÉNYEK 2 2 TELEPÍTÉS 2 3 KEZELÉS 5 3.1 ELSŐ FUTTATÁS 5 3.2 TULAJDONOSI ADATLAP 6 3.3 REGISZTRÁLÁS 6 3.4 AKTIVÁLÁS 6 3.5 MÉRÉS 7 3.5.1 ÜGYFÉL

Részletesebben

Szakterületi modell A fogalmak megjelenítése. 9. fejezet Applying UML and Patterns Craig Larman

Szakterületi modell A fogalmak megjelenítése. 9. fejezet Applying UML and Patterns Craig Larman Szakterületi modell A fogalmak megjelenítése 9. fejezet Applying UML and Patterns Craig Larman 1 Néhány megjegyzés a diagramokhoz Ez a tárgy a rendszer elemzésről és modellezésről szól. Noha például egy

Részletesebben

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése CAN alapú járműves adatokat megjelenítő szoftver fejlesztése Beszámoló Dokumentum szám: D01-018-08-05 Dokumentum dátum: 2014. január 30. Szerző(k): Jánky Szabolcs (szabolcs.janky@inventure.hu) http://

Részletesebben

www.sdrive1564.com Kikapcsoláskor mindig a Commodore számítógépet vagy a floppy meghajtót kapcsolja ki először.

www.sdrive1564.com Kikapcsoláskor mindig a Commodore számítógépet vagy a floppy meghajtót kapcsolja ki először. SDrive 1564 SD kártya illesztő Commodore számítógépekhez www.sdrive1564.com Tápfeszültség ellátás: 12V / min 300mA-es tápegység (adapter) a csatlakozó tüskéje a +, a külső érintkező a kapcsolódási pont.

Részletesebben

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

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később). Grafikus felhasználói felület Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később). Mi hogyan használjuk? awt: eseménykezelés,

Részletesebben

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter Programozás(A szakirány) II. beadandó feladat 2014.05.05. Farkas András HP6S15 fafee@fafeecorp.com 1. csoport Veszprémi Anna / Hudoba Péter Feladat: Egy szöveges állományban bekezdésekre tördelt szöveg

Részletesebben

Programozási nyelvek Java

Programozási nyelvek Java Programozási nyelvek Java 2. gyakorlat Függvények Általános prototípus Módosítószavak Láthatóság: public, protected, private. Ha nem definiált, akkor úgynevezett package-private láthatóság. Lehet abstract

Részletesebben

PDF. Tartalomjegyzék 1/21

PDF. Tartalomjegyzék 1/21 PDF Napjainkban a publikálás elterjedt formája a PDF dokumentumok előállítása. A weben ez szinte szabvánnyá vált hosszú dokumentumok esetén. Akkor is nagyon hasznos lehet, ha a gondosan megformázott word

Részletesebben

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

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet    Copyright 2008 Johanyák Zsolt Csaba Ugráló gomb Készítsünk egy egyszerű játékprogramot, ami egy mozgó nyomógombot tartalmaz. A nyomógomb beállított ideig marad egy helyben, majd az ablakon számára elhatárolt terület (panel) egy véletlenszerűen

Részletesebben

C++ programozási nyelv

C++ programozási nyelv C++ programozási nyelv Gyakorlat - 13. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. december A C++ programozási nyelv Soós Sándor 1/10 Tartalomjegyzék Objektumok

Részletesebben

HASZNÁLATI ESET DIAGRAM (USE CASE DIAGRAM)

HASZNÁLATI ESET DIAGRAM (USE CASE DIAGRAM) HASZNÁLATI ESET DIAGRAM (USE CASE DIAGRAM) Célja: A követelményrögzítés (a szoftverfejlesztés els fázisaiban, pl. a követelménydefiníciós fázisban használatos). Funkcionális diagram: középpontban a rendszer

Részletesebben

Angolul: Extreme Programming, röviden: XP Agilis módszertan. Más módszertanok bevált technikáinak extrém módú (nagyon jó) használata

Angolul: Extreme Programming, röviden: XP Agilis módszertan. Más módszertanok bevált technikáinak extrém módú (nagyon jó) használata Angolul: Extreme Programming, röviden: XP Agilis módszertan. Más módszertanok bevált technikáinak extrém módú (nagyon jó) használata jelentése: gyors, fürge 1990-es évek vége Változás igénye Módszertan-család

Részletesebben

DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció

DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció H - 1161 Budapest Rákóczi út 76. Tel./Fax.: +36-1-4010159 http://www.pageos.hu toni@pageos.hu DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció A program használható a TOPOBASE

Részletesebben

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja Kommunikáció Folyamatok közötti kommunikáció Minden elosztott rendszer alapja Marshalling Alap primitívek Direkt, indirekt portok Blokkolás, nem blokkolás Pufferelés Megbízhatóság RPC Az RPC jellemzői

Részletesebben

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

VARIO Face 2.0 Felhasználói kézikönyv VARIO Face 2.0 Felhasználói kézikönyv A kézikönyv használata Mielőtt elindítaná és használná a szoftvert kérjük olvassa el figyelmesen a felhasználói kézikönyvet! A dokumentum nem sokszorosítható illetve

Részletesebben

Programtervezés. Dr. Iványi Péter

Programtervezés. Dr. Iványi Péter Programtervezés Dr. Iványi Péter 1 A programozás lépései 2 Feladat meghatározás Feladat kiírás Mik az input adatok A megoldáshoz szükséges idő és költség Gyorsan, jót, olcsón 3 Feladat megfogalmazása Egyértelmű

Részletesebben

Continuity projekt. 38 - mazli. Konzulens: Dr. László Zoltán. Szabó Csaba BABFRK sz.csabi.3@gmail.com

Continuity projekt. 38 - mazli. Konzulens: Dr. László Zoltán. Szabó Csaba BABFRK sz.csabi.3@gmail.com Continuity projekt 38 - Konzulens: Dr. László Zoltán Csapattagok: Szabó Csaba BABFRK sz.csabi.3@gmail.com Halász Antal István F6ID7E halasz.antal.istvan@gmail.com Kiss Beáta GT2NUN lotrisz@gmail.com Gerlei

Részletesebben

Navigáci. stervezés. Algoritmusok és alkalmazásaik. Osváth Róbert Sorbán Sámuel

Navigáci. stervezés. Algoritmusok és alkalmazásaik. Osváth Róbert Sorbán Sámuel Navigáci ció és s mozgástervez stervezés Algoritmusok és alkalmazásaik Osváth Róbert Sorbán Sámuel Feladat Adottak: pálya (C), játékos, játékos ismerethalmaza, kezdőpont, célpont. Pálya szerkezete: akadályokkal

Részletesebben