Celá hra prebieha ako interakcia medzi agentom a serverom. Server má informácie o aktuálnom stave hry, tj. Rozloženie hráčov, čas, poloha lopty, … . Tento stav sa dá graficky zobraziť pomocou aplikácie rcssmonitor3d.
Server poskytuje minimálne dva typy robotov – „Nao“ a „Socerbot“. Nao predstavuje virtuálnu reprezentáciu rovnomenného robota a je používaný aj v projekte Robocup na FIIT.
Nao sa pohybuje pomocou dvadsiatich dvoch otočných kĺbov.
Agent so serverom komunikuje prostredníctvom TFTP (angl. trivial file transfer protocol) protokolu nad TCP (protokol riadenia prenosu). Obsahom posielaných správ sú tzv.S-výrazy.
S-výraz je formátovaný znakový reťazec (čitateľný človekom aj strojom). Začína („(“) a končí („)“) znakom obyčajnej zátvorky. Ako prvý zankový reťazec obsahuje identifikátor typu z preddefinovanej množiny ([time,see,pol,player,…] …). S-výraz môže v sebe obsahovať ďaľšie s-výrazy (ak to definícia daného výrazu povoľuje, napr. „(L (pol …)(pol …)“).
Obrázok 1: UML diagram sekvencií - Priebeh komunikácie agenta so serverom
Agent zo servera dostáva rôzne informácie a odosiela informácie o tom, ako by sa malo zmeniť aktuálne nastavenie kĺbov. Tieto informácie sú výsledkom výpočtov, ktoré berú do úvahy polohu agenta, aktuálnu stratégiu, low & high skills, čas a.i.. Tieto výpočty prebiehajú v niekoľkých triedach.
Agent je pripojený na server cez port 3100. Komunikácia agenta so serverom prebieha v triede sk.fiit.jim.agent.communication.Communication, trieda implementuje návrhový vzor singleton.
Komunikácia so serverom začína zavolaním funkcie start(), kde sa na začiatku vytvoria objekty potrebné na komunikáciu. V metóde registerSayngByeOnExit() sa nastaví ukončenie spojenia pri skončení vykonávania programu či už pri normálnom ukončení (dosiahnutím koncového bodu vykonávania), alebo prerušením vykonávania. O ukončenie spojenia sa postará JRE. V metóde handshake() sa následne inicializuje spojenie so serverom, kde na konci metódy agent odošle inicializačný s-výraz so svojim číslom a názvom tímu (init (num <cislo>) (teamName <názov_tímu>)).
V metóde mainLoop() prebieha nekonečný cyklus. Na začiatku cyklu sa čaká, pokým nepríde nejaká správa zo servera. Po prijatí správy metódou recieve() sa prijaté údaje spracujú v parseri.
Prvým volaním metódy proceed() triedy sk.fiit.jim.agenthighskill.runner.HighSkillRunner sa vytvorí nové vlákno, na ktorom bude prebiehať plánovanie akcií. Plánovanie akcií je realizované pomocou triedy sk.fiit.jim.agent.highskill.runner.HighSkillPlanner.
Na konci nekonečného cyklu sa odošle správa s akciami na server.
Funkcionalita triedy SkillsFromXmlLoader.java je používaná na mnohých miestach v projektu, vždy však pracujeme s novou inštanciou.
Návrhový vzor singleton zabezpečuje, že vždy pracuje s nanajvýš jednou inštanciou triedy. V našom prípade tak zabránime zbytočnému vytváraniu objektov a réžii spojenej s ich mazaním. Pri implementácii tohto návrhového vzoru v tiede SkillsFromXmlLoader.java došlo k zmena, ktorá sa dotkla nasledovných tried v module Jim:
Zavedenie návrhového vzoru bolo nutné z dôvodu aby sa pracovalo s nanajvýš jednou inštanciou triedy.
Pri otestovaní implementácie sme nezistili, že nová implementácia nemala na Agentove správanie vplyv.