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 OpenGL használatával

3.1 Megjelenítés

A projekt a MiroSot liga szabályai alapján készül Borland C++Builder 6-os fejlesztõi környezetben.
A játék egy 750 x 650 pixel méretû pályán zajlik. Két csapat, 3-3 fõvel verseng a gólszerzés öröméért. A két csapatot a színûk alapján lehet megkülönböztetni. A három játékost nem lehet ugyanolyan játékfelfogással a pályára küldeni, ami azt jelenti, hogy van kapus, van védõ és támadó. Ez a robotok irányítására nézve döntõ szerepet játszik, mert mindegyik robot sajátos döntéshozó rendszerrel rendelkezik. A pálya adott, változtatni rajta nem lehet. A robotokhoz a tiszta játékidõ alatt hozzányúlni nem lehet.
A megvalósítás elsõ gondolata TShape komponensek alkalmazása volt, mellyel nagyon szépen meg lehetett rajzolni a robotokat, a pályát. Mivel itt nem kellett minden mozgásnál újrafesteni a formot még a kép villogása, mint probléma sem jelentkezett. Azonban ez a fajta megoldás nem adott lehetõséget arra, hogy a robotok, melyeket négyzetek szimulálnak, forogjanak.


Shape-es megoldás

A TShape komponens meghatározásához meg kell adni a négyzet bal felsõ sarkának pozícióját - x és y koordinátáját - és az oldalainak hosszát. Ezáltal olyan négyszöget tud kirajzolni, melynek oldalai a jobb felsõ sarok koordinátáinak megfelelõn helyezkednek el. Ezt a megoldást a következõ fejezetben tárgyaljuk.
Második gondolatként vetõdött fel a TCanvas osztály Polyline metódusa, hiszen ebben a négyszög - esetünkben négyzet - mind a négy koordinátáját meg kell adni. Így a forgás könnyen megoldható, hiszen a meghatározott pontok segítségével, trigonometrikus függvények alkalmazásával meghatározhatóak az új, elforgatott pontok koordinátái. De itt más probléma vetõdött fel, mégpedig az, hogy az egész képernyõ villog. Ahhoz, hogy ki tudjuk rajzolni a négyzeteket a változások után az egész formot újra kell festeni, minden idõpillanatban. Erre lehetõséget ad a TCanvas osztály OnPaint metódusa, ám ez ahhoz vezet, hogy a képünk az állandó kirajzoltatások miatt élvezhetetlenné, nézhetetlenné teszi a programot.
[6] A harmadik megoldás, melyrõl ebben a fejezetben szó lesz, az OpenGL (Open Graphics Library) használata C++Builderben. Ez közismerten nagy grafikai igényû játékok programozására szolgál. Az OpenGL egy szoftver interfész a grafikus hardverhez. Ez a szoftver interfész pár száz eljárásból és függvénybõl áll, melyek lehetõvé teszik 2 és 3 dimenziós grafikai objektumok létrehozását, és ezeken az objektumokon mûveletek elvégzését. Az OpenGL tehát egy eljárás- és függvénygyûjtemény, melyek 2 és 3 dimenziós geometriai objektumok specifikációját tartalmazzák. Ezenkívül olyan eszközöket is nyújt, melyekkel szabályozni lehet ezen objektumok leképezését a képpufferbe, amelyben az OpenGL az eredményként létrejövõ képet tárolja. Ennek megjelenítése már az operációs rendszer, vagy az ahhoz tartozó ablakozó rendszer feladata. Az OpenGL primitíveket rajzol. A primitívek grafikai alapelemek. Az OpenGL geometriai primitívei a pontok, a szakaszok és a sokszögek (poligonok). A geometriai primitíveket vertexek (csúcspontok, 3D pontok) definiálják. Egy vertex definiálhat egy pontot, egy szakasz végpontját, vagy egy polygon csúcspontját, tehát minden OpenGL geometriai primitívet meg tudunk határozni a vertexeivel. Ezek struktúrák, melyek tartalmazzák az illetõ csúcspont térbeli koordinátáit, színét és egyéb adatait. A megjelenítéskor a Descartes-féle koordináta rendszert használja az OpenGL, tehát a bázis olyan vektorokból áll, melyek mindegyike merõleges a többire. A koordinátákat a megszokott x, y, z hármassal jelöli. Mivel a számítógépes grafikában leggyakrabban a jobbsodrású rendszerek használatosak, ezért az OpenGL is ezt használja. Jobbsodrású koordináta-rendszer esetén a (0, 0, 0) pontban van az origó, az x, y tengely pozitív része az origótól jobbra illetve fölfelé található, a z tengely pozitív része a képernyõbõl kifelé mutat. Ha a háromdimenziós objektumokat meg akarjuk jeleníteni a monitor képernyõjén, akkor ezeket a háromdimenziós modelltérbõl egy kétdimenziós nézetre kell leképezni. Ezért a számítógépes grafikában kiemelt jelentõségû transzformációk a vetítések. Általában kétféle vetítési típus használatos: párhuzamos, illetve perspektív vetítés. Párhuzamos vetítés esetén a vetítõsugarak párhuzamosak, ilyenkor csupán a vetítési irány van definiálva, a látótér egy végtelen hasáb, amelyet vágósíkokkal korlátozhatunk, így az OpenGL-ben a párhuzamos vetítés látótere egy téglatest. Mi ezt az ábrázolási módot választottuk, mert ebben lehetett csak a koordinátarendszer úgy eltolni, hogy az origó a bal felsõ sarokban legyen. Ehhez ez a metódus szükséges: [5]

void glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top,
Gldouble near, Gldouble far);

Ennek a vetítési transzformációnak segítségével módosíthatjuk a koordináta alaphelyzetét. A merõleges leképzés elõírása mellett, a munkatér méreteit is meghatározza ez a függvény. A left és right paraméterek a téglalap alakú munkatér jobb- és bal oldalának centrumától mért távolságát, a top és bottom paraméterek pedig a munkatér felsõ és alsó szélének középponttól vett távolságát definiálják. A munkatér egy elsõ és hátsó vágósíkkal határolt, melyek origótól való távolságát a near és far paraméterek határozzák meg.
Fontosak még a modellezési transzformációk. Legegyszerûbb geometriai transzformáció az eltolás:

void glTranslated(Gldouble x, Gldouble y, Gldouble z);

Ezt a transzformációt a robotok pozíciójának definiálásához használjuk. Mivel minden egyes objektum, melyet az OpenGL létrehoz, lokális koordináta rendszerrel rendelkezik, ezért a robotok helyzetéhez elég csak az origókat eltolni.
Térbeli origón átmenõ tengely körüli forgatásnak megfelelõ transzformációt eredményez a

void glRotated(Gldouble angle, Gldouble x, Gldouble y, Gldouble z)

függvény. Az elforgatás tengelyvektorának irányát az (x,y,z) paraméterek, szögét pedig az angle paraméter határozza meg. A robotok forgatásánál van szükségünk erre a függvényre.
A robotokat ezek alapján a következõ programrésszel alakítottuk ki:

glPushMatrix();
glTranslated(Akapus.x, Akapus.y,-tav);
glRotated(Akapus.alfa,0,0,1);
glPolygonMode(GL_FRONT_AND_BACK , GL_FILL);
glColor3f(1,1,0);
glBegin(GL_POLYGON);
glVertex3f(-17.5,17.5,1);
glVertex3f(17.5,17.5,1);
glVertex3f(17.5,-17.5,1);
glVertex3f(-17.5,-17.5,1);
glEnd();
glPopMatrix();

Meg kell említeni még a glPushMatrix és glPopMatrix hívások szerepét. A transzformációk tárolására típusonként verem áll rendelkezésünkre. Ebbe a verembe menthetjük az aktuális mátrixot (glPushMatrix), illetve az utolsó mátrix aktuálissá tehetõ (glPopMatrix).
A labda megrajzolásához gömböt használtunk, mely távolságát a síktól úgy választottuk meg, hogy körnek látszódjon.

