ProgramatorCZ  |   Diskusní fórum  |   ASMDprojekt  |   Vtipy  |   JavaScript
Spolupracujeme:   WebGuru  |   Komplikátor  |   MinaSite Přidat k oblíbeným položkám  |   Nastavit jako výchozí stránku
Časopis
Hlavní stránka
Assembler
C,C++
Delphi
DOTNET
Flash
HTML
Java
JavaScript
Knihy
O Internetu
Pascal
PHP
Pro. programátor
Programy
Python
Tiskové zprávy

Projekty

JScript Planet
ProProjekty

Služby

Monitoring

Informace
Redakce
O časopisu
Odkazy
Nový redaktor


ISSN 1213-7359

Šéfredaktor:
Jan Sova

Zástupci šéfredaktora
Frerenzy Dawid
Krásenský David

Šéfredaktoři rubrik
Michal Chalupník
Formánek Jiří
Pavel Aleš
Sojka Zdeněk
Petr Rympler

Administrátor
Jan Sova

Naše ikonka
MinaSite
Komplikátorovy Stránky
TOPlist
GALACTICA

Časopis používá redakční systém Sova-Press.



Robocode - aneb Java (bojovou) hrou. v rubrice Java

Pokud vás už nebaví donekonečna hrát hry a chcete zkusit něco jiného, čtěte dál. A pokud už popáté hrajete jednu a tu samou strategii, a napadlo vás někdy, jaké to je, postavit se na druhou stranu a naprogramovat si vlastního "soupeře" - tank, který smaže své nepřátele z povrchu monitoru, jste tu správně.

Robocode je jednoduše geniální hračka - simulátor souboje tanků od IBM. Naprogramujete si v Javě svůj vlastní tank a můžete jej poslat do bitvy proti ostatním tankům. Do hrubé, typu všichni proti všem a nebo naopak do bitvy týmů, kde každý z tanků bude mít svou specializaci a svůj úkol. Co je k tomu potřeba? Kromě samotného prostředí, které lze stáhnout na stránkách Robocode samozřejmě i počítač - dle IBM je dostačující konfigurace Pentium II 400 MHz, 64 MB RAM a 10 MB na pevném disku - tedy žádné přehnané požadavky. Dále samozřejmě nainstalovaný JDK a to minimálně verze 1.3. Toliko k počítači. A co programátor? Třeba jsou samozřejmě alespoň základní znalosti Javy, něco málo z matematiky a pak už jen co nejvíc důvtipu.

Po stažení a nainstalování máte k dispozici samotné grafické rozhraní, editor zdrojových kódů, překladač (jikes - od IBM), popis API a nakonec celou řadu ukázkových robotů.

Prostředí spustíte pomocí robocode.bat (nebo robocode.sh na linuxu, případně přímo soubor robocode.jar), který se nachází v adresáři Robocode. Prostředí vypadá takto (pro plnou velikost, klikněte na náhled):

Probíhající bitva

Vlevo vidíte hrací plochu a vpravo editor zdrojových kódů. Na hrací ploše je již rozehrána bitva. V levém dolním rohu právě explodoval zasažený tank, vpravo pak tank obdržel zásah. Vlevo je možno zahlédnout i dvě letící střely. Pod každým z tanků je jeho jméno a nad ním je jeho energie (vysvětlena níže). V pravé části hlavního okna se nacházejí tlačítka, po jejichž stisknutí se zobrazí "konzole" každého z tanků, kam mohou zapisovat zprávy pro programátora.

Tank

Anatomie tanku

Takto vypadá náš tank - je jednoduchý. Skládá se ze tří částí - na samotném tanku se nachází věž s hlavní a na ní potom radar. To znamená, že pokud např. otáčí hlavní, otáčí se s ní i radar. Nicméně je možné s každou touto součástí pohybovat odděleně.

Programování robota (tanku)

Pokud jde o implementaci robota, každý robot je potomkem některé ze tříd robocode.Robot, robocode.AdvancedRobot a robocode.TeamRobot. Nejjednodušší je třída Robot, na které si ukážeme, jak vytvořit vlastní tank. Třída AdvancedRobot především umožňuje navíc kombinování činností či vytváření vlastních událostí (níže) a třída TeamRobot, která je vhodná pro psaní robotů do týmu (jak jinak), a která je potomkem třídy AdvancedRobot, umožňuje navíc zasílání zpráv mezi roboty. Navíc může každý robot implementovat rozhraní robocode.Droid, které přidává 20 bodů energie, ale deaktivuje radar, takže takový robot se hodí spíše (no, vlastně jedině...:-)) do týmů, kde může dostávat informace od robotů-velitelů - viz. ukázkový tým sampleteam.MyFirstTeam.

