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
Tartalom Tartalom... 2 1. Követelmény, projekt, funkcionalitás... 6 1.1 Követelmény definíció... 6 1.1.1 A program célja, alapvető feladatai... 6 1.1.2 A felhasználói felület... 6 1.1.3 A program futtatásához szükséges követelmények... 6 1.1.4 A szoftver fejlesztésével kapcsolatos alapkövetelmények, elvek, célok... 6 1.2 Projekt terv... 7 1.2.1 A felhasznált fejlesztőeszközök... 7 1.2.2 A fejlesztőcsapat tagjai, azok feladatkörei... 7 1.2.3 Kommunikációs modell... 7 1.2.4 Fejlesztési mérföldkövek, ütemterv... 7 1.2.5 Határidők... 8 1.2.6 Átadás... 8 1.2.7 Szükséges dokumentációk... 8 1.3 Feladatleírás... 9 1.4 Szótár... 10 1.5 Essential use-case-ek... 11 1.5.1 Use-case diagram... 11 1.5.2 Use-case leírások... 11 1.6 Napló... 11 2. Analízis modell kidolgozása... 12 2.1 Napló... 12 3. Analízis modell kidolgozása... 13 3.1 Objektum katalógus... 13 3.1.1 City... 13 3.1.2 Timer... 13 3.1.3 Field... 14 3.1.4 ITickable <<interface>>... 14 3.1.5 Vehicle... 15 3.1.6 Police... 15 3.1.7 Civilian... 16 3.1.8 Thief... 16 3.1.9 Road... 17 3.1.10 HideOut... 18 3.1.11 BorderIn... 19 3.1.12 BorderOut... 19 3.1.13 Junction... 19 3.1.14 RoadSign... 20 3.1.15 StopSign... 21 3.1.16 Semaphore... 21 3.1.17 NoRoadSign... 22 3.2 Osztályok leírása... 23 3.3 Statikus struktúra diagramok... 24 3.4 Szekvencia diagramok... 25 3.5 State-chartok... 40 3.6 Napló... 40 2010-05-12 2
4. Szkeleton tervezése... 42 4.1 A szkeleton modell valóságos use-case-ei... 42 4.1.1 Use-case diagramok... 42 4.1.2 Use-case leírások... 44 4.2 Architektúra... 47 4.3 A szkeleton kezelői felületének terve, dialógusok... 48 4.4 Szekvencia diagramok a belső működésre... 51 4.4.1 Civil határon ki / Rendőr határon ki és be... 51 4.4.2 Civil kereszteződésből útra... 52 4.4.3 Civil útról útra... 53 4.4.4 Civil útról lámpás kereszteződésbe... 54 4.4.5 Civil stoptáblás kereszteződésbe... 55 4.4.6 Rendőr kereszteződésből útra lép... 56 4.4.7 Rendőr útról keresztezősbe lép... 57 4.4.8 Rendőr útról útra lép... 58 4.4.9 Tolvaj kereszteződésből útra lép... 59 4.4.10 Tolvaj határon ki... 60 4.4.11 Tolvaj útról rejtekhelyre... 61 4.4.12 Tolvaj útról kereszteződésbe lép... 62 4.4.13 Tolvaj útról útra... 63 4.4.14 Játék indítása... 64 4.4.15 Idő léptetése... 65 4.5 Napló... 66 5. Szkeleton beadása... 67 5.1 Fordítási és futtatási útmutató... 67 5.1.1 Fájllista... 67 5.1.2 Fordítás... 68 5.1.3 Futtatás... 68 5.1.4 Dokumentáció generálása... 68 5.1.5 Értékelés... 69 5.2 Napló... 69 5.3 Statisztika... 69 6. Prototípus koncepciója... 71 6.1 Prototípus interface-definíciója... 71 6.1.1 Az interfész általános leírása... 71 6.1.2 Paraméterek... 71 6.1.3 Bemeneti nyelv... 71 6.1.4 Pályaformátum... 72 6.1.5 Kimeneti nyelv... 73 6.2 Összes részletes use-case... 74 6.2.1 Játékos use-case-ei... 74 6.2.2 Óra use-case-ei... 75 6.3 Tesztelési terv... 77 6.3.1 Tesztelés menete... 77 6.3.2 Teszt-esetek... 78 6.4 Napló... 80 7. Részletes tervek... 81 7.1 Osztályok és metódusok tervei... 81 7.1.1 City... 81 2010-05-12 3
7.1.2 Timer... 82 7.1.3 ITickable <<interface>>... 82 7.1.4 Vehicle... 83 7.1.5 Bunny... 84 7.1.6 Police... 86 7.1.7 Civilian... 87 7.1.8 Thief... 88 7.1.9 Road... 90 7.1.10 HideOut... 93 7.1.11 BorderIn... 93 7.1.12 BorderOut... 93 7.1.13 Junction... 94 7.1.14 RoadSign... 95 7.1.15 StopSign... 96 7.1.16 Semaphore... 97 7.1.17 NoRoadSign... 99 7.2 A tesztek részletes tervei, leírásuk a teszt nyelvén...100 7.2.1 Civilian (Police) mozgása Roadról Roadra...100 7.2.2 Város elhagyása, érkezés...100 7.2.3 Ütközés elkerülés...101 7.2.4 Civilian útról kereszteződésbe...102 7.2.5 Tolvaj mozgása...103 7.2.6 Elkapás...105 7.2.7 Ütközés...105 7.2.8 Győzelem...106 7.2.9 Police Roadról Junctionbe...107 7.2.10 A tolvaj felveszi a nyuszit és a rendőr nekiütközik...108 7.2.11 A tolvaj felveszi a nyuszit és a rendőrnek ütközik...109 7.3 A tesztelést támogató programok tervei...110 7.4 Változtatások a követelmények módosulása miatt...110 7.5 Napló...115 8. Prototípus beadása...116 8.1 Fordítási és futtatási útmutató...116 8.1.1 Fájllista...116 8.1.2 Fordítás...118 8.1.3 Futtatás...118 8.2 Tesztek jegyzőkönyvei...118 8.2.1 Civilian (Police) mozgása Roadról Roadra...118 8.2.2 Város elhagyása, érkezés...119 8.2.3 Ütközés elkerülés...119 8.2.4 Civilian útról kereszteződésbe...120 8.2.5 Tolvaj mozgása...121 8.2.6 Elkapás...122 8.2.7 Ütközés...123 8.2.8 Győzelem...123 8.2.9 Police Roadról Junctionbe...124 8.2.10 A tolvaj felveszi a nyuszit és a rendőr nekiütközik...125 8.2.11 A tolvaj felveszi a nyuszit és a rendőrnek ütközik...125 8.3 Értékelés...126 2010-05-12 4
8.4 Napló...126 8.5 Statisztika...126 9. Grafikus felület specifikációja...127 9.1 A grafikus interfész...127 9.2 A grafikus rendszer architektúrája...127 9.2.1 A felület működési elve...127 9.2.2 A felület osztály-struktúrája...128 9.3 A grafikus objektumok felsorolása...128 9.3.1 IView <<interface>>...128 9.3.2 CView...129 9.3.3 BorderInView...129 9.3.4 JunctionView...130 9.3.5 RoadView...130 9.3.6 HideOutView...130 9.3.7 BorderOutView...131 9.3.8 StopSignView...131 9.3.9 SemaphoreView...132 9.3.10 NoRoadSignView...132 9.3.11 BunnyView...133 9.3.12 PoliceView...133 9.3.13 CivilianView...133 9.3.14 ThiefView...134 9.3.15 Road...134 9.4 Kapcsolat az alkalmazói rendszerrel...135 9.4.1 Napló...138 10. Összefoglalás...140 10.1 Projekt összegzés...140 10.1.1 Mit tanultunk...140 10.1.2 Idő és pontszám...140 10.1.3 Dokumentálás...141 10.2 A projektre fordított munkaidő...141 10.3 A feltöltött programok forrássorainak száma fázisonként...142 10.4 Változtatási javaslatok...142 10.5 Ajánlott feladat...143 10.6 Napló...144 2010-05-12 5
1. Követelmény, projekt, funkcionalitás 1.1 Követelmény definíció 1.1.1 A program célja, alapvető feladatai A tervezendő program egy játék, amelyben egy forgalmas várost modellező pályán kell a felhasználónak eljuttatnia a bankrabló autóját a banktól a rejtekhelyig, kikerülve a forgalom véletlenszerűen mozgó autóit és a rendőrautókat. A fejlesztőcsapat célja egy olyan program létrehozása, amely eleget tesz a specifikációban leírtaknak, és futtatható minden olyan gépen, ami megfelel a meghatározott minimum követelményeknek. 1.1.2 A felhasználói felület A program grafikus felhasználó felülettel (GUI) fog rendelkezni, mely egérrel kezelhető; a bankrabló autója pedig a billentyűzet kurzorgombjaival irányítható. 1.1.3 A program futtatásához szükséges követelmények A programot úgy készítjük el, hogy a HSZK laborban (R.4.K) lévő számítógépeken megfelelő sebességgel fusson. A fejlesztés során ügyelünk arra, hogy a kód lefordítható legyen az 1.6-os verziójú JDK java.exe fordítójával. Ehhez a szükséges minimumkonfigurációnak legalább 64 MB memóriával és 98 MB tárhellyel kell rendelkeznie. 1 1.1.4 A szoftver fejlesztésével kapcsolatos alapkövetelmények, elvek, célok Teljesítmény: a program hardverigényét próbáljuk minél alacsonyabban tartani. Ennek főleg PC-nél gyengébb teljesítményű számítógépek (netbook, handheld eszközök) van komoly jelentősége, hiszen a Java fejlesztési platform miatt a kész program más platformokon is futtatható lesz. Modularitás: a külön funkciót ellátó programrészeket külön modulokban helyezzük el, így erősítve az újrafelhasználhatóságot. Felhasználóbarát felület: a program könnyen kezelhető, intuitív grafikus felhasználói felülettel rendelkezzen. Bővíthetőség: az objektumorientált modellt úgy alkotjuk meg, hogy utólag bővíthető legyen, pl. egy új jármű felvétele esetén a régiekben csak az új járművel való interakciót kelljen megvalósítani, más módosítást ne igényeljen. Funkcionalitás, kis hardverigény: mivel a projekt célja nem egy látványos grafikai felület elkészítése, ezért programunkban a modellalkotásra, a letisztult és átlátható kódolásra koncentrálunk. A kis hardverigény biztosítja, hogy a játék szinte minden konfiguráción élvezhető sebességgel fusson. 1 http://www.java.com/en/download/help/6000011000.xml 2010-05-12 6
1.2 Projekt terv 1.2.1 A felhasznált fejlesztőeszközök A fejlesztéshez a csapat az Eclipse IDE for Java Developerst választotta, annak robosztussága és ergonómiája miatt. Az UML diagramok elkészítéséhez a Visual Paradigm UML modellező szoftvert használjuk, amely képes a diagramokból Java kód generálására is. A szöveges állományok szinkronizálása egy Eclipse SVN beépülő modult, a subclipse-et 2 használtuk. A dokumentáció Microsoft Word 2007-tel készült, a tantárgy honlapján elérhető sablonok módosításával. 1.2.2 A fejlesztőcsapat tagjai, azok feladatkörei név Neptun-kód feladatok Bodó Péter MKA2DY dokumentáció, kódolás, tesztelés Pál Tamás UVKSGJ UML, kódolás, tesztelés Szárnyas Gábor U944EQ csapatvezetés, dokumentáció, kódolás Mivel csapatunk három főből áll, természetesen nagyobb átfedések vannak a feladatkörökben, mint egy négyfős csapat esetén. A felosztás nem végleges, a feladatok nehézsége és az egyes tagok egyetemi elfoglaltsága miatt időközben változhat. 1.2.3 Kommunikációs modell A csapattagok úgy kerültek kiválasztásra, hogy mindenki a Schönherz Zoltán kollégium lakója legyen, ami hétköznap jelentősen megközelíti a kapcsolattartást. Minden héten megbeszélést tartunk az egyik tanulószobában az adott heti teendők megbeszélése és kiosztása ügyében. Hétvégén és kisebb ügyekben interneten keresztül, Windows Live Messengerrel és e-mailen tartjuk a kapcsolatot. A csapat kis létszáma és a találkozások egyszerűsége miatt nem éreztük szükségét levelezőlista létrehozásának. 1.2.4 Fejlesztési mérföldkövek, ütemterv A fejlesztés mérföldköveit a tárgy honlapjának definíciója alapján készítjük el: Szkeleton A szkeletonnal vizsgálható a feladat modellezésének helyessége. A szkeletonban már valamennyi, a végső rendszerben szereplő objektum szerepel, azonban csak interfészük definiált. Minden metódus az indulás pillanatában a karakteres kimenetre írja a nevét és meghívja azokat a metódusokat, amelyeket a kész szoftverben is használni fog. Feltételes hívás esetén a karakteres bemeneten keresztül felhasználói beavatkozás dönti el, hogy melyik metódus hívódjon meg. A szkeleton segítségével ellenőrizhetők a forgatókönyvek és a szekvencia diagramok. Prototípus A prototípus egy kész, működő program, a grafikus felületet kivéve. Tervezési szempontból késznek tekinthető, az ütemezés és az objektumok kezelése megoldott. Az 2 http://subclipse.tigris.org/ 2010-05-12 7
objektumok (a megjelenítésre vonatkozó részeket kivéve) metódusai a végleges algoritmusokat tartalmazzák. A működés karakteres kimeneten követhető és fájlba is menthető a tesztelés megkönnyítése érdekében. Grafikus felület (GUI) A grafikus felülettel rendelkező változat a prototípustól csak a felhasználó felületben tér el. Ez a szoftver végleges verziója, mely után csak apróbb javítások lehetnek szükségesek. 1.2.5 Határidők hét dátum feladat 1 febr.10. 14 h - csapatok regisztrációja 2 febr. 18. Követelmény, projekt, funkcionalitás - beadás 3 febr. 25. Analízis modell kidolgozása 1. - beadás 4 márc. 4. Analízis modell kidolgozása 2. - beadás 5 márc. 11. Szkeleton tervezése - beadás 6 márc. 18. Szkeleton - beadás 7 márc. 25. Prototípus koncepciója - beadás 8 ápr. 1. Részletes tervek - beadás 9 ápr. 8. 10 ápr. 15. Prototípus - beadás 11 ápr. 22. Grafikus felület specifikációja - beadás 12 ápr. 29. 13 máj. 6. Grafikus változat - beadás 14 máj. 13. Összefoglalás - beadás 1.2.6 Átadás A heti aktuális nyomtatott dokumentációt a követelményeknek megfelelően átlátszó műanyag irattartóban, fedőlappal adjuk le. A már elkészült forráskódokat a Hercules feladatbeadó rendszeren keresztül töltjük fel. 3 1.2.7 Szükséges dokumentációk 1. - 2. Követelmény, projekt, funkcionalitás 3. Analízis modell kidolgozása 1. 4. Analízis modell kidolgozása 2. 5. Szkeleton tervezése 6. Szkeleton 7. Prototípus koncepciója 8. Részletes tervek 9. - 10. Prototípus 11. Grafikus felület specifikációja 3 http://kfarkas.iit.bme.hu/hercules/ 2010-05-12 8
12. - 13. Grafikus változat 14. Összefoglalás 1.3 Feladatleírás A játék Verkehrsmeldungen am Uml városka életét eleveníti meg. A városban van egy bank, ahol a lakosok vagyonának egy részét őrzik. Egy tolvaj szemet vet erre a vagyonra, és ki akarja rabolni a bankot. A bank kirablása után autójába pattan, és a közlekedési szabályokra fittyet hányva a rejtekhelye felé veszi az irányt. A tolvaj dolgát nehezítik a városban járőröző rendőrök. A városi forgalomban az ütközések elkerülése, és a menekülés a rendőr elől ügyességi, és logikai próbatételt jelent a felhasználó számára. A világ egyirányú és egy autó széles utakból áll, amelyeken stoptáblák és szemaforok határozzák meg a közlekedési szabályokat. A járművek mindig betartják ezeket a szabályokat. Stop táblánál a járművek megállnak és megnézik, hogy folytathatják-e tovább útjukat. A szemaforoknak kétféle jelzésük van: piros és zöld. Ezek a jelzések bizonyos időközönként váltják egymást. Ha egy autó piros jelzést kap, megáll, és megvárja, míg a szemafor zöld jelzésre nem vált. Zöld jelzés esetén folytatja tovább az útját. Ha egy autó a másik előtt lassít, akkor a hátsó is lelassít az ütközés elkerülése érdekében. Ha egy járművet nem akadályoz semmi, akkor maximális sebességével halad az utakon. Minden útkereszteződésben vannak útjelzők. A városunk nem más, mint egy kétdimenziós úthálózat. A felhasználó a billentyűzet segítségével irányíthatja a tolvaj autóját a városban. Két mező közt átjárás van, ha nincs ott egy másik jármű. A játékos nem hagyhatja el a várost, amennyiben a határhoz ér, veszít. Ez nem vonatkozik a többi járműre (civilek és rendőrök), ők a megfelelő helyeken elhagyhatják a várost. Ekkor azonnal egy bemenő útra kerülnek, így a járművek száma a városban állandó. A járművek meghatározott közlekedési szabályok alapján közlekednek, amelyeket a rendőr és a játékos nem köteles betartani, ezzel növelve az ütközés valószínűségét. A játék célja az, hogy a felhasználó épségben elirányítsa a tolvaj járművét a banktól a rejtekhelyre. A bank és a rejtekhely a városban jól látható módon meg van jelölve. A tolvaj autója egy helyben áll vagy állandó sebességgel mozog, de nem gyorsabb a rendőrök járműveitől. Az tolvaj járművét a WASD vagy a kurzorgombokkal lehet irányítani a városban. A tolvajjal nem lehet falnak ütközni. A játék akkor tekinthető sikeresnek, ha biztonságban eljutott a tolvaj járműve a rejtekhelyre. A felhasználó dolgát nehezíti, az őt üldöző rendőr és a város forgalma. Ha a rendőr utoléri a tolvaj autóját, vagy ha a tolvaj személyautóba ütközik, akkor elveszíti a játékot. Ekkor a játék újrakezdhető, megnyerésére korlátlan számú próbálkozás áll rendelkezésre. Új játék egy gombbal indítható. A játékot akármikor befejezhetjük. A város térképe téglalap alakú, egyértelműen látszanak a térképen a járművek, a rendőrök valamint az útjelző táblák helyzete. A tolvaj sikeres eljuttatása a rejtekhelyre, a felhasználó ügyességén, gyors helyzetfelismerésén alapszik. A járművek és a rendőrök teljesen a felhasználó mozgásától függetlenül mozognak. A felhasználónak figyelnie kell rá, hogy ne kapja el a rendőr, és kerülnie kell az ütközéseket a többi járművel. A program indításakor a felhasználót a főmenü fogadja. Itt kezdhető új játék, ill. lehetőség van a játék elhagyására is. A megjelenített felület nagy részét a város adja. A felületen még figyelhetjük a játék kezdetétől eltelt időt. A játék valós időben fut, a járművek folyamatosan, véletlenszerűen mozognak a város útjain. 2010-05-12 9
1.4 Szótár felhasználó Aki kezeli a programot jármű tolvaj rendőr város út Gépkocsik, melyek a városban közlekednek a szabályokat betartva Jármű, melyre nem vonatkoznak a közlekedési szabályok, a felhasználó irányítja Jármű, melyre nem vonatkoznak a közlekedési szabályok, és el tudja kapni a tolvajt A játék helyszín, utakból és kereszteződésekből áll A város olyan része, ahol autók haladhatnak kereszteződés A város olyan része, ahol több út találkozik városhatár elhagy elsőbbség szemafor stop tábla bank rejtekhely megáll lassít gyorsit sebesség ütközés elkap Olyan utak ahol a járművek elhagyhatják a várost Amikor egy jármű a városhatárnál megszűnik létezni Kereszteződéseknél meghatározza, hogy milyen sorrendben léphetnek be a járművek Jelzőlámpa, mely piros és zöld jelzésekkel irányítja a forgalmat Az autókat megállásra kötelezi Az az épület, amely melletti úton kezdődik a játék A tolvaj rejtekhelye, ahova ha eljut megnyeri a játékot A jármű sebességét nullára csökkenti, azaz 1 helyben áll az úton A sebesség csökkentése A sebesség növelése Egységnyi idő alatt megtett utak Ha két jármű (beleértve tolvajt és rendőrt is) ugyanarra az útra érkezik A rendőr a tolvaj járművébe ütközik 2010-05-12 10
1.5 Essential use-case-ek 1.5.1 Use-case diagram 1.5.2 Use-case leírások Use-case neve Játék indítása Autó mozgatása Rövid leírás A játékos új játékot kezd A játékos vezérli az autót Aktorok Játékos Játékos Forgatókönyv Betöltődik a pálya A leütött billentyűknek megfelelően mozog az autó 1.6 Napló Kezdet Időtartam Résztvevők Leírás 2010. 02. 02. 13:00 0,5 óra Bodó Pál Szárnyas kapcsolatban. 2010. 02. 14. 20:00 2 óra Bodó Pál Szárnyas Csapatjelentkezés leadása, online konzultáció a csapatnévvel Értekezlet. Döntések: Bodó készíti a szótárat és a specifikációt. Pál készíti a use case diagramokat. Szárnyas készíti a projekt tervet. 2010. 02. 14. 22:00 1 óra Szárnyas Dokumentációhoz sablon készítése, formázási beállítások. Projekt terv elkészítése. 2010. 02. 15. 17:15 1,5 óra Bodó Pál Konzultáció (R.4.K) Szárnyas 2010. 02. 15. 22:00 2 óra Bodó Specifikáció elkészítése. 2010. 02. 15. 21:00 2 óra Pál Use-case diagram és követelmény definíció elkészítése. 2010. 02. 17. 21:00 2 óra Szárnyas Elkészült anyagrészek összerendezése, kiegészítések. 2010. 02. 18. 09:00 - Szárnyas nyomtatás 2010-05-12 11
2. Analízis modell kidolgozása 2.1 Napló Kezdet Időtartam Résztvevők Leírás 2010.02.21. 20:00 3 óra Bodó Pál Szárnyas Értekezlet. Objektummodell felvázolása papíron, felkészülés a konzultációra 2010.02.22. 20:00 3 óra Bodó Pál Értekezlet. Konzultáción szerzett ismeretek Szárnyas 2010.02.23. 16:00 8 óra Bodó Pál megvitatása. Feladatok szétosztása. Első analízis modell megalkotása Szárnyas 2010.02.24. 10:00 7 óra Bodó Szekvenciadiagramok megrajzolása 2010.02.24. 12:00 7 óra Pál Dokumentáció elkészítése 2010.02.24. 12:00 6 óra Szárnyas Osztálydiagram, state chartok és az időzítési szekvenciadiagram megrajzolása 2010.02.24. 20:00 1 óra Szárnyas Dokumentáció finomítása, nyomtatás 2010-05-12 12
3. Analízis modell kidolgozása 3.1 Objektum katalógus 3.1.1 City A várost megvalósító objektum, tartalmazza a város mezőit, a járműveket és a Timer objektumot. példányszám 1 ősosztályok perzisztencia konkurencia felelősségek komponensek nincs dinamikus passzív nincs Timer timer Az időzítő objektum Vehicle[0..*] vehicles Field[0..*] fields szolgáltatások A járműveket tartalmazó tömb A mezőket tartalmazó tömb void addvehicle(v:v) Jármű hozzáadása a tömbhöz void removevehicle(v:v) Jármű törlése a tömbből void win() Játék megnyerése void gameover() Játék elvesztése változók nincs 3.1.2 Timer Az időzítőjelet kiadó objektum. példányszám 1 ősosztályok nincs perzisztencia dinamikus konkurencia aktív felelősségek nincs komponensek ITickable[0..*] tickables A tickelhető objektumok heterogén kollekciója 2010-05-12 13
szolgáltatások void tick() A tickelhető objektumok ontick függvényeinek meghívása void addtickable(t:itickable) Tickelhető objektum hozzáadása a kollekcióhoz void removetickable(t:itickable) Tickelhető objektum törlése a kollekcióból változók nincs 3.1.3 Field A város mezőit megvalósító objektumok. példányszám ősosztályok perzisztencia konkurencia felelősségek n nincs dinamikus passzív nincs komponensek nincs szolgáltatások nincs változók nincs 3.1.4 ITickable <<interface>> A tickelhető objektumok közös interfésze. példányszám - ősosztályok perzisztencia konkurencia felelősségek nincs dinamikus passzív nincs komponensek nincs szolgáltatások void ontick() A tick hatására végbemenő eseményeket valósítja meg változók nincs 2010-05-12 14
3.1.5 Vehicle A járműveket megvalósító objektum. példányszám - ősosztályok perzisztencia konkurencia felelősségek komponensek ITickable <<interface>> dinamikus passzív nincs Road[0..1] r Az az útszakasz, amin a jármű van. szolgáltatások void ontick() Timer által meghívott időzítő függvény, ami a leszármazottakban felül van definiálva void accept(r:road) Meghívja a Road removevehicle függvényét, a következő Road setvehicle függvényét, és a Vehicle setroad függvényét void choose(j: Junction, directions: enum[]) void incoming(v: Vehicle) - A kapott irányokból választ egyet, majd azzal meghívja a Junction osztály megfelelő exit függvényét void setroad(r:road) Beállítja a Vehicle r értékét void catch() - változók int frequency A jármű frekvenciája, ennyi tick telik el két lépés között int state Az előző lépés óta eltelt idő 3.1.6 Police A rendőrt megvalósító objektum. példányszám ősosztályok perzisztencia konkurencia felelősségek n Vehicle, ITickable <<interface>> dinamikus passzív nincs 2010-05-12 15
komponensek nincs szolgáltatások void ontick() Növeli a state változó értékét eggyel, ha egyezik a frekvenciával, akkor nullázza és meghívja a Road objektum forwardpolice függvényét saját magával. void incoming(v:vehicle) Üres függvény void choose(j: Junction, directions: enum[]) void catch() Üres függvény A kapott irányok közül választ, majd meghívja a Junction exitpolice függvényét változók nincs 3.1.7 Civilian A civil járművet megvalósító objektum. példányszám ősosztályok perzisztencia konkurencia felelősségek n Vehicle, ITickable <<interface>> dinamikus passzív nincs komponensek nincs szolgáltatások void ontick() Növeli a state változó értékét eggyel, ha egyezik a frekvenciával, akkor nullázza és meghívja a Road objektum forwardcivilian függvényét saját magával. void incoming(v:vehicle) Üres függvény void choose(j: Junction, directions: enum[]) void catch() Üres függvény A kapott irányok közül választ, majd meghívja a Junction exitcivilian függvényét változók nincs 3.1.8 Thief A civil járművet megvalósító objektum. példányszám 1 ősosztályok Vehicle, ITickable <<interface>> 2010-05-12 16
perzisztencia konkurencia felelősségek komponensek dinamikus passzív nincs szolgáltatások void ontick() Meghívja a Road objektum forwardthief függvényét saját magával void incoming(v:vehicle) A City gameover függvényét hívja void choose(directions:enum[]) A tolvaj irányát a játékos választja ki a kereszteződésben, majd azzal meghívja a Junction exitthief függvényét void hide() Meghívja a Road removevehicle függvényét, a HideOut setvehicle függvényét, a Thief setroad függvényét, és a City win függvényét void exit() Meghívja a City gameover függvényét void catch() Meghívja a City gameover() függvényét változók nincs 3.1.9 Road A város útjait megvalósító objektumok példányszám ősosztályok perzisztencia konkurencia felelősségek komponensek n Field dinamikus passzív nincs Vehicle v Az úton tartózkodó jármű Roadsign rs Útjelző szolgáltatások void steppolice(p:police) Ha a Road üres, akkor a Police accept függvényét hívja, ha nem üres, akkor a rajta levő jármű catch függvényét hívja 2010-05-12 17
void stepcivilian(c:civilian) Ha a Roadon nincs jármű, akkor a Civilian accept függvényét hívja void stepthief(t:thief) Ha a Roadon nincs jármű, akkor a Thief accept függvényét híjva, ha van, akkor a Thief incoming függvényét hívja void setvehicle(v:vehicle) Beállítja a Road v értékét void removevehicle() A Road v értékét nullra állítja, és meghívja a RoadSign reset függvényét void forwardpolice(p:police) Meghívja a következő RoadSign enterpolice függvényét void forwardcivilian(c:civilian) Meghívja a következő RoadSign entercivilian függvényét void forwardthief(t:thief) Meghívja a következő RoadSign enterthief függvényét void addroad(r:road, rs:roadsign) Beállítja a Road rs értékét, és meghívja a A RoadSign setnextroad függvényét r-rel változók nincs enum[] direction 3.1.10 HideOut A rabló búvóhelyét megvalósító osztály példányszám 1 ősosztályok perzisztencia konkurencia felelősségek Field, Road dinamikus passzív nincs komponensek nincs szolgáltatások void stepthief(t:thief) Ha a HideOut üres, meghívja a Thief hide függvényét, ha a HideOut-on jármű van, meghívja a Thief incoming függvényét változók nincs 2010-05-12 18
3.1.11 BorderIn A városba bemenő utat megvalósító objektum példányszám ősosztályok perzisztencia konkurencia felelősségek n Field, Road dinamikus passzív nincs komponensek nincs szolgáltatások nincs változók nincs 3.1.12 BorderOut A városból kivezető utakat megvalósító objektum példányszám ősosztályok perzisztencia konkurencia felelősségek n Field, Road dinamikus passzív nincs komponensek nincs szolgáltatások void forwardthief(t:thief) Meghívja a Thief exit függvényét változók nincs 3.1.13 Junction A városban levő útkereszteződéseket megvalósító objektum példányszám ősosztályok perzisztencia konkurencia felelősségek n Field, Road dinamikus passzív nincs 2010-05-12 19
komponensek szolgáltatások nincs void forwardpolice(p:police) Meghívja a Police choose függvényét void forwardcivilian(c:civilian) Meghívja a Civilian choose függvényét void forwardthief(t:thief) Meghívja a Thief choose függvényét void exitcivilian(c:civilian,dir:enum) Meghívja a RoadSign entercivilian függvényét void exitpolice(p:police,dir:enum) Meghívja a RoadSign enterpolice függvényét void exitthief(t:thief,dir:enum) Meghívja a RoadSign enterthief függvényét változók nincs 3.1.14 RoadSign A forgalmat szabályozó útjelzéseket megvalósító objektum. A Roadok közötti csatoló osztály, amely összeköthet utat úttal (pl. gyalogos-átkelőhely) és utat kereszteződéssel is (pl. jelzőlámpa, STOP tábla). példányszám n ősosztályok perzisztencia konkurencia felelősségek komponensek ITickable <<interface>> dinamikus passzív nincs Road r A következő út szolgáltatások void ontick() - void reset() - void enterpolice(p:police) - void entercivilian(c:civilian) - void enterthief(t:thief) - void setnextroad(r:road) Beállítja a RoadSign r változóját változók nincs 2010-05-12 20
3.1.15 StopSign A stop táblát megvalósító osztály példányszám ősosztályok perzisztencia konkurencia felelősségek n ITickable <<interface>>, RoadSign dinamikus passzív nincs komponensek nincs szolgáltatások void ontick() Üres függvény void reset() Countdown változót 0-ra állít void enterpolice(p:police) Meghívja a következő Road steppolice függvényét void entercivilian(c:civilian) Alapállípotban meghívja a startcountdownt, visszaszámlálás állapotban a deccountdownt, átenged állípotban pedig a következő Road stepcivilian függvényét void enterthief(t:thief) Meghívja a következő Road stepthief függvényét void startcountdown() A countdown értékét kezdőértékre állítja void deccountdown() A countdown értékét csökkenti változók int countdown számláló 3.1.16 Semaphore A jelzőlámpát megvalósító osztály. példányszám ősosztályok perzisztencia konkurencia felelősségek n ITickable <<interface>>, RoadSign dinamikus passzív nincs komponensek nincs szolgáltatások 2010-05-12 21
void ontick() A color változót változtatja void reset() Üres függvény void enterpolice(p:police) Meghívja a következő Road steppolice függvényét void entercivilian(c:civilian) Ha a lámpa zöld meghívja a következő Road stepcivilian függvényét void enterthief(t:thief) Meghívja a következő Road stepthief függvényét enum getcolor() A color értékével tér vissza változók int period A Semaphore periódusideje. int a A periódusban [a, b] részén zöld a lámpa, különben piros. int b int i A periódusban eltelt idő. enum color A Semaphore színe 3.1.17 NoRoadSign Üres útjelzés, ami minden forgalmat átenged. példányszám ősosztályok perzisztencia konkurencia felelősségek n ITickable <<interface>>, RoadSign dinamikus passzív nincs komponensek nincs szolgáltatások void ontick() Üres függvény void reset() Üres függvény void enterpolice(p:police) Meghívja a következő Road steppolice függvényét void entercivilian(c:civilian) Meghívja a következő Road stepcivilian függvényét void enterthief(t:thief) Meghívja a következő Road stepthief függvényét változók nincs 2010-05-12 22
3.2 Osztályok leírása City: A játéktérként szolgáló várost valósítja meg. Ez tartalmazza a várost alkotó mezőket, a járműveket és az időzítő objektumot. Timer: Egy meghatározott frekvenciával vezérli az engedélyező jeleket, amely a játék eseményeinek időzítéséért felelős. Field: A várost alkotó mezők. Road: Egy speciális mező, amely a város útjának egy darabját szimbolizálja. Ismeri az őt követő útszakaszt, ill. a köztük lévő útjelző táblát (STOP táblát vagy jelzőlámpát). Egyszerre egy jármű tartózkodhat rajta. Megvizsgálhatja a következő útszakaszt, és továbbküldheti a rajta levő járművet az időzítőjel hatására. BorderIn: A városba belépő útszakaszok BorderOut: A városból kilépő útszakaszok Junction: Kereszteződés, egy vagy több bejárattal és kijárattal. HideOut: Rejtekhely, a tolvaj célja ennek elérése, ha sikerül, megnyeri a játékot. RoadSign: Útjelzés, ami stop tábla vagy szemafor lehet. Ezek felelősek a forgalom irányításáért. Megmondja, hogy adott irányból behajthat-e jármű a kereszteződésbe. StopSign: Állj, elsőbbségadás kötelező tábla. Az érkező járművet megállásra készteti, majd tovább engedi. Semaphore: Jelzőlámpa, piros vagy zöld állapottal. Csak akkor enged tovább járművet, ha zöld. Vehicle: Az utakon közlekedő járművek ősosztálya. Police: A jármű egyik speciális változata a rendőr, nem vonatkoznak rá a szabályok, a kereszteződésekben pedig a véletlen irányítja. Thief: A játékos által irányított jármű, amire nem vonatkoznak a szabályok. Civilian: A város lakóinak járművei, szabályosan közlekednek, és a véletlen irányítja őket a kereszteződésekben. ITickable: Időtől függő objektumokat összefogó interfész, amelyen keresztül a Timer az objektumok időzítését végzi. 2010-05-12 23
3.3 Statikus struktúra diagramok 2010-05-12 24
3.4 Szekvencia diagramok 2010-05-12 25
2010-05-12 26
2010-05-12 27
2010-05-12 28
2010-05-12 29
2010-05-12 30
2010-05-12 31
2010-05-12 32
2010-05-12 33
2010-05-12 34
2010-05-12 35
2010-05-12 36
2010-05-12 37
2010-05-12 38
2010-05-12 39
3.5 State-chartok Stop tábla működése 3.6 Napló Szemafor működése Kezdet Időtartam Résztvevők Leírás 2010.03.01. 20:00 2 óra Bodó Pál Szárnyas objektummodell átalakítása 2010.03.02. 19:00 2 óra Bodó Pál Szárnyas 2010.03.03. 10:00 2 óra Bodó Pál Értekezlet. Konzultáción hallottak megbeszélése, Szekvencia-diagramok rajzolása, modell letisztázása Objektummodell finomítása, csatoló osztály bevezetése Szárnyas 2010.03.03. 10:00 8 óra Bodó Szekvencia-diagramok megrajzolása 2010.03.03. 10:00 8 óra Pál Dokumentáció elkészítése 2010.03.03. 10:00 8 óra Szárnyas Osztálydiagram, state chartok és az 2010-05-12 40
2010.03.04. 10:00 2 óra Szárnyas, Bodó néhány szekvenciadiagram megrajzolása Dokumentáció finomítása, nyomtatás 2010-05-12 41
4. Szkeleton tervezése 4.1 A szkeleton modell valóságos use-case-ei 4.1.1 Use-case diagramok Játékos use case-ei 2010-05-12 42
Óra use case-ei 2010-05-12 43
4.1.2 Use-case leírások Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Játék indítása A pálya inicializálása, mezők, járművek, útjelzők létrehozása és beállítása Játékos Tolvaj mozgatása foglalt útra A tolvaj összeütközik az úton levő járművel, a játékot elveszítjük Játékos Rendőr van az úton A tolvaj összeütközik az úton levő rendőrrel, a játékot elveszítjük Játékos Civil van az úton A tolvaj összeütközik az úton levő civillel, a játékot elveszítjük Játékos Tolvaj mozgatása szabad útra A tolvaj átkerül az új útszakaszra Játékos Rejtekhelyre lép A tolvaj megmenekül, a játékot megnyerjük Játékos Városból kilép A tolvaj elhagyja a játékteret, a játékot elveszítjük Játékos Útról útra vagy kereszteződésbe lép A tolvaj átkerül az új útra vagy kereszteződésbe Játékos Kereszteződésből útra lép (irányt választ) A tolvaj a választásunknak megfelelő útra lép Játékos Idő léptetése Üzenetet küldése minden időre cselekvő dolognak a pályán Óra 2010-05-12 44
Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Útjelzők működtetése Minden útjelző idejének léptetése Óra Szemafor működtetése A szemaforok idejének léptetése, színeiknek beállítása a paramétereiknek megfelelően Óra Stop tábla működtetése A stop táblák idejének léptetése, belső állapotaik beállítása Óra Járművek léptetése Minden jármű idejének léptetése Óra Civil léptetése A civil járművek idejének léptetése, és a jármű továbbküldése a következő útra Óra Civil útról lámpás kereszteződésbe A szemafor állapotának és a kereszteződés foglaltságának megfelelően a civil jármű áthelyezése a kereszteződésbe, vagy az úton hagyása Óra Civil útról stop táblás kereszteződésbe A civil jármű várakozásra késztetése, majd a kereszteződés foglaltságának megfelelően a kereszteződésbe léptetése Óra Civil útról útra Civil jármű következő útra léptetése, ha az szabad, egyébként helyben hagyása Óra Civil kereszteződésből útra Civil jármű áthelyezése a kereszteződés egyik véletlenszerűen kiválasztott kijáratára, ha az szabad, egyébként helyben hagyása Óra 2010-05-12 45
Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Civil határon ki és be Civil jármű áthelyezése egy város kijáratról egy bejáratra ha az szabad, egyébként helyben hagyása Óra Tolvaj léptetése A tolvaj következő útra léptetése az irányításnak megfelelően Óra Tolvaj útról rejtekhelyre Ha a rejtekhely foglalt a játékot elveszítjük, ha szabad, akkor megnyerjük Óra Tolvaj kereszteződésből útra Az irányításnak megfelelő útra lép a tolvaj, ha az foglalt, akkor a játékot elveszítjük Óra Tolvaj útról kereszteződésbe Tolvaj belép a kereszteződésbe, ha az foglalt, akkor a játékot elveszítjük Óra Tolvaj útról útra Tolvaj a következő útra lép az irányításnak megfelelően, ha az foglalt, a játékot elveszítjük Óra Tolvaj határon ki A tolvaj kilép a városhatáron, a játkot elveszítjük Óra Rendőr léptetése A rendőr a következő útra lép Óra Rendőr határon ki és be A rendőr kilép a városhatáron és belép egy bejáraton Óra Rendőr kereszteződésből útra A rendőr a kereszteződés egy véletlenszerűen választott útjára lép, ha civil van rajta, akkor helyben marad, ha pedig tolvaj, akkor elkapja Óra 2010-05-12 46
Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Rendőr útról kereszteződésbe A rendőr a kereszteződésbe lép, ha azon civil van, akkor helyben marad, ha tolvaj, akkor elkapja Óra Rendőr útról útra A rendőr a következő útra lép, ha azon civil van, akkor helyben marad, ha pedig tolvaj, akkor elkapja Óra 4.2 Architektúra A szkeleton az egyes use-casek bemutatására szolgál, mely során meggyőződhetünk a szekvencia diagramjaink helyességéről. Az egyes eseteket előre megtervezett, lekódolt tesztpályákon ellenőrizhetjük. A szkeleton futása során megfigyelhetjük, hogy a függvényeink a szekvencia diagramokban feltüntetett sorrendben hívódnak-e meg. A hasonló eseteknek nem készítettünk külön tesztkörnyezetet. A pályák leírásában szerepel, hogy milyen a pálya felépítése, milyen járművek találhatók rajta és mely esetek tesztelésére szolgál. Az egyes esetek tesztelésére a lehető legkisebb tesztpályát hoztuk létre. 1. Tesztpálya Roadok száma: 2 Civilian száma: 1 Ez a tesztpálya az egyes Civilian mozgását mutatja be Roadról üres Roadra. Ugyanígy mozog a Police is. 2. Tesztpálya Roadok száma: 3 Civilian száma: 2 A tesztpálya az ütközések elkerülését szimulálja. A Policeok is így kerülik el az ütközést. 3. Tesztpálya Roadok száma: 3 Junctionok száma: 1 Roadsign száma: 1 Civilian száma: 1 A teszpályán kiválasztható, hogy milyen útjelzı legyen az útkeresztezıdésben. Megfigyelhetı, hogyan viselkedik a civil jármő a jelzıtábláknál, és az útválasztás. 4. Tesztpálya Borderin száma: 1 Road száma: 1 Borderout száma: 1 Civilian száma: 1 Megfigyelhetı a város elhagyásának, valamint az érkezésnek a módja. Ez vonatkozik a Civilianra és a Policera is. 5. Tesztpálya 2010-05-12 47
Roadok száma: 3 Junctionok száma: 1 Borderoutok száma: 2 Thiefek száma: 1 A tesztpályán a thief mozgása tesztelhetı (mozgás, útválasztás, Roadsignok figyelmen kívül hagyása), valamint a pályaelhagyás thief esetén. 6. Tesztpálya Roadok száma: 3 Thiefek száma: 1 Civilianok száma: 1 Thieffel történı ütközések szimulálására szolgál. Ez két esetre bontható szét, amikor Policeba vagy Civilianba ütközünk. 7. Tesztpálya Roadok száma: 1 Hideoutok száma: 1 Thiefek száma: 1 Ezen a tesztpályán figyelhetı meg, hogy mi történik mikor a Thief a Hideotra lép. 8. Tesztpálya Roadok száma: 2 Thiefek száma: 1 Police száma: 1 A pálya azt szimulálja, amikor egy Police elkapja a Thiefet. 9. Tesztpálya Roadok száma: 3 Junctionok száma: 1 Policeok száma: 1 Megfigyelhetı, hogy a rendır milyen módon lép be a keresztezıdésekbe és az útválasztás. 4.3 A szkeleton kezelői felületének terve, dialógusok A szkeleton célja annak bizonyítása, hogy a program képes-e az elvárt működést biztosítani, vagyis ellenőrizhető vele a szekvencia diagramok működőképessége. A szkeletonban már minden objektum a végleges interfészével szerepel, de algoritmusokat még nem tartalmaznak. Egy metódus meghívásakor a konzolra írja a következőket: az őt tartalmazó objektum neve, osztálya, hashcode-ja, metódus neve és paraméterlistája Az indentálás jelzi, hogy hány metódus fut az adott pillanatban. Ezután a metódus meghívja az általa használt többi metódust. A döntéseket a végleges programmal ellentétben nem a saját logikája alapján végzi, hanem a konzolon keresztül megkérdezi a felhasználót. A felhasználó kérdésre adott válasza (egész szám) után annak megfelelően folytatódik a program futása. Példa: Civil útról útra lép Program inditasa... { szglab4.city@14318bb letrehozva. 2010-05-12 48
{ szglab4.timer@10b30a7 letrehozva. } Kezdo use-case-ek: 1. civil 2. rendor 3. tolvaj Valassz a fentiek kozul: 1 { szglab4.civilian@530daa letrehozva. } 1. utrol utra 2. utrol lampas keresztezodesbe 3. utrol stopstablas keresztezodesbe 4. keresztezodesbol utra 5. hataron ki es be Valassz a fentiek kozul: 1 { szglab4.road@89ae9e letrehozva. } { szglab4.road@60aeb0 letrehozva. } { szglab4.road@89ae9e --> szglab4.road@60aeb0.setnextroad() } { <-- setvehicle() } { <-- setroad() } szglab4.city@14318bb --> szglab4.civilian@530daaontick() { szglab4.civilian@530daa --> szglab4.road@89ae9e.forwardcivilian() (szglab4.c ivilian@530daa) { szglab4.road@89ae9e --> szglab4.noroadsign@16caf43.entercivilian()(szglab4.civilian@530daa) { szglab4.noroadsign@16caf43 --> szglab4.road@60aeb0.stepcivilian() (szgla b4.civilian@530daa) { Legyen jarmu elotte(1. igen, 2. nem): 2 szglab4.road@60aeb0 --> szglab4.civilian@530daa.accept(szglab4.road@60 aeb0) { szglab4.civilian@530daa --> szglab4.road@89ae9e.removevehicle() { szglab4.road@89ae9e --> szglab4.noroadsign@16caf43.reset() <-- removevehicle } szglab4.civilian@530daa --> szglab4.road@60aeb0.setvehicle() (szglab 4.Civilian@530daa) { <-- setvehicle() 2010-05-12 49
} szglab4.civilian@530daa --> szglab4.civilian@530daa.setroad() (szgla b4.road@60aeb0) { <-- setroad() } <-- accept() } <-- stepcivilian() } <-- entercivilian() } <-- forwardcivilian() } <-- ontick() } } Kilepes a programbol... 2010-05-12 50
4.4 Szekvencia diagramok a belső működésre 4.4.1 Civil határon ki / Rendőr határon ki és be 2010-05-12 51
4.4.2 Civil kereszteződésből útra 2010-05-12 52
4.4.3 Civil útról útra 2010-05-12 53
4.4.4 Civil útról lámpás kereszteződésbe 2010-05-12 54
4.4.5 Civil stoptáblás kereszteződésbe 2010-05-12 55
4.4.6 Rendőr kereszteződésből útra lép 2010-05-12 56
4.4.7 Rendőr útról keresztezősbe lép 2010-05-12 57
4.4.8 Rendőr útról útra lép 2010-05-12 58
4.4.9 Tolvaj kereszteződésből útra lép 2010-05-12 59
4.4.10 Tolvaj határon ki 2010-05-12 60
4.4.11 Tolvaj útról rejtekhelyre 2010-05-12 61
4.4.12 Tolvaj útról kereszteződésbe lép 2010-05-12 62
4.4.13 Tolvaj útról útra 2010-05-12 63
4.4.14 Játék indítása 2010-05-12 64
4.4.15 Idő léptetése 2010-05-12 65
4.5 Napló Kezdet Időtartam Résztvevők Leírás 2010.03.10. 12:00 5 óra Pál Use-case-ek dokumentálása és rajzolása 2010.03.10. 12:00 4 óra Szárnyas Inicializálás és idő léptetése szekvendiagramok elkészítése, kezelői felület kialakítása 2010.03.10. 12:00 6 óra Bodó Szekvenciadiagramok use-case-ekhez társítása, apróbb módosítások, tesztpályák 2010.03.10. 23:00 1 óra Szárnyas Dokumentum összerendezése, nyomtatás 2010-05-12 66
5. Szkeleton beadása 5.1 Fordítási és futtatási útmutató Az szglab4.zip állomány tartalmazza a program forráskódját, a fordításhoz, futtatáshoz és a dokumentáció generálásához szükséges parancsfájlokat. A futtatható állományok és a dokumentáció elkészítéséhez az első lépés a.zip fájl kicsomagolása. Az így kapott állományok és mappák listája az alábbiakban látható. 5.1.1 Fájllista A forrásállományokat tartalmazó./szglab4 mappa tartalma: Fájl neve Méret Keletkezés ideje Tartalom BorderIn.java 62 2010.03.16. 19:21 Bemenő út osztály BorderOut.java 321 2010.03.16. 19:21 Kimenő út osztály City.java 5830 2010.03.16. 19:21 Város osztály Civilian.java 1987 2010.03.16. 19:21 Civil jármű osztály Direction.java 73 2010.03.16. 19:21 Irány enumeráció EnumColor.java 59 2010.03.16. 19:21 Szín enumeráció HideOut.java 583 2010.03.16. 19:21 Rejtekhely osztály ITickable.java 104 2010.03.16. 19:21 Időzíthető interfész Logger.java 2755 2010.03.17. 10:34 Naplózó osztály Junction.java 1081 2010.03.16. 19:21 Kereszteződés osztály Main.java 239 2010.03.16. 11:12 Main osztály, belépési pont NoRoadSign.java 1398 2010.03.16. 19:21 Üres útjelző osztály Police.java 2082 2010.03.16. 19:21 Rendőr osztály Road.java 4397 2010.03.16. 19:21 Út osztály RoadSign.java 1141 2010.03.16. 19:21 Útjelző tábla absztrakt osztály Semaphore.java 1722 2010.03.16. 19:21 Jelzőlámpa osztály StopSign.java 2266 2010.03.16. 19:21 Stoptábla osztály Thief.java 3552 2010.03.16. 19:21 Tolvaj osztály Timer.java 636 2010.03.16. 19:21 Időzítő objektum User.java 596 2010.03.17. 10:50 Felh. interakció osztály Vehicle.java 2201 2010.03.16. 19:21 Jármű absztrakt osztály A futtatáshoz szükséges parancsfájlokat tartalmazó./ mappa tartalma: Fájl neve compile.bat doc.bat run.bat set_java_home.bat szglab4.manifest Méret Keletkezés ideje Tartalom 145 2010.03.17. 13:30 Fordítás 308 2010.03.17. 13:52 Dokumentáció generálása 72 2010.03.17. 13:46 Futtatás 166 2010.03.17. 12:51 JAVA_HOME környezeti változó beállítása 26 2010.03.17. 13:23 A fordításhoz szükséges manifest állomány 2010-05-12 67
5.1.2 Fordítás A fordítás a compile.bat állomány futtatásával végezhető. A fordítás előfeltétele, hogy a JAVA_HOME környezeti változó az 1.6-os Java JDK könyvtárának helyét tartalmazza. Amennyiben ez nincs beállítva, 4 a set_java_home.bat állományban a REM SET JAVA_HOME="C:\Program Files\Java\jdk1.6.0_17" parancs előtti kommentjelzés (REM) megszüntetésével állítható be. A pontos cím és a jdk utáni verziószám természetesen függ a használt konfigurációtól. Sikeres fordítás esetén a./szglab4 mappában létrejönnek a.class állományok, a./ mappában pedig az szglab4.jar állomány. 5.1.3 Futtatás Sikeres fordítás után a kapott szglab4.jar állomány a run.bat futtatásával indítható. A java.exe is a JDK része, ezért a JAVA_HOME környezeti változó beállítására a fordításnál leírtak ide is érvényesek. Futtatáskor a program felajánlja a kezdeti use-case-eket, amelyekből a felhasználó számmal választhat. Hibás választás esetén a program futása véget ér. Ha egy metódus döntésre kényszerül, felhasználói beavatkozás dönti el, hogy mi történjen. Ehhez is egy számot kell beírnia a felhasználónak. Természetesen minden use-case tartalmazza (<<includes>>) az init use-case-t, amiben létrejönnek a felhasznált objektumok és egymással kapcsolatba kerülnek (pl. a jármű az útra kerül, két út egy útjelző csatoló osztályon keresztül összekötődik). A kért use-case kiválasztása után először az init use-case működése figyelhető meg, utána fut le a konkrét use-case szekvenciája. A szkeleton elkészítésénél egy utólag vitatható tervezési döntést hoztunk, miszerint a függvények hívása előtt hívjuk meg a Logger osztály Log metódusát és kiírjuk a hívó objektum és a hívott objektum típusát és hashcode-ját, valamint a meghívott metódust és annak paramétereit. Így szemléletesebben látható, hogy melyik objektum melyik másik objektumot hívja, ugyanakkor minden hívásnál oda kell figyelni ennek beszúrására. Persze az is jó megoldás lenne, ha minden metódus meghíváskor kiírná az őt tartalmazó objektum típusát, hashcode-ját és a saját paramétereit ekkor az indentáció segítségével lehetne eldönteni, hogy melyik objektum hívta a metódust. Mivel ez a szkeleton használhatóságát nem befolyásolja, úgy döntöttünk, megtartjuk az eredeti megoldásunkat. 5.1.4 Dokumentáció generálása A Javadoc dokumentáció a doc.bat futtatásával készíthető el. A javadoc.exe is a JDK része, ezért a JAVA_HOME környezeti változó beállítására a fordításnál leírtak ide is érvényesek. Sikeres futtatás esetén a dokumentáció a docs mappába kerül, ahonnan az index.html-t megnyitva tekinthető meg. 4 Parancssorban (Start menü Futtatás cmd) a SET %JAVA_HOME% paranccsal ellenőrizhető. 2010-05-12 68
5.1.5 Értékelés Tapasztalatlanságunkból fakadóan sok nehézséggel szembesültünk az IDE környezet beállítása, az SVN rendszer telepítése és a batch fájlok készítése során is. A csapatmunkát nagyban segítette, hogy mindhárman kollégisták vagyunk, így a közös értekezletek megszervezése nagyon egyszerű volt. A munkából a csapat minden tagja legjobb képességeinek megfelelően kivette részét, a feladatokat sikerült egyenletesen felosztanunk és a munkafolyamatokat a lehetőségeknek megfelelően párhuzamosítanunk. Tag neve Munka százalékban Bodó Péter 33 Pál Tamás 33 Szárnyas Gábor 34 5.2 Napló Kezdet Időtartam Résztvevők Leírás 2010.03.15. 18:00 3 óra Szárnyas SVN repository létrehozása 2010.03.15. 21:00 2 óra Bodó Subclipse beállítása 2010.03.15. 21:00 2 óra Pál SVN beállítása 2010.03.16. 18:00 2 óra Szárnyas Osztálydiagramnak megfelelő.java állományok legenerálása 2010.03.16. 22:00 2 óra Bodó Pál SVN tesztelése, feladatok felosztása Szárnyas 2010.03.17. 10:00 2 óra Szárnyas Main, Logger és User osztály implementálása 2010.03.17. 12:00 3 óra Szárnyas Fordítás, futtatás és dokumentációgenerálás batch fájljainak elkészítése 2010.03.17. 12:00 8 óra Bodó Pál Szekvenciadiagramok implementálása, Javadoc dokumentáció készítése 2010.03.17. 20:00 2 óra Szárnyas CLI elkészítése 2010.03.17. 22:00 2 óra Bodó Pál Szárnyas Tesztesetek végigfuttatása, javítások 5.3 Statisztika A munkaórák összege a 6. beadandó elkészítésével bezárólag. Tag neve Munkaórák Bodó Péter 47 2010-05-12 69
Pál Tamás 46 Szárnyas Gábor 47 2010-05-12 70
6. Prototípus koncepciója 6.1 Prototípus interface-definíciója A program prototípusa konzolos felületen keresztül lesz irányítható előre specifikált parancsok segítségével. A prototípus tesztelési célokat lát el, hiszen képet kapunk a program belső működéséről. A tesztelést előre megírt parancssorozatokkal és tesztpályákkal végezzük, majd a kapott eredményt összehasonlítjuk az elvárt kimenettel, így a hibás működés kiszűrhető. 6.1.1 Az interfész általános leírása A prototípus input és output felületnek csak a szabványos be- és kimenetet használhatja, ill. fájlból olvashatónak és fájlba menthetőnek kell lennie. Utóbbi beállításokra külön parancsokat hoztunk létre, így az prototípus tesztelése kötegelt állománnyal egyszerűen végezhető. 6.1.2 Paraméterek A prototípus működését batch állománnyal való tesztelés segítésére paraméterezhetően valósítottuk meg. A prototípus meghívásának módja: java -jar szglab4.jar inputfile outputfile 6.1.3 Bemeneti nyelv loadmap map.txt Betölti és felépíti a map.txt állományban található pályát exit Kilép a programból tick [tickcount] tickcount számút lép, ha nincs megadva, 1-et showmap Kiírja a pályán található utak és járművek mátrixait. deterministic on off Beállítja, hogy a történések véletlenszerűek vagy determinisztikusak legyenek. nextdirection id TOP RIGHT BOTTOM LEFT Csak deterministic on esetén alkalmazható. A következő döntési helyzetben az id azonosítójú jármű a specifikált irányba fog mozogni. movethief TOP RIGHT BOTTOM LEFT A játékos figuráját a specifikált irányba mozgatja // [komment] Komment (a // után szóköz szükséges). 2010-05-12 71
6.1.4 Pályaformátum A program a pálya konfigurálását külön a pályát leíró fájl alapján végzi. Ez három fő részből fog állni: utakat, járműveket, és útjelzőket tartalmazó rész. A fájl első N sora tartalmazza a város felépítéséhez szükséges útszakaszokat leíró információkat. Minden sor M karakterből áll, egy karakter egy útszakasznak felel meg, így ez az N M karakter méretű mátrix a város térképe. A különböző útszakaszokat a következő karakterek írják le: [R] útszakasz [J] kereszteződés [I] városba belépő útszakasz [O] városból kilépő útszakasz [H] rejtekhely [-] üres mező Példa: ----O---- ----R---- IRRRJRRRO ----R---- ----I---- Az utak irányát később állítjuk be az utak egymás közötti kapcsolataiból (JOIN). A következő N sor az úthálózaton levő járműveket tartalmazza az előzőek szerinti NxMes elrendezés alapján. A járműveket a következő karakterek írják le: [T] tolvaj (csak egy lehet belőle a pályán) [P] rendőr [C] civil [-] jármű nélküli mező Példa: --------- ----C---- --C----P ----T---- --------- A fájl további részében utasítások találhatóak a pálya felépítésére és a járművekre vonatkozóan. Egy JOIN X1 Y1 X2 Y2 TIPUS [INTA INTB PERIOD] sor ír le egy összeköttetést két útszakasz között a megfelelő szabályok szerint. Egy sor szóközökkel elválasztva a következő információkat tartalmazza: az első útszakasz első koordinátája (egész szám) az első útszakasz második koordinátája (egész szám) 2010-05-12 72
a második útszakasz első koordinátája (egész szám) a második útszakasz második koordinátája (egész szám) az útszakaszok közötti útjelző típusa (szemafor: [S], stop tábla: [T], útjelző nélküli: [N]) Szemafor esetén a sor végén további három elem található: a szemaforra jellemző intervallum kezdete (egész szám) a szemaforra jellemző intervallum vége (egész szám) a szemafor periódusideje (egész szám) Az útszakaszok első koordinátája a sorának száma, a második pedig az oszlopának száma. A bal felső útszakasz koordinátái [0, 0], a jobb alsóé [N, M]. Példa: JOIN 2 3 2 2 N JOIN 1 1 1 2 S 5 8 10 Egy VEHICLE N M F sorral az [N, M] koordinátákon szereplő autó F frekvenciája állítható be. Példa: VEHICLE 1 2 9 6.1.5 Kimeneti nyelv A program indításakor az alábbi üzenet jelenik meg: Program loaded. Ezután a program felhasználói utasításra vár. Az egyes utasítások eredménye a következő lehet: input inputfile "inputfile" does not exist. "inputfile" loaded. output mode [outputfile] Output mode set to 0. Output mode set to 1. Output mode set to 2. Cannot access "outputfile". loadmap map.txt exit "map.txt" does not exist. "map.txt" loaded. Goodbye. 2010-05-12 73
tick [tickcount] Civilian [id] moved from [X1, Y1] to [X2, Y2]. Civilian exited the city [X1, Y1], entered the city [X2, Y2]. Police [id] moved from [X1, Y1] to [X2, Y2]. Police exited the city [X1, Y1], entered the city [X2, Y2]. Thief moved from [X1, Y1] to [X2, Y2]. Thief reached the hideout. Thief exited the city [X, Y]. Thief crashed with vehicle [id]. Police [id] caught the Thief. Semaphore changed color to [piros/zold]. StopSign changed state to [alap/visszaszamol/beenged]. showmap Roads: ----O---- ----R---- IRRRJRRRO ----R---- ----I---- Vehicles: --------- ----C---- --C----P ----T---- --------- deterministic on off Game logic is set to deterministic. Game logic is set to random. nextdirection id TOP RIGHT BOTTOM LEFT Vehicle [id]'s next direction is TOP RIGHT BOTTOM LEFT. 6.2 Összes részletes use-case 6.2.1 Játékos use-case-ei Use-case neve Rövid leírás Játék indítása A pálya inicializálása, mezők, járművek, útjelzők 2010-05-12 74
Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok 6.2.2 Óra use-case-ei Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok létrehozása és beállítása Játékos Tolvaj mozgatása foglalt útra A tolvaj összeütközik az úton levő járművel, a játékot elveszítjük Játékos Tolvaj mozgatása szabad útra A tolvaj átkerül az új útszakaszra Játékos Rejtekhelyre lép A tolvaj megmenekül, a játékot megnyerjük Játékos Városból kilép A tolvaj elhagyja a játékteret, a játékot elveszítjük Játékos Útról útra vagy kereszteződésbe lép A tolvaj átkerül az új útra vagy kereszteződésbe Játékos Kereszteződésből útra lép (irányt választ) A tolvaj a választásunknak megfelelő útra lép Játékos Idő léptetése Üzenetet küldése minden időre cselekvő dolognak a pályán Óra Szemafor működtetése A szemaforok idejének léptetése, színeiknek beállítása a paramétereiknek megfelelően Óra Stop tábla működtetése A stop táblák idejének léptetése, belső állapotaik beállítása Óra Járművek léptetése Minden jármű idejének léptetése Óra 2010-05-12 75
Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Civil léptetése A civil járművek idejének léptetése, és a jármű továbbküldése a következő útra Óra Civil útról lámpás kereszteződésbe A szemafor állapotának és a kereszteződés foglaltságának megfelelően a civil jármű áthelyezése a kereszteződésbe, vagy az úton hagyása Óra Civil útról stop táblás kereszteződésbe A civil jármű várakozásra késztetése, majd a kereszteződés foglaltságának megfelelően a kereszteződésbe léptetése Óra Civil útról útra Civil jármű következő útra léptetése, ha az szabad, egyébként helyben hagyása Óra Civil kereszteződésből útra Civil jármű áthelyezése a kereszteződés egyik véletlenszerűen kiválasztott kijáratára, ha az szabad, egyébként helyben hagyása Óra Civil határon ki és be Civil jármű áthelyezése egy város kijáratról egy bejáratra ha az szabad, egyébként helyben hagyása Óra Tolvaj léptetése A tolvaj következő útra léptetése az irányításnak megfelelően Óra Tolvaj útról rejtekhelyre Ha a rejtekhely foglalt a játékot elveszítjük, ha szabad, akkor megnyerjük Óra Tolvaj kereszteződésből útra Az irányításnak megfelelő útra lép a tolvaj, ha az foglalt, akkor a játékot elveszítjük 2010-05-12 76
Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Use-case neve Rövid leírás Aktorok Óra Tolvaj útról kereszteződésbe Tolvaj belép a kereszteződésbe, ha az foglalt, akkor a játékot elveszítjük Óra Tolvaj útról útra Tolvaj a következő útra lép az irányításnak megfelelően, ha az foglalt, a játékot elveszítjük Óra Tolvaj határon ki A tolvaj kilép a városhatáron, a játkot elveszítjük Óra Rendőr léptetése A rendőr a következő útra lép Óra Rendőr határon ki és be A rendőr kilép a városhatáron és belép egy bejáraton Óra Rendőr kereszteződésből útra A rendőr a kereszteződés egy véletlenszerűen választott útjára lép, ha civil van rajta, akkor helyben marad, ha pedig tolvaj, akkor elkapja Óra Rendőr útról kereszteződésbe A rendőr a kereszteződésbe lép, ha azon civil van, akkor helyben marad, ha tolvaj, akkor elkapja Óra Rendőr útról útra A rendőr a következő útra lép, ha azon civil van, akkor helyben marad, ha pedig tolvaj, akkor elkapja Óra 6.3 Tesztelési terv 6.3.1 Tesztelés menete A prototípus fordítása és indítása a szkeletonhoz hasonlóan kötegelt állományokkal (compile.bat és run.bat) lehetséges. 2010-05-12 77
A prototípus alapértelmezésben a szabványos ki- és bemenetet használja, de a megfelelő parancsok segítségével átirányíthatóak fájlba írása, ill. fájlból olvasásra. Mindkét esetben csak a 7.1.2 pontban specifikált utasítások használhatóak és egy sor egy utasítást tartalmazhat. A kért tesztesek lefuttatása után a program összehasonlítja a kapott kimenetet az elvárt kimenettel és kiírja, hogy ezek megegyeznek-e. 6.3.2 Teszt-esetek Teszt-eset neve Civilian (Police) mozgása Roadról Roadra Rövid leírás Civilianok száma: 1 Policok száma: 1 Civilianok száma : 1 Roadok száma: 4 Teszt célja A tesztpályán megfigyelhető a Civil jármű mozgása útról útra. A Police is ugyanígy lép útról útra Teszt-eset neve Város elhagyása, érkezés Rövid leírás Civilianok száma: 1 BorderInek száma: 1 BorderOutok száma: 1 Teszt célja Azt szimulálja, hogyan hagyja el a várost a civil jármű és hogyan érkezik oda meg Teszt-eset neve Ütközés elkerülés Rövid leírás Roadok száma: 3 Civilianok száma: 2 Teszt célja Megfigyelhető, hogy hogyan kerülik el az ütközést a civil járművek, és a Rendőrök Teszt-eset neve Civilian útról szemaforos kereszteződésbe Rövid leírás Roadok száma: 4 Junction száma: 2 Stopsignok száma: 1 Semaphorok száma: 1 Civilek száma: 1 Teszt célja Civil járműnek a viselkedését figyelhetjük meg útjelzőnél, és az irányválasztást. Teszt-eset neve Thief mozgása Rövid leírás Roadok száma: 4 Junctionok száma: 2 Borderoutok száma: 2 Stopsignok száma: 1 Semaphorok száma: 1 Thiefek száma: 1 Teszt célja A tesztpályán a thief mozgása tesztelhető (mozgás, útválasztás, Roadsignok figyelmen kívül hagyása), valamint a pályaelhagyás Thief esetén. 2010-05-12 78
Teszt-eset neve Elkapás Rövid leírás Roadok száma: 2 Policok száma: 1 Thiefek száma: 1 Teszt célja A pálya azt szimulálja, amikor egy Police elkapja a Thiefet. Teszt-eset neve Ütközés Rövid leírás Roadok száma: 3 Junctionok száma: 1 Civilian száma: 1 Policeok száma: 1 Thiefek száma : 1 Teszt célja Ez a tesztpálya szimulálja a Thief ütközését Civiliannal vagy Police-szal Teszt-eset neve Győzelem Rövid leírás Roadok száma: 1 Hideoutok száma: 1 Thiefek száma: 1 Teszt célja Megfigyelhető, hogy mi történik, ha a tolvaj eléri a Hideoutot Teszt-eset neve Police Roadról Junctionba Rövid leírás Roadok száma: 3 Junctionok száma: 1 Policeok száma: 1 Teszt célja Megfigyelhető, hogy a rendőr milyen módon lép be a kereszteződésekbe és az útválasztás. 2010-05-12 79
6.4 Napló Kezdet Időtartam Résztvevők Leírás 2010.03.24. 14:00 3 óra Bodó Pál Szárnyas Prototípus koncepciójának kidolgozása, feladatok kiosztása, use-case-ek kitöltése 2010.03.24. 17:00 2 óra Szárnyas cmp.exe használata, tesztelés menete 2010.03.24. 17:00 2 óra Bodó tesztesetek dokumentálása 2010.03.24. 17:00 2 óra Pál pályaformátum megalkotása 2010.03.24. 18:00 4 óra Bodó Pál Szárnyas Bemeneti és kimeneti nyelv megalkotása és dokumentálása 2010-05-12 80
7. Részletes tervek 7.1 Osztályok és metódusok tervei 7.1.1 City A várost megvalósító objektum, tartalmazza a város mezőit, a járműveket és a Timer objektumot. Felelősség A City hozza létre és tárolja a játék objektumait. A járműveket a vehicles tömbben, az utakat a roads tömbben. Ez az osztály felelős a játék végéért, ha nyerünk vagy vesztünk. Ősosztályok Nincs Interfészek Nincs Attribútumok -timer: Timer referencia a Timer objektumra -vehicles: ArrayList<Vehicle> a járműveket tartalmazó tömb -roads: Road[][] a pálya mezőit tartalmazó kétdimenziós tömb -thiefid: int A tolvaj azonosítója -view: View A megjelenítőosztályok interfésze -gamerunning: boolean A játék futásának állapota -inputfilename: String A térképállomány neve -outputfilename: String A kimeneti állomány neve Metódusok -void loadmap(mapfilename: String, view: View_) Betölti a térképet, a járműveket, összekapcsolja az utakat, és beállítja a járművek frekvenciáit. +void win() A játék megnyerése, leállítja a timert. +void gameover() A játék elvesztése, eállítja a timert. +void actionperformed(actionevent e) Lekezeli az eseményeket. +void keypressed(keyevent e) 2010-05-12 81
Gomb nyomvatartásakor lefutó függvény. +void keyreleased(keyevent e) Gombfelengedés esetén lefutó függvény. +void repaint() Újrarajzolja az utakat, útjelzőket, és a járműveket. +void exit() Kilépés a programból. 7.1.2 Timer Az időzítőobjektum. Felelősség Tartalmaz egy tömböt az összes tickelhető objektumról, amiknek meghatározott időnként meghívja az ontick metódusait. Ősosztályok Nincs Interfészek Nincs Attribútumok -tickables: ArrayList<ITickable> a tickelhető objektumok heterogén kollekciója -t: javax.swing.timer beépített timer objektum Metódusok +void tick() Meghívja a tickables elemeinek ontick metódusait. +void addtickable(t: ITickable) A kapott objektumot hozzáadja a tickables tömbhöz. +void removetickable(t:itickable) A kapott objektumot törli a tickables tömbből. +void start() Elindítja a timer objektumot. +void stop() Megállítja a timer objektumot. 7.1.3 ITickable <<interface>> A tickelhető objektumok közös interfésze. Minden osztály megvalósítja, ami az időtől függően változik. Felelősség Nincs 2010-05-12 82
Ősosztályok Nincs Interfészek Nincs Attribútumok Nincs Metódusok +void ontick() A tick hatására végbemenő eseményeket valósítja meg. 7.1.4 Vehicle A járműveket megvalósító osztály. Felelősség Azokat az attribútumokat és metódusokat tartalmazza, amik minden járműre jellemzőek. Ősosztályok Nincs Interfészek ITickable Attribútumok #r: Road referencia az adott járművet tartalmazó útra #frequency: int a jármű frekvenciája, ennyi tick telik el két lépés között #state: int az előző lépés óta eltelt idő #view: IView referencia a megjelenítő osztályok interfészére #nextdirection: Direction a következő kereszteződésnél ebbe az irányba fog továbbmenni a jármű ha lehetséges -id: int a jármű azonosítója Metódusok +void ontick() Timer által meghívott időzítő függvény, ami a leszármazottakban felül van definiálva +void choose(j: Junction, directions: Direction[]) 2010-05-12 83
A kapott irányokból választ egyet, majd meghívja a Junction osztály megfelelő exit függvényét. +void incoming(v: Vehicle) - +void catchvehicle() - +void steponpolice() - +void steponcivilian() - +void steponthief(t: Thief) - +void steponbunny() - +void accept(r: Road) A járművet áthelyezi a következő útra úgy, hogy meghívja a Road removevehicle() függvényét, a következő Road setvehicle(v: Vehicle) függvényét saját magával, és a Vehicle setroad(r: Road) függvényét a következő úttal. +void setroad(r: Road) A Vehicle r referenciáját állítja be a kapott útra. +void setfrequency(int f) A frekvenciát állítja be. +int getid() Az id-t adja vissza. +void setid(int id) Az id-t állítja be. +void setnextdirection(nextdirection: Direction) Beállítja a nextdirection értékét. +Direction getnextdirection() A nextdirection értékével tér vissza. +Road getroad() Az r értékével tér vissza. +void setview(view: IView) Beállítja a view értékét. 7.1.5 Bunny A húsvéti nyuszit megvalósító objektum. Felelősség Időnként megjelenik a pályán. Ha rendőr vagy civil üti el, a nyuszi eltűnik; ha tolvaj, a nyuszi eltűnik és a tolvaj bizonyos ideig halhatatlan lesz. Ősosztályok Vehicle Interfészek ITickable 2010-05-12 84
Attribútumok -frequency: int a nyuszi pályán tartózkodásának idejét határozza meg -state: int a nyuszi pályán tartózkodásának idejét méri -live: boolean Ha a nyuszi él igaz, egyébként hamis. Metódusok +void ontick() Növeli a state értékét eggyel, ha egyezik a frequency-vel, akkor leveszi magát az útról. +void choose(j: Junction, directions: Direction[]) Üres függvény. +void incoming(v: Vehicle) Meghívja a paraméterként kapott jármű steponbunny() metódusát, majd törli magát az útról. +void steponpolice() Üres függvény. +void steponcivilian() Üres függvény. +void steponthief(t: Thief) Üres függvény. +void steponbunny() Üres függvény. +void reborn() Újjáéleszti a nyuszit. +void catchvehicle(v: Vehicle) 2010-05-12 85
Meghívja a paraméter incoming(v: Vehicle) függvényét. 7.1.6 Police A rendőrt megvalósító objektum. Felelősség Az útjelzőket figyelmen kívül hagyja, civillel nem ütközik, és a tolvajt elkaphatja, ha nekimegy. Ősosztályok Vehicle Interfészek ITickable Attribútumok -notdestroyed: boolean Ha a rendőr elpusztult, az értéke hamis lesz. Metódusok +void ontick() Növeli a state értékét eggyel, ha egyezik a frequencyvel, akkor nullázza és meghívja a Road objektum forwardpolice(p: Police) függvényét saját referenciáját átadva paraméterként. +void choose(j: Junction, directions: Direction[]) 2010-05-12 86
A kapott irányok közül véletlenszerűen választ, majd meghívja a Junction exitpolice(p: Police, dir: Direction[]) függvényét saját magával és a választott iránnyal. +void incoming(v: Vehicle) A paraméterül kapott jármű steponpolice() függvényét hívja meg. +void steponpolice() Üres függvény. +void steponcivilian() Üres függvény. +void steponthief(t: Thief) Meghívja a Thief catchvehicle() függvényét. +void steponbunny() Üres függvény. +void catchvehicle(v: Vehicle) Üres függvény. +boolean getdestroyed() A notdestroyed változó értékével tér vissza. +void Destroyed() A notdestroyed értékét hamisra állítja. 7.1.7 Civilian A civil járművet megvalósító objektum. Felelősség Más járműnek nem megy neki mozgása során. Ősosztályok Vehicle Interfészek ITickable Attribútumok Metódusok +void ontick() Növeli a state értékét eggyel, ha egyezik a frequencyvel, akkor nullázza és meghívja a Road objektum forwardcivilian(c: Civilian) függvényét saját referenciáját átadva paraméterként. 2010-05-12 87
+void choose(j: Junction, directions: Direction[]) A kapott irányok közül véletlenszerűen választ, majd meghívja a Junction exitcivilian(c: Civilian, dir: Direction[]) függvényét saját magával és a választott iránnyal. +void incoming(v: Vehicle) A paraméterül kapott jármű steponcivilian() függvényét hívja meg +void catchvehicle(v: Vehicle) Üres függvény +void steponpolice() Üres függvény. +void steponcivilian() Üres függvény. +void steponthief(t: Thief) Üres függvény. +void steponbunny() Üres függvény. 7.1.8 Thief A tolvajt megvalósító objektum. Felelősség A játékos irányítja, az útjelzőket figyelmen kívül hagyja, ha más járművel ütközik vége a játéknak, ha a nyuszit elüti védelmet kap egy időre. Ősosztályok Vehicle 2010-05-12 88
Interfészek ITickable Attribútumok +invulnerable: int() Ha az értéke nem nulla, akkor sebezhetetlen a tolvaj a rendőr által annyi ideig amennyi az értéke. Metódusok +void ontick() Meghívja a Road objektum forwardthief(t: Thief) függvényét saját magával. Ha az invulnerable értéke nem nulla, akkor csökkenti. +void choose(j: Junction, directions: Direction[]) Meghívja a Junction exitthief(t: Thief, dir: Direction[]) függvényét saját magával és a nextdirectionnel. +void incoming(v: Vehicle) Meghívja a Vehicle steponthief függvényét. +void exit() Meghívja a City gameover() függvényét. +void hide(h: HideOut) Meghívja a HideOut accept() függvényét, majd a City win() függvényét. +void steponpolice() 2010-05-12 89
Ha a tolvaj sebezhető, akkor meghívja a City gameover() függvényét. Ha sebezhetetlen, akkor elpusztítja a rendőrt, és átteszi magát a következő útra. +void steponcivilian() Meghívja a City gameover() függvényét.. +void steponthief(t: Thief) Üres függvény. +void steponbunny() Az invulnerable értékét 15-re állítja. +void catchvehicle() Ha a tolvaj sebezhető, rálépteti a rendőrt, ha sebezhetetlen, meghívja a City gameover() függvényét. 7.1.9 Road A város útjait megvalósító osztály. Felelősség A rajta levő járművet továbbküldi a következő útra a jármű kérésére. Ősosztályok Nincs Interfészek Nincs Attribútumok #v: Vehicle referencia az úton levő járműre #roads: RoadSign[] azon utakhoz tartozó útjelzők referenciája, amelyekre az adott útról lépni lehet #view: IView referencia a megjelenítő osztályok interface-ére #x: int az út egyik koordinátája #y: int az út egyik koordinátája Metódusok +void steppolice(p: Police) Ha a Road üres, akkor a Police accept(r: Road) függvényét hívja saját magával, ha nem üres, akkor a rajta levő jármű incoming(v: Vehicle) függvényét hívja a kapott paraméterrel. 2010-05-12 90
+void stepcivilian(c: Civilian) Ha a Road üres, akkor a Civilian accept(r:road) függvényét hívja saját magával, ha nem üres, akkor a rajta levő jármű incoming(v: Vehicle) függvényét hívja a kapott paraméterrel. +void stepthief(t: Thief) Ha a Road üres, akkor a Thief accept(r: Road) függvényét hívja saját magával, ha nem üres akkor a rajta levő jármű incoming(v: Vehicle) függvényét hívja a kapott paraméterrel. 2010-05-12 91
+void setvehicle(v: Vehicle) Beállítja a Road r referenciáját a kapott paraméterre. +void removevehicle() A Road értékét nullra állítja, és meghívja a RoadSign-ok reset() függvényeit. Notify()-t hív. +void forwardpolice(p: Police) Meghívja a RoadSign enterpolice(p: Police) függvényét a kapott paraméterrel. +void forwardcivilian(c: Civilian) Meghívja a RoadSign entercivilian(c: Civilian) függvényét a kapott paraméterrel. +void forwardthief(t: Thief) Meghívja a RoadSign enterthief(t: Thief) függvényét a kapott paraméterrel. +void addroad(r: Road, roads: RoadSign) Beállítja a roads értékét a kapott paraméterre, és meghívja a RoadSign setnextroad(r: Road) függvényét r-rel. +void setvehiclefrequency(int f) A jármű sebességét állítja be. +int getx() Az út x koordinátáját adja vissza. +int gety() Az út y koordinátáját adja vissza. +void setx() Az út x koordinátáját állítja be. +void gety() Az út y koordinátáját állítja be. +void setview(view: IView) A view referencia értékét állítja be. +Color color() Az út színét adja vissza. +void notifyroadsigns() Az úthoz tartozó útjelzőket rajzolja újra. 2010-05-12 92
+boolean getvehicle() Ha az úton van jármű igazzal tér vissza, egyébként hamissal. +void ArrayList<Direction> getdirections() Visszaadja, hogy milyen irányokba lehet továbbhaladni. 7.1.10 HideOut A tolvaj búvóhelyét megvalósító osztály. Felelősség Ha a tolvaj rálép, amikor üres, megnyeri a játékot. Ősosztályok Road Interfészek Nincs Attribútumok Metódusok +void stepthief(t: Thief) Ha a HideOut üres, meghívja a Thief hide() függvényét, ha nem üres, meghívja a Thief incoming() függvényét. 7.1.11 BorderIn A városba bemenő utat megvalósító osztály. Felelősség A városból kilépő, majd a városba belépő járművek itt jelennek meg. Ősosztályok Road Interfészek Nincs Attribútumok Nincs Metódusok Nincs 7.1.12 BorderOut A városból kivezető utakat megvalósító osztály. 2010-05-12 93
Felelősség Az innen továbbhaladó járművek egy bejáraton jelennek meg, kivéve a tolvaj, ami veszíti a játékot, ha kilép. Ősosztályok Road Interfészek Nincs Attribútumok Nincs Metódusok +void forwardthief(t: Thief) Meghívja a Thief exit() függvényét. 7.1.13 Junction A városban levő útkereszteződéseket megvalósító osztály. Felelősség A rajta levő járműveket kérésükre továbbküldi a kivezető utak valamelyikére. Ősosztályok Road Interfészek Nincs Attribútumok Nincs Metódusok +void forwardpolice(p: Police) Meghívja a Police choose(j: Junction, dir: Direction[]) függvényét saját magával, és a válaszható irányok tömbjével +void forwardcivilian(c: Civilian) Meghívja a Civilian choose(j: Junction, dir: Direction[]) függvényét saját magával, és a válaszható irányok tömbjével. +void forwardthief(t: Thief) Meghívja a Thief choose(j: Junction, dir: Direction[]) függvényét saját magával, és a válaszható irányok tömbjével. +void exitpolice(p: Police, dir: Direction) Meghívja a megfelelő irányhoz tartozó RoadSign enterpolice(p: Police) függvényét a kapott paraméterrel. +void exitcivilian(c: Civilian, dir: Direction) 2010-05-12 94
Meghívja a megfelelő irányhoz tartozó RoadSign entercivilian(c: Civilian) függvényét a kapott paraméterrel. +void exitthief(t: Thief, dir: Direction) Meghívja a megfelelő irányhoz tartozó RoadSign enterthief(t: Thief) függvényét a kapott paraméterrel. 7.1.14 RoadSign A forgalmat szabályozó útjelzéseket megvalósító osztály. Felelősség A Roadok közötti csatoló osztály, amely összeköthet utat úttal (pl. gyalogos-átkelőhely) és utat kereszteződéssel is (pl. jelzőlámpa, STOP tábla). Ősosztályok Nincs Interfészek ITickable Attribútumok #r: Road referencia a következő útra #view: IView referencia a megjelenítőosztályok interfészére -x: int az útjelzőhöz tartozó út egyik koordinátája -y: int az útjelzőhöz tartozó út egyik koordinátája -direction: Direction az útjelző iránya Metódusok +void ontick() A tick hatására végbemenő eseményeket valósítja meg. +void reset() Absztrakt függvény +void enterpolice(p: Police) Absztrakt függvény +void entercivilian(c: Civilian) Absztrakt függvény +void enterthief(t: Thief) Absztrakt függvény +void setnextroad(r: Road) Beállítja a RoadSign r értékét a kapott paraméterre. +void setview(view: IView) Beállítja a view attribútumot a kapott paraméterre. +void setx(x: int) 2010-05-12 95
Beállítja az x koordináta értékét. +void sety(y: int) Beállítja az y koordináta értékét. +void setdirection(direction: Direction) Beállítja a direction értékét. +int getx() Az x koordinátát adja vissza. +int gety() Az y koordináta értékét adja vissza. +Direction getdirection() A direction értékét adja vissza. 7.1.15 StopSign A stop táblát megvalósító osztály. Felelősség Az állapotától függően átengedi, vagy megállítja az előtte levő járművet. Ősosztályok RoadSign Interfészek ITickable Attribútumok -countdown: int számláló, ami tárolja a stop tábla állapotait (0: alap, 1: átenged, 3,2: visszaszámlál) 2010-05-12 96