glPushMatrix();
glTranslated(Labda.x,Labda.y,+11);
glPolygonMode(GL_FRONT_AND_BACK , GL_FILL);
glColor3f(1,0,0);
glBegin(GL_COMPILE);
quadObj=gluNewQuadric();
gluSphere(quadObj,18,50,50);
gluDeleteQuadric(quadObj);
glEnd();
glPopMatrix();




Pálya képe

A pálya része még a vonalak és a kapuk kialakítása, melyeket szintén a Polygon (sokszög) eljárás segítségével rajzoltatjuk meg.
A program elindítása után megjelenik a pálya, a labda, a játékosok és a beállító ablak. Ez a form több funkciót is ellát. Elõször a két csapat taktikáját tudjuk beállítani, hogy támadó, vagy védekezõ futballt játszanak-e. Ezek után megadhatjuk az egyes játékosok pozícióját, x és y tényezõkre lebontva, majd minden robot elfordulási szögét a nulla fokhoz viszonyítva. Erre csapatonként kilenc beviteli mezõ szolgál. A harmadik, amit ebben az ablakban be kell állítanunk, hogy mely csapat hivatott a kezdõrúgás elvégzésére. A form alsó két gombjának megnyomásával már nem változtathatunk a pozíciókon és elfordulási szögeken, a játék elindul. (Ábra: 19.oldalon)
Az alapvetõ megjelenítési feladatokról áttérünk a kicsit bonyolultabb problémákra. Már a kezdõrúgás elvégzéséhez elengedhetetlen, hogy a robotok a labdát el tudják lökni. Másképpen megfogalmazva, a labda nem mehet át a robotokon. A játékosoknak egy zárt teret kell kialakítani, mely ezt megakadályozza. Ezt a területet egy logikai összehasonlítással hozzuk létre minden robotnál. Megvizsgáljuk azt, hogy a labda pontjai benne vannak-e a robotban. A játékosok területét itt körnek vesszük, mivel a kör egyenletét sokkal egyszerûbb felírni, mint a négy egyenest, mely a robotokat határolja. Ezáltal a labda pontjainak körben, vagy körön kívüli voltát is könnyebb megállapítani. Ha az adott területen belül esik a labda bármelyik pontja, akkor az ütközés logikai értéke igaz lesz. Fontos megemlíteni a labda és a robotok ütközése során bekövetkezõ elpattanást. Itt azonban már nem körnek, hanem

A beállítások ablak


négyzetnek vesszük a robotokat. Ezért külön kell venni a vízszintes és függõleges ütközéseket. Erre két logikai függvényt írtunk melyek azt vizsgálják, hogy a labda melyik oldalával ütközött neki a robotnak. A vizsgálat eredményébõl pedig már egyszerû az elpattanást szimulálni. Ennek az elvnek csak a kapusoknál van nagy szerepe, mert azok csak beállnak a labda útjába, de nem "rúgják" el azt. A többi robotnál azonban ez másként néz ki. Mivel a labdát tehetetlen tárgynak vesszük, a sebességét és annak irányát az ütközés után az azt ellökõ labda sebessége, és annak iránya fogja meghatározni. Az "A" csapat csatárával való találkozáskor a következõ kódrészletek futnak le:

Labda.sebx=Acsat.sebx*cos(Acsat.alfar)*2.5; Labda.seby=Acsat.seby*sin(Acsat.alfar)*2.5;