Nového robota vytvoříme tak, že ve spuštěném prostředí vybereme v nabídce Robot položku Editor. V tomto editoru pak v menu File->New->Robot. Zadáme jak se bude jmenovat (název třídy) a po té název balíčku (třeba jméno autora). Ve vytvořeném souboru se nachází základ nového robota, odvozeného od třídy robocode.Robot. Co teď?

Je dobré si uvědomit, že jakmile robota pustíme do boje, nemůžeme ho vést za ručičku (za hlaveň). Robot musí být soběstačný a musí se umět rozhodnout co dělat. Jestli má střílet, jestli a kam má poodjet atd. Stěžejní metodou třídy je metoda run(), kterou se robot spouští. Tato se spustí jen jednou - na začátku kola a v ní musí být základ všeho, co má robot po celou dobu dělat. Jak je vidět, v této metodě se nachází nekonečná smyčka while(true), která běží po celou dobu života robota, a ve které mu musíme dát instrukce, co dělat. Dále se tu nachází několik metod ve tvaru onXXX(), které obsluhují události jako zaměření jiného robota či fakt, že náš robot byl zasažen.

K ovládání robota existuje několik základních metod: ahead(), back(), kde se v parametru uvádí vzdálenost, kterou mají urazit. Dále turnRight() a turnLeft(), které říkají robotu, aby se otočil daným směrem o počet stupňů zadaných v parametru. A konečně turnGunRight() a turnGunLeft(), které podobně otáčí věží se zbraní (a s radarem). Dále můžete získat informace o poloze robota - getX() a getY(), o jeho natočení - getHeading(), o jeho energii - getEnergy() atd. Střílí se metodou fire(), případně fireBullet(), která navíc vrací objekt vystřeleného projektilu. V parametru těchto metod se udává energie, jakou se má se střílet. Samozřejmě, existuje celá řada dalších metod, ale jejich popis je nad možnosti článku, takže odkazuji na popis API, které se nachází v adresáři {robocode}\javadoc.

Kupříkladu, robot, který bude neustále jezdit ve čtverečku by měl takovouto metodu run():

public void run(){
  while(true){
    ahead(200);
    turnRight(90);
  }
}

Vždy popojede o 200 bodů, otočí se doprava o 90° a pokračuje zase dopředu...

Teď by nebylo na škodu na chvíli přerušit základní popis a říci si něco málo k pravidlům střelby. Na začátku každého souboje má každý robot počáteční energii 100. Každý výstřel stojí nějakou energii (označme si ji e) v rozsahu 0.1 až 3, která se odečítá z energie tanku, a která se zadává v parametru metody fire(). Pokud je zasáhnut cíl, odebere mu 4*e. Pokud však bylo však e>1, odebere se mu navíc ještě 2*(e - 1). Takže např. zásah plnou silou (e = 3) odebere zasaženému 4*3 + 2*(3-1) energie - tedy 16 bodů energie. Zásah střelou o síle 1 odebere jen 4*1 - tedy 4 body. A pokud se podařilo cíl zasáhnout, získá útočník trojnásobek této energie zpět (takže pokud začínal na 100, zasáhl s energií 3, má teď 106 bodů - tři mu sebral výstřel a devět obdržel za zásah). Robot, který už nemá energii je mrtev. Kolo vyhraje ten, který zůstane jako poslední.

Osud robota by měl být řízen zpracováním událostí. Několik základních je HitByBulletEvent, ke které dojde, pokud jsme byli zasaženi, HitRobotEvent, pokud jsme se srazili s cizím robotem, HitWallEvent, pokud jsme vrazili do zdi a konečně ScannedRobotEvent, pokud jsme zachytili cizího robota radarem. K obsluze těchto událostí slouží metody ve tvaru např. public void onScannedRobot(ScannedRobotEvent event), které musíme implementovat, pokud chceme tuto událost ošetřit. Objekty v parametru nám potom podávají informace o události jako např. vzdálenost zaměřeného robota, jeho rychlost či jeho energii. Na ukázku ošetříme událost ScannedRobotEvent tak, že vystřelíme na nepřítele. Pokud bude blízko (a tedy bude větší šance, že jej zasáhneme) vystřelíme s energií 3, jinak s energií 1:

public void onScannedRobot(ScannedRobotEvent e) {
  if (e.getDistance()<100)
    fire(3);
  else
    fire(1);
}

Podobným způsobem ošetřujeme i další události.

Už s těmito několika základními metodami a událostmi se dají psát celkem solidní roboti. Navíc máme k dispozici třídy pro práci se soubory, do kterých si mohou naši roboti zapisovat údaje, čímž se mohou i učit. Protože se obvykle hrají souboje o několika kolech, mohou si roboti ukládat např. informace o soupeřích.

