Robotfoci szimulátor
Budapesti Mûszaki Fõiskola Neumann János Informatikai Fõiskoali Kar
 Boross BalázsMichaletzky András
Kezdõlap
Irodalomkutatás Megvalósításunk
Intelligens Automatizált Rendszerek Szak
Konzulens: Vámossy Zoltán

Megvalósítás TShape használatával

A program megvalósítása két különbözõ módszerrel készül. Ebben a fejezetben a TShape elemeket alkalmazó megoldást mutatjuk be.

4.1 Felhasználói felület


Felhasználói felület

A felület tartalmaz egy menürendszert, egy információs panelt és magát a játékteret. A menü biztosítja a felhasználó számára, hogy utasításokat adjunk a programnak (input parancsok), a jobb oldalon látható panel információkkal szolgál a futó programról (output információk), a zöld színû pálya maga a játéktér.
Ø Menürendszer:
- File: lehetõséget biztosít új alaphelyzet beállítására (New), a játék kezdésére (Start), szüneteltetésére (Pause) és a program bezárására (Close).
- Taktika: két taktikai szint létezik, kezdõ és haladó.
- Ki kezd?: itt adjuk meg azt, hogy melyik csapat végezzen középkezdést.
Ø Pálya:
Maga a játéktér, egy 650 x 750 pixel méretû felület. Tartalmazza a 3-3 játékost, a labdát, a pálya vonalait és a két kaput. A játékosokat szerepkörük szerint 3 csoportba soroljuk, így megkülönböztetünk védõ, középpályás és csatár funkciókat.
Ø Információs panel:
Elsõsorban a teszteléshez szolgál nélkülözhetetlen adatokkal a programozó számára, illetve szimpla információ közlés a játékmenet alakulásáról. Fentrõl lefelé haladva a következõ információk olvashatók le: aktuális eredmény, védések száma, a 3-3 játékos DPG és DPB adatai (DPG: játékos-kapu távolság; DPB: játékos-labda távolság), a játékosok és a labda elmozdulás vektorainak a nagysága, a taktikai szint, valamint két nyomógomb, melyekkel a játékmenet gyorsítható, lassítható.
4.2 A program mûködésének leírása
4.2.1 A program indítása

A program indítása után elsõ lépésként elhelyezzük a csapatok játékosait a pályán, kivéve a kapusokat. Ekkor a TControl osztályból származó komponensek DragMode tulajdonsága szabályozza a vezérlõk egéreseményeinek kezelését. Az alapértelmezett mûködést megváltoztatjuk, ha DragMode tulajdonságot dmAutomatic értékûre állítjuk, ilyenkor a bal egérgomb játékoson való lenyomásakor megkezdõdik a robot mozgatása, ami egészen addig tart, amíg fel nem engedjük az egérgombot. Miután elvégeztük a beállításokat, a menü segítségével meghatározhatjuk, hogy melyik csapat végezze el a kezdõrúgást. Ekkor az egyik csapat csatára a középkörbe kerül, a másik csatár kikerül onnan. Lehetõségünk van a csapatok taktikai fejlettségének beállítására. Ezt is a menübõl végezhetjük, és amennyiben valamelyik fél játékosait "lebutítjuk", akkor hosszabb tesztelés után ez az eredményben is megmutatkozik, mint ahogy ezt a lenti ábrán is jól láthatjuk. Az eredmény leolvasásából az is kiderül, hogy a teszt során a B jelû (kék) csapat játékosait küldtem ki haladó taktikával a pályára, a sárgák tudása csupán kezdõ szintre volt állítva.


Közel 3 óra tesztelés után B csapat nagyon vezet
4.2.2 Taktika