(ahol Labda.sebx és Labda.seby a labda x ill. y irányú sebességét, az Acsat.sebx és Acsat.seby az A csapat csatárának x ill. y irányú sebességét, az Acsat.alfar pedig az A csapat csatárának elfordulási szögét jelenti radiánban megadva. A 2.5 tapasztalati szorzó, mely az elrúgást szimulálja). A tapasztalati szorzónak akkor van igazán jelentõsége, mikor a robot lassabb, mint a vele ütközõ labda, ebben az esetben a labda nem veheti át a robot sebességét, mert nagyon lelassulna. Ekkor sokkal nagyobb számmal kell megszorozni a labda sebességét. A mi esetünkben ezt 5-nek választottuk. Fontos megemlíteni még, hogy a pálya nem csak a robotokból áll, tehát más tárgy is van, ami a labda útjába állhat. Ez pedig a pályát övezõ "palánkok". Itt az egyszerû rugalmas ütközés fizikai törvényét alkalmaztuk, azaz a beesési szög megegyezik a kiesési szöggel.
De térjünk kicsit vissza a robot és labda találkozására. Elõfordulhat olyan eset, mikor a labda és a robot között közvetlenül egymás után ütközések lépnek fel. Ennek több oka lehet, például ha a labda elmozdulása olyan nagy, hogy az ütközés után lesz még olyan pontja, amely a vizsgált területen belül lesz. Ekkor a labda úgymond 'beragad'. Kiküszöbölésére azt a megoldást gondoltunk ki, hogy figyeljük a közvetlen egymás utáni ütközéseket. Létrehoztunk egy 2*6-os tömböt, melyet elõször nullákkal töltöttünk fel. A tömb egyes sorai az egyes robotokat jelölik, az oszlopok pedig az egymást követõ idõpillanatokat. Ha egy játékos a labdával ütközik a tömb második oszlopának megfelelõ sora 1-re vált. Még ugyanebben az idõpillanatban a második oszlop értékeit átmásoljuk az elsõ oszlopba. A következõ idõciklusban elõször kinullázzuk a tömb második oszlopának minden mezõjét, majd vizsgáljuk a robottal való ütközéseket, hogy adott esetben a második oszlop elemét az ütközõ robot sorának megfelelõen 1-re változtassuk. Ezek után megvizsgáljuk a tömb egyes sorait, és ahol csak egyes szerepel (vagyis adott sorban mindkét oszlop érték 1), tehát fennállna a 'beragadás', azt az ütközést letiltjuk. Ha mindezek ellenére mégis beragad a labda, vagy a robotok beszorítják a sarokba, szabálytalanság történik és a játékot meg lehet állítani a Ctrl-A billentyû lenyomásával. Az ekkor megjelenõ ablak négy részre van osztva, az egyes szabadrúgás pontoknak megfelelõen, melyet a MiroSot liga ír elõ. A négy téglalap fel van osztva további két elemre, melyekkel a szabadrúgás irányát határozhatjuk meg. Ha bármelyik opciót is választjuk, a játék tovább folytatódik a megfelelõ szabadrúgással.


Szabadrúgásnál megjelenõ ablak

Az igazi futballban a játékosok nem bánthatják egymást, nem lehet a másikat felrúgni, ellökni. Ez a robotok nyelvére lefordítva azt jelenti, hogy nem mehetnek egymáson át a játékosok. Ezzel egy újabb problémával álltunk szembe, mely megoldásra várt. Ha a robotokat, mint négyzeteket vesszük, nagyon megnehezül a feladat. Sokkal egyszerûbb, ha azt mondjuk, minden robot egy meghatározott sugarú kör. Tehát csak azt kell vizsgálnunk, hogy a körök középpontjai mekkora távolságra vannak egymástól. Például, ha a két robot 50 pixel távolságon belülre kerül, megállnak Azonban ezzel a megoldással, felmerülnek még további problémák, a megállás után például soha nem fognak újraindulni, hiszen a távolság örökké az 50 pixeles határon belül marad. Ennek kiküszöbölésére azt alkalmaztuk, hogy a robotok csak az elõttük lévõ sávot vizsgálják. Ezt úgy valósítottuk meg, hogy a robot mozgásának pályáját minden pillanatban kiszámítjuk a robot középpontjától egy adott határig, oly módon, hogy felírjuk a robot adott iránytangesû pályájának egyenletét, melyet az egyszerûség kedvéért egyenesnek választottunk. Ezután megvizsgáljuk minden idõpillanatban, hogy a robot pályáját nem keresztezi-e egy másik játékos, azaz a másik robot középpontja kielégíti-e az egyenes egyenletét. Ha igen a robot megáll, míg ez a helyzet fennáll. De a másik robot ebbõl semmit sem érzékel. Tehát ezzel ki lett szûrve az probléma, hogy a vétlen robotnak is meg kellje állni, ha túl közel kerül hozzá a másik.