Pokud je náš robot hotov, musíme jej zkompilovat - menu Compiler -> Compile. Nyní už můžeme vytvořit novu bitvu - v hlavním okně menu Battle -> New, kde vybereme roboty, kteří mají bojovat (můžeme vybrat i jen jediného, abychom si vyzkoušeli jeho pohyb), zadáme počet kol, velikost "arény", další hodnoty jako např. rychlost chladnutí zbraně (každým výstřelem se zbraň zahřívá a tank může střílet jen tehdy, pokud je teplota rovna nule). A bitva může začít.

Roboti řešení jako potomci třídy robocode.Robot mají však jednu nevýhodu. A to tu, že novou činnost (např. pohyb) mohou dělat až po té, co se dokončí ta předešlá. Takže např. nejprve popojedeme, pak se otočíme, pak zase popojedeme, ale nelze se za jízdy otáčet. Toto je vyřešeno až ve třídě robocode.AdvancedRobot, ve které jsou navíc metody typu setTurnRight(), setAhead() atd. (tedy, začínají slovem set). Takto můžeme vytvořit celý seznam činností, které pak můžeme "odpálit" metodou execute():

void run(){
  while(true){
    setAhead(200);
    setTurnRight(90);
    execute();
  }
}

Tento robot bude jezdit neustále po kružnici.

Základy strategie

Shrňme si pár užitečných bodů, na co dbát. Určitě je vhodné ošetřit nárazy do stěn a do ostatních robotů, protože tyto rovněž odebírají energii. Dobré je dbát na pohyb, aby se dal náš robot těžko zaměřit. Osobně mám raději polohy poblíž kraje, alespoň do té doby, dokud je v poli ještě hodně soupeřů. Je tam menší riziko jak zásahu zbloudilou střelou, tak i menší riziko palby od více nepřátel zároveň. Není nejlepší střílet jen tak nazdařbůh, protože každé minutí ubírá energii. Objekty získané při zpracovávání událostí jsou plné užitečných informací. Kupříkladu, když se srazíme s robotem, který má vyšší energii než my, nemá moc smysl se ho snažit za každou cenu "přestřílet" a je lepší odtamtud co nejrychleji zmizet. Zatímco, pokud je tento robot slabší, nám nic nebrání si na něm zvednout sebevědomí.

O robotech by se dalo ještě dlouho povídat, ale to není účelem tohoto článku. Jeho cílem bylo ukázat, že i programování může být zábava a ukázat kde je možné tuto zábavu hledat. A já jen doufám, že svůj cíl splnil. Pokud vás myšlenka Robocode nadchla, určitě nakoukněte jak na stránky Robocode na serveru Alphaworks od IBM, kde je řada odkazů na ostatní servery. Stejně tak se na stránkách IBM Developer Works nachází několik článků k tématu. Dalším vynikajícím serverem je RoboCodeRepository, kde se mimo jiné nachází řada jiných robotů ke stažení a ke studiu. A pokud pořád nevíte kam skočit, zkuste server Robocode.net.

Pokud Vám tyto odkazy nestačí, stačí lehce zagooglovat. A pokud se chcete přiučit Javě, můžete sledovat seriál, který na tomto serveru vychází ;-).

Autor: Pavel Patz e-mail: cdome@centrum.cz web:

Příspěvky ke článku

zajimave 09.11.2003 12:24:47 Autor: skyWalker
Download 09.12.2003 20:28:41 Autor: Stano
download, dalsi info 18.12.2003 09:51:04 Autor: cooler
40 06.12.2004 23:17:07 Autor: 30
Robocode 27.03.2005 13:56:36 Autor: Oroborus
Zni to uzasne 13.09.2005 22:02:38 Autor: H4wk.cz
nevim jak na to!!! 02.12.2005 22:18:27 Autor: Tommyx
Přidat komentář

Poslední ze stejné rubriky

Začínáme v Javě (7.): Konstruktory a přetěžování metod
Začínáme v Javě (6.): Třídy a objekty.
Začínáme v Javě (5.): Podmínky, cykly a kolektiv.
Začínáme v Javě (4.): Operace s operátory
Java a její layout managery

Funkce ke článku
Přidat komentář

Nejnovější články
Práce s událostmi v .NET Framework. [18095]
Nová soutěž na 3D Contestu CZ [13684]
Práce v .NET Framework - Zástupci [15998]
Práce s XML v C# (5.) - ověřování dokumentu pomocí třídy XmlValidatingReader [14049]
Práce s XML v C# (4.) - třídy XmlDocument a dotazy jazyka XPath [19472]


O článku
Datum: 17.10.2003
Rubrika: Java
Čtenářů: 20893
Autor: Pavel Patz

Hodnocení článku:
Znamka: 2.75
Počet známek: 2889
[1] [2] [3] [4] [5]

 


(c) Systém Jan Sova, Design David Krásenský a Jan Sova
Se svými dotazy či problémy se obracejte na diskusní fórum.
Časopis je součástí projektu Programator