Ebben a fejezetben tisztázzuk azt a kérdést, hogy mi is a különbség a két taktikai beállítás között. A programon belül két-két logikai kapcsoló segítségével csak annyit teszünk, hogy más-más programrészeket engedünk lefutni. A kezdõ taktika kizárólag a labda követésére irányul, a játékosok nem képesek "tudatosan" kapura lõni vagy felszabadítani, csupán a labda megszerzésének a képességével rendelkeznek. Labdaszerzés során miden egyes robot minden idõpillanatban a labdához viszonyított pozíciójára figyel kizárólag, és ennek megfelelõen a labda irányába mozdul el, közelíti azt. Ez igen egyszerû módja a labdakövetésnek, gyakorlati haszna viszont csak akkor lenne, ha az állandóan változó viszonyok alapján képes lenne új döntést hozni (pl. lövés, a labda megkerülése, pozicionálás). Pontosan ezekkel a képességekkel vértezõdnek fel a játékosok, ha haladó taktikai beállítással küldjük õket pályára. A haladó szint alkalmazása során a leglényegesebb változtatás a tulajdonságok terén, hogy minden játékos folyamatosan számolja és figyeli azt a két értéket, ami alapján utána cselekedni fog. Ez a két érték a DPB - azaz a labda és a játékos távolsága - illetve a DPG - ami a játékos és a kapu közötti távolság. A DPB a labda és a robot irányvektorának a nagysága, a DPG a robotból és az ellenfél kapujának középpontjába mutató irányvektor nagysága. Ezeket a tulajdonságokat, értékeket a tesztelés során figyelemmel kísérhetjük, csupán annyit kell tennünk, hogy az információs panelen a robotok DPB és DPG értékeit feltüntetõ Edit mezõkön az egér bal gombjával kattintunk. A taktikai elemek fejlesztése közben nagy segítség ez a fajta vizuális követhetõség a programozó számára, jól tükrözi az állandóan változó viszonyokat mind számértékekben, mind grafikusan.
Szerepkörök szerint három különbözõ tulajdonságokkal rendelkezõ robotot említhetünk csapatonként. Kapus, középpályás és csatár. A kapusnak egyetlen feladata van, a labda blokkolása. Mikor a játékszer a kapus térfelére érkezik, akkor a kapus aktivizálódik és annak megfelelõen lefelé, vagy felfelé mozog saját kapuja elõterében, hogy milyen a labdához viszonyított Y irányú pozíciója. Amennyiben a kapus DPB értéke egy bizonyos szám alá csökken, és a labda kapushoz viszonyított helyzete erre lehetõséget ad, akkor a hálóõr kimozdul kapuja közvetlen elõterébõl, és kirúgja a labdát, majd visszahúzódik elõzõ pozíciójába. A középpályás és a csatár ennél lényegesen több mozgásra képes, viszont erõs a hasonlóság az õ tulajdonságaikban, például egyaránt rendelkeznek a labda megkerülés, a labda megszerzés, vagy éppen a lövés tevékenységének képességével. A középpályás a saját térfelén, a csatár az ellenfél térfelén tevékenykedik. A labda pozíciója, mozgásának iránya és a DPB értékek bizonyos feltételei esetén cselekednek a játékosok. A lehetséges döntések közül legáltalánosabb a labdaszerzés. Mikor nem teljesülnek azok a feltételek, amelyek esetén a robot más tevékenységet választana, mindig labdaszerzésre törekszik. Persze csak akkor, ha a DPB érték és a labda pozíciója kielégíti a mozgás feltételeit, különben a robot egyhelyben marad és vár (pl. a hátvéd nem mozdul, ha a labda a másik térfél valamely távoli pontján található). A leglényegesebb tulajdonságok egyike, a labda megkerülésének a képessége. Két fontos szempontot vesz figyelembe ez a magatartás. Az egyik a pozicionálás a labda mögé, mivel így utána az ellenfél térfele irányába, vagy egyenesen a kapuba lõhetik a robotok a labdát. A másik a fordított irányú megkerülés, ilyenkor kizárjuk azt a lehetõséget, hogy a játékos saját térfele irányába továbbítsa a labdát. Például kezdõ taktikai szinten gyakori az öngól, míg haladó szinten, ahol már alkalmazzák a robotok a megkerülést, csak a legritkább esetben fordul elõ ilyen hiba. A kitérés feltétele, hogy a labda a robot saját térfeléhez viszonyítva közelebb helyezkedjen el a kapuhoz mint a játékos, és egyben közeledjen is az aktuális robot felé. Ugyanis ha távolodik, akkor követést alkalmaz a robot mindaddig, amíg a labda mögé kerülést meg nem tudja kezdeni, utána már lövési pozícióba kerül az esetek döntõ százalékában. A lövés igen gyakori mûvelet, ebben az esetben is több feltételnek kell teljesülnie. Adott egy maximális DPB határérték, a labda és a robot adott pozícióba kell legyenek egymáshoz viszonyítva és bizonyos mozgás irányoknak is teljesülniük kell. Lövésnél a robot szemmel láthatóan megnöveli sebességét, majd a labda is ezzel az arányosan megnövelt sebességgel mozog tovább. A lövési tevékenység addig tart, míg a labda ki nem kerül abból a tartományból, ami a robotot még lövésre készteti. Számos olyan esettel találkozhatunk, mikor a labda valamelyik sarokba vagy a falhoz nagyon közel lelassul, és a játékosok egyike sem képes utána eredni, hogy meglõje azt. Ez azért lehetséges, mert szabálytalan mûvelet a labda sarokba szorítása, így a robotok ki vannak tiltva a falhoz közeli területekrõl. A labda lassulását a súrlódás magyarázza, ha sokáig nem lövi meg senki, akár még meg is állhat, bár ez igen ritka. Gól esetén a labda a középkezdés helyérõl folytathatja útját a következõ gólig. A játékosok emberi beavatkozás nélkül mozognak, irányításukra a kezdõ beállításokon kívül a meccs folyamán csak egyetlen esetben van lehetõség. Elõfordulhat, hogy két robot szabálytalanul egymásba ragad, ilyenkor a sárga csapat irányítását manuálisan vezérelhetjük. Az ESC gomb megnyomásával leáll a sárga csapat, majd 1-es vagy 2-es gombot nyomva a pirossal jelzett robotot a fel, le, jobbra, ballra billentyûk segítségével mi magunk mozgathatjuk. Miután kilöktük a szabálytalankodókat eredeti helyzetükbõl, az ESC gomb ismételt megnyomásával visszaadjuk a sárga csapat döntési jogát. Természetesen ez egy részállapot a programban, a probléma kiküszöbölése más megoldást igényelne, ami a továbbfejlesztés során megoldandó feladat. Így viszont a játék értelmetlen megszakítása és újrakezdése nélkül folytatódhat a versengés a két csapat között.