3.2 Döntéshozó rendszer

A feladat jól megszervezett és hatékony döntések meghozása. Erre a legjobb módszer, ha minden egyes játékosnak külön-külön rendszere van. Elõször nézzük meg, hogyan alakítottuk ki a robot osztályt a szimulátorban - minden robot ilyen típusú -, hogy milyen mezõik vannak és ezeknek mi a szerepe.
Robot:
§ x = a robot lokális koordinátarendszerének origójának x koordinátája
§ y = a robot lokális koordinátarendszerének origójának y koordinátája
§ sebx = a robot sebességének x irányú összetevõje pixel / szekundumban
§ seby = a robot sebességének y irányú összetevõje pixel / szekundumban
§ alfa = a lokális koordinátarendszer elfordulási szöge a világkoordináta-rendszerhez képest
§ alfar = az alfa radiánban számolva
§ bin = az alfar értéke színusban.
§ bos = az alfar értéke coszínusban.
§ dpb = a robot labdától mért távolsága
§ dpg = az ellenfél kapujától mért távolság
§ tars = a csapattárstól való távolság
§ tan = a bin / bos érték
§ forog = logikai változó, mely a robot forgását engedélyezheti, ill. tilthatja.

Biztosan szembetûnt az olvasónak, hogy az osztály kialakításában van két olyan változó is, mely fölöslegesnek tûnhet, a bin és bos, hiszen ezekre csak az adott játékos elfordulási szög tangensének kiszámításánál van szükség. Egyébként a tangens a robot pályájának kiszámításához szükséges. (Adott iránytangensû egyenes egyenlete). De mivel a Builder belsõ tangens függvénye nem mûködik jól, - hosszan tesztelés után derül fény erre a hibára - kénytelenek voltunk ezt a megoldást választani, a tangens kiszámítására.
Most térjünk át a robotok mozgására. Az egyenes vonalú mozgásuk a következõ kódrészlettel van megvalósítva: (az "A" csapat csatárának mozgása)

Acsat.x+=(Acsat.sebx*cos(Acsat.alfar));
Acsat.y+=(Acsat.seby*sin(Acsat.alfar));

Ez az értékadás minden idõpillanatban megtörténik, de csak akkor, ha engedélyezve van a robotoknak a mozgás, melyet logikai vizsgálatok határoznak meg. A egyenes vonalú mozgás le van tiltva, ha:
Ø a robot koordinátái nagyobbak, mint a pálya széleinek koordinátái mínusz harminc pixel. Erre a mínusz 30 pixelre azért van szükség, hogy ne szorítsák be a játékosok a labdát a pálya szélén.
Ø a vizsgált játékos elõtt egy másik robot tartózkodik. Ezt már a megjelenítésben részben részletesen kifejtettük.


A fordulás már kicsit bonyolultabb. Ez úgy van megoldva, hogy négy szög lett kiemelve, a 45°, a135°, a 225° és a 315°, melyek a robotok elfordulási szögei lehetnek. A fordulás is, mint az egyenes vonalú mozgás logikai vizsgálatokhoz van kötve. A kanyarodás alaphelyzetben nem megengedett. Azonban megengedett,
Ø ha az elfordulási szög nem egyenlõ 45°-kal, vagy
Ø ha az elfordulási szög nem egyenlõ 135°-kal, vagy
Ø ha az elfordulási szög nem egyenlõ 225°-kal, vagy
Ø ha az elfordulási szög nem egyenlõ 315°-kal
Ø ha a robot koordinátái nagyobbak, mint a pálya széleinek koordinátái mínusz harminc pixel.

