Robocode - Java hrou

15. 12. 2003
Doba čtení: 4 minuty

Sdílet

Build the best. Destroy the rest. Naprogramujte robota. Vypustite ho do arény. Len na vašom programátorskom umení záleží, či sa ešte vráti. Do boja po vašom boku vyráža dedičnosť a polymorfizmus, chrbát vám budú kryť udalostne orientované programovanie s princípmi distribuovaného výpočtu.

Robocode je simulátor tankovej bitky od IBM, ktorý má za úlohu naučiť vás základy programovania v jazyku Java. Na prvý pohľad je zrejmé, že autori zvolili zábavnú formu. Na druhý pohľad uvidíte, že by to mohlo byť vážne. Ale nepredbiehajme.

Inštalácia

Na to, aby ste sa mohli s Robocode zabávať, potrebujete počítač s ekvivalentom PII-400, 64MB RAM a 10MB diskového priestoru. A samozrejme systém, na ktorom pobeží Java(TM:)2 v1.3+, alebo radšej v1.4+.

Inštalácia je veľmi dobre vymyslená. Sprievodca inštaláciou na stránkach Robocode vás prevedie podľa vášho operačného systému a nainštalovanej verzie Java všetkými krokmi inštalácie.

Pre Linux je to triviálna záležitosť (predpokladám to isté na iných platformách, ale neskúšal som). Ak náhodou ešte nemáte nainštalovanú Javu, nájdete ju tu. Potom stiahnete inštalačný balík a spustíte ho príkazom  java -jar robocode-setup.jar.

Po zadaní cieľového adresára sa aplikácia rozbalí a vy ju môžete spustiť. ./robocode.sh

Čo to vlastne je?

Robocode je kompletné IDE, ktoré obsahuje všetko, čo budete potrebovať na vytváranie a ničenie robotov. Pozitívne je, že IDE neobsahuje nič, čo potrebovať nebudete a tak začínajúcich algoritmizátorov nebudú miasť zbytočnosti. Súčasťou aplikácie je editor na písanie programov robotov, kompiler (Jikes), kompletné Robocode API vo forme Javadoc a samozrejme aréna, v ktorej sa súboje odohrávajú. Celá aplikácia je napísaná v Jave (Jikes samozrejme nie:), pre GUI je použité AWT a Java2D.

Robocode IDE

Ako to funguje?

Robot, ktorého budete písaním Java kódu pripravovať na vojnové peklo, sa skladá z podvozku, kanónu a radaru. Každú z týchto častí môžete nezávisle na ostatných otáčať. Okrem toho máte k dispozícii metódy na pohyb ( void ahead(double distance)…), na zistenie stavu robota ( double getX(), double getEnergy()…) a samozrejme na streľbu ( void fire(double power)…).

Reakcie robota na okolie ošetrujete pomocou udalostí, príkladom môžu byť ScannedRobotEvent, HitByBulletEvent alebo HitRobotEvent.

Na písanie programu robota používate normálne konštrukcie jazyka Java, na jeho ovládanie slúži vyššie spomínané Robocode API.

Kód jednoduchého robota potom vyzerá takto:

package man;
import robocode.*;

public class MyFirstRobot extends Robot {
  public void run() {
    while (true) {
      ahead(100);
      turnGunRight(360);
      back(100);
      turnGunRight(360);
    }
  }
    public void onScannedRobot(ScannedRobotEvent e) {
    fire(1);
  }
} 

Samozrejme, takýto nezmysel v aréne dlho nevydrží. Postupom času sa však naučíte, ako používať základné API, kód robota sa začne rozrastať a vy ho budete deliť do samostatných tried a tie skladať do jar balíkov.

A keď vám prestane stačiť jednoduchá trieda Robot, môžete skúsiť programovanie s jej potomkom AdvancedRobot, ktorý umožňuje asynchrónne volania API.

Princípy, pravidlá, taktika

Každý robot beží vo vlastnom vlákne. Správca arény prideľuje každému robotovi toľko „strojového“ času, aby stihol vykonať aj zložitejšie výpočty. Robot teda vykonáva príkazy v metóde run() a jeho vlákno zaspí, až keď robot zavolá funkciu z Robocode API, prípadne po uplynutí maximálneho povoleného časového intervalu (ktorý je tam zrejme pre prípad nekonečných cyklov:).

Keď všetci roboti vykonajú svoje výpočty a vybavia udalosti čakajúce v zásobníku udalostí, scéna sa prekreslí a boj pokračuje ďalším kolom.

Stratégia vyplýva z pravidiel v aréne. Keď vystrelíte, uberie to robotovi takú energiu, akú ste použili na výstrel. Ak trafíte, protivníkovi sa energia uberie a vášmu robotovi sa znovu pridá. Zrážky s ostatnými robotmi a so stenami rovnako uberajú energiu.

Takže akú taktiku by ste zvolili? Je možné posúvať sa popri stenách, skrývať sa v rohoch, stopovať protivníkov. Ak máte viac energie ako súper, môžete agresívne útočiť a v opačnom prípade sa zbabelo vyhýbať boju.

Tímová práca

Ak majstrovsky zvládnete boj robota proti robotovi, prečo neskúsiť veliť celej armáde. Robocode ponúka možnosť vytvárať skupiny spolupracujúcich robotov. K tomu je vytvorená trieda TeamRobot. Jej rozšírením získate rôznych členov tímu, ktorí si môžu medzi sebou vymieňať správy vami vytvoreným komunikačným protokolom.

Príkladom robota-špecialistu je napríklad Druid (implementujeme rozhranie Druid), ktorý nemá radar (je odkázaný na správy od iných robotov), ale má viac energie.

Aké poučenie z toho plynie?

Robocode vyzerá spočiatku ako nevinná zábavka. Začínajúci programátori sa pomocou neho môžu naučiť volať knižničné metódy, čítať Javadoc, pracovať s udalosťami a používať základné koncepty objektového programovania (dedičnosť a polymorfizmus).

No roboti vás nenechajú pri zemi. Časom od vás budú chcieť, aby ste zvládli zložitejšie postupy návrhu algoritmov, znovupoužívali kód. Na poriadnu orientáciu v priestore či streľbu sa budete musieť potrápiť s trigonometrickými výpočtami. Komunikácia medzi členmi tímu vás privedie k princípom distribuovaných systémov.

Pri troche hlbšieho záujmu sa z tejto jednoduchej hry múže stať veľmi účinný pedagogický nástroj.

Robocode teda nie je nevinná zábavka. Je to skutočná zábava.

Poznámka na okraj

Robocode je pôvodne súkromná aktivita jedného z programátorov IMB, Mata Nelsona. Program bol vydaný vo februári 2001 a zakrátko si získal neočakávanú popularitu, takže od IBM to teraz vyzerá ako skvelý marketingový ťah:). Vo svete sa organizujú ligy a turnaje, fanúšikovia sa združujú okolo diskusných fór a webových databáz robotov.

V súčastnosti je k dispozícii príjemne stabilná verzia 1.0.6; viac informácií o tomto virtuálnom svete nájdete na nižšie uvedených linkách.

bitcoin_skoleni

To je zatiaľ všetko, podrobnejšie sa na niektoré výukové aspekty Robocode pozrieme v pokračovaní tohto článku.

Linky

Domáca stránka Robocode
Databáza robotov
Zoznam ďalších odkazov

Seriál: Robocode