A pirossal jelzett robot manuálisan vezérelhetõ




4.2.3 Ütközések kezelése

A labda és a játékosok közötti ütközések vizsgálata 3 fõ részre osztható. Az elsõdleges vizsgálat során egy PtInRect nevû függvény segítségével vizsgáljuk a labda pontjait (Point) vajon belül vannak-e valamelyik játékos (Rectangle) területén. Külön-külön kerül kiértékelésre a vízszintes és a függõleges irányú ütközés a labdával, és amennyiben teljesül valamelyik ütközési feltétel, akkor az adott logikai változó true értéket vesz fel, így a program további futása során lekezeljük az irányváltásokat. Viszont amikor két egymást követõ idõpillanatban ugyanazon ütközési feltételek teljesülnek, a labda állandó irányváltása miatt beragad a játékosba, és annak felületén rezegve végigfut. Ennek kiküszöbölésére egy 2*6 elemû tömb segítségével nyilvántartjuk minden robot esetében az egymást közvetlenül követõ ütközések logikai értékeit, így ha kétszer kerülne sor irányváltásra ugyanazon robot és a labda között két egymást követõ ciklusban, akkor false értékûre állítjuk az ütközés logikai változót, így a labda zavartalanul haladhat tovább pályáján. A tömb sorai a robotokat modellezik, míg a két oszlop érték két egymást követõ idõpillanat során bekövetkezõ ütközések logikai értékeit tartja nyílván. Minden ciklusban az elsõ oszlopérték áttöltésre kerül a második oszlopérték helyére, közben viszont az elsõ helyére az aktuális ütközési feltételnek megfelelõ érték töltõdik be újra, így egy egyszerû összehasonlítással vizsgálható, hogy azonos értékeket tartalmaz-e a két oszlop. Ez egy másodlagos vizsgálatot jelent. Ennek ellenére a tesztelési tapasztalatok alapján szükségessé vált még egy harmadik vizsgálat elvégzése, ami az elõzõ kettõ után esetlegesen bekövetkezõ pontatlanságokat orvosolja. Képzeletben minden robotot négy részre darabolunk úgy, hogy függõlegesen is, és vízszintesen is egy oldalfelezõ vonallal kettévágjuk a játékost. Ezután minden negyedben azt vizsgáljuk, vajon a labda középpontja bele esik-e valamely robotszeletbe. Ha igen, akkor könnyen belátható, hogy az ütközés még nem teljesült az elõzõ vizsgálatok során, így attól függõen, hogy mely negyedben található a labda centruma, a szükséges irány és elõjelváltásokat elvégezzük mind a robot, mind pedig a labda tekintetében. Ez a harmadik módszer egy igen durva irányváltást eredményez, amely során a robot nagy sebességgel és szemmel is jól láthatóan kiveti magából a labdát, viszont így lehetetlenné válik a labda esetleges keresztül haladása a robot területén.
A robotok közötti ütközések lekezelése ugyanazt a technikát követi, mint ahogy azt a labda-robot ütközések elsõdleges vizsgálata során láttuk. Annyi eltérés van, hogy itt a pont szerepét az egyes robotok sarkai jelentik, és ezeket a pontokat vizsgáljuk, vajon benne vannak-e valamelyik játékos területén. Ezt a feltételvizsgálatot is a PtInRect nevû függvény segítségével végezzük.