Maga a fordulás úgy lett kialakítva, hogy a játékosok nem csak egyhelyben állva tudnak megfordulni, hanem úgy is, mintha egy másodfokú függvény pályáján húznák azokat. Azonban ez nem teljesen igaz, hiszen nem egy függvény vonalát követik a robotok, hanem a megfelelõ logikai vizsgálatokat követõen a forgás engedélyezett lesz. Azonban az elõrefelel haladó mozgás sincsen teljesen letiltva ilyenkor, csak a sebesség van nagyon alacsonyra csökkentve. És ezekbõl az elõrefele haladó és forgó mozgásokból adódik össze a kanyarodó mozgás, mely sokkal látványosabbá és egyben bonyolultabbá is teszi a szimulációt.
Most rátérünk a fejezet lényegére, a döntéshozatalra. Ami igazán megnehezíti a problémát, hogy a környezet állandó jelleggel változik. Az ellenfelek játékosai, a saját játékosaink és a labda is mozog, így az egymáshoz viszonyított helyzetük, a sebességek és a pozíciók is dinamikusan változnak. A három, alapjaiban ugyanolyan játékos viselkedés szempontjából csak a belsõ paramétereik pillanatnyi állapotától tér el egymástól. Az elsõ és legfontosabb a szerepkör, melyek alapján a pályát a következõképpen osztottuk fel:


Szerepkörök területei
Tehát minden robot a bejövõ adatok (távolságok) alapján és a szerepköre alapján hozza meg a döntését. Mivel a szerepkört vesszük elsõdleges prioritásúnak és a labdától és kaputól mért távolságot másodlagosnak, az a probléma, mikor két robot ugyanolyan döntést hozna, nem áll fent.
A szimulátor elindításánál a beállító ablakban a taktikát is meg lehet adni, hogy védekezõ vagy támadó felfogásban játszanak a csapatok. A védekezõ taktikánál a csatár szerepköre az, ami veszít feladataiból, mert õ is középpályássá minõsül át. A robotok csak a saját térfelükön mozoghatnak és legfõbb feladatuk a labda távoltartása a kaputól. A támadó taktikánál a csatár visszanyeri szerepkörét, tehát inkább csak az ellenfél térfelén tartózkodhat és a kapura rúgás a legfõbb feladata. A középpályás szerepe változatlan.
Most nézzük meg az egyes robotok döntéseit szerepkörökre lebontva.

3.2.1 Lehetséges döntések kifejtése szerepkörökre lebontva

Kapus szerepkör

A kapus feladata a blokkolás. Ellentétben a lövési tevékenységgel, a blokkolás a labda megszerzése vagy az ellenséges robot távol tartása. Ennek végrehajtása azt jelenti, hogy a robot a kiszámított támadási pozícióba mozog, és elzárja a labda útját. Ehhez figyelembe kell vennie a labda és a saját kapujának pozícióját. A támadás útvonala függhet az ellenséges robot által célba vett pont helyzetétõl. Tehát a védekezõ robot pozíciója függ az ellenséges robot és a labda pozíciójától is.


Elzárás

A kapusunk tehát a következõképpen mûködik:
· Ha a labda a saját térfélre ér a kapus aktivizálódik
· Attól függõen, hogy a labda a térfél felsõ, vagy alsó részében van, úgy mozog a kapus is fel és le a kapu elõtt.


Középpályás szerepkör

Ennek a szerepkörnek a lényege a labdaszerzés, a söprögetés és a csatár felé a labda továbbítása. A labda megszerzésnek képességével a csatár robot is rendelkezik, de természetesen a középpályás a fõ labdaszerzõ. Elõször a robot megbecsüli a gyorsan mozgó labda pályáját, majd a kiszámolt pontba mozog, hogy megszerezze azt. (Ábra: 25. oldal) A labda pályáját a pillanatnyi és az elõzõ labda pozícióból számítjuk ki, a labda sebességét konstansnak tekintjük egy-egy rövid idõpillanatban. A labda és a robot távolságának aránya ugyanaz, mint a labda feltételezett sebességének és a robot lehetséges maximális sebességének aránya. A labda megszerzésének várható pozícióját egy egyszerû képlet segítségével számíthatjuk:

Vb*?t : Vr*?t = sqrt((Xi-Xb)2+(Yi-Yb)2) : sqrt((Xi-Xr)2+(Yi-Yr)2) [4]

A labda aktuális és elõzõ pozíciója (Xv, Yb) és (Xv0, Yb0), továbbá (Xr, Yr), (Xi, Yi), Vb, Vr, ?t a robot aktuális pozíciója, a labda megszerzésének helye, a labda becsült sebessége, a robot maximális sebessége és a megszerzés ideje, külön-külön. A robot fordulási idõtartamának köszönhetõen késedelmi idõ lép fel, ami a pozíció hibáját eredményezheti. A labda pályája az y=ax+b egyenletnek felel meg. A pozíció könnyedén kiszámítható egy másodfokú egyenlet segítségével, lecsökkentve ezzel a számítás idõtartamát:

Ax2+2Bx+C=0,

R= Vb2/Vr2,
A =(R-1)*(a2+1),
B =R*(-Xr+a*(b-Yr))+Xb-a*(b-Yb),
C =R*(Xr2+(b-Yr)2)-Xb2-(b-Yb)2. [4]

A középpályás másik feladata a söprögetés. Amikor a labda a saját kapuját veszélyezteti a védekezõ szerepkörû játékos feladata, hogy elrúgja azt minél messzebb. A labdasöprögetés hasonló eljárás, mint a lövés, amelyben a robot kirúgja a labdát. Ennek képességével a középpályás játékos rendelkezik. (Ábra: 25. oldal)
A középpályásnak tehát a következõ döntési lehetõségei vannak:
· Ha a labda nem az õ területén van: a labda követése meghatározott sebességgel
· Ha a labda az õ területén van:
Ø Ha mozog a labda: söprögetés, maximális sebességgel
Ø Ha a labda áll: labda szerzés és lövés a csatár területe felé, maximális sebességgel

A lövést a csatár szerepkörnél fejtjük majd ki, de ugyanúgy történik a középpályásnál is.


Labdasöprögetés

Labdaszerzés
Csatár szerepkör

Egyetlen feladata a gólszerzés, vagyis a lövési tevékenység. Ez egy olyan eljárás, melyet arra használnak a robotok, hogy kapura lõjenek, vagy passzoljanak. Minden játékos rendelkezik ennek a tevékenységnek a képességével, kivéve a kapust, de leggyakrabban a csatár alkalmazza. Amikor a játékosok megkapják a labda és a kapu pozícióját, a DPB és DPG értékek kiszámolásra kerülnek. Ennek alapján az a robot, amely lõni akar, további két értéket határoz meg. Az egyik a lövési pozíció, ahonnan a rúgási tevékenységet megkezdi, a másik a lövés elvégzése utáni pozíció, tehát amíg a robot mozog. A lövés tevékenysége megfelelõ, ha a labda a robot és a kapu között helyezkedik el, és a robottól a labdáig húzott egyenes vonal lefedi a kapu által meghatározott területet. Különösképpen fontos, hogy megakadályozzuk a robotunkat attól a lépéstõl, hogy a saját térfele irányába rúgja a labdát.



Lövési tevékenység

A csatárnak tehát a következõ döntései lehetnek:
· Ha nem az õ területén van a labda: követése, adott sebességgel
· Ha az õ területén van a labda:
Ø Ha áll a labda: lövési tevékenység, maximális sebességgel
Ø Ha mozog a labda: labdaszerzés ›Ha kapu felé áll ›lövés
›Ha nem arra fele áll› Kapura fordul›lövés