Você está na página 1de 18

Robocode - Introduo

O ROBOCODE um ambiente JAVA que contm ferramentas para a criao e uso de robs. Para que voc possa executar, necessrio ter um computador com:
Pentium II - 400, ou equivalente, para ter uma velocidade razovel 64MB de RAM Aprox. 10MB de disco para instalao, mais alguma folga.

Deve ter instalado o JSDK verso 1.3 em diante. (Se no tiver, baixe daqui a verso 1.4 ), instale ento o Robocode. Clique neste arquivo e deixe que ele se instale. Ao fim haver um cone na rea de trabalho do Windows com o ttulo Robocode.

Regras
A batalha pode ser configurada: a quantidade de rounds, o tamanho do ring em pixels, os robs que lutaro entre s. Pode escolher visualizar o nome em baixo dos robs, as energias, os seus radares, e permitir a mudana de cor durante a batalha. O rob pode se movimentar para frente ou para traz e fazer curvas. O canho(Gun) pode virar no sentido horrio e anti-horrio em 360 graus, e dar tiros(Bullet) de fora >0 e <=3. Quando o rob fica desabilitado(Disabled), ele perde seus movimentos, isso acontece quando sua energia fica igual a 0. O rob "cego", a nica coisa que ele v so os robs adversrios scaneado pelo radar(Radar), os tiros o radar no enxerga. Todos os robs comeam cada round com energia 100, e os que ficarem com energia abaixo de 0 vo sendo eliminados (explodem) restando apenas um, e ento comea um novo round. No fim de todos os rounds a batalha acaba e aparece uma tabela mostrando a pontuao e a colocao. Perde energia quando: bate na parede: (energia) - 1 bate em outro rob(os dois perdem): (energia) - 1 quando atira: (energia) - (poder_do_tiro). quando leva um tiro: (energia) - (4 * poder_do_tiro_advesrio). Ganha energia quando: acerta um tiro no adversario: (energia) + (2 * (energia_perdida_do_adversrio - poder_do_tiro).

Criando o seu primeiro rob


A primeira coisa abrir o editor de robs do menu principal, clique em Menu -> Editor. Quando a janela do editor abrir, clique em File -> New Robot para criar um rob novo. Entre com o nome do seu rob e depois digite o nome do diretrio que os arquivos do seu rob ficar esse diretrio dever estar dentro do diretrio "C:\Robocode\Robots\". Se o diretrio que voc digitou no existir ele cria automaticamente. Agora deve aparecer o cdigo bsico do rob.
package Novo; // aqui "Novo" o nome do diretrio que est seu rob import robocode.*; public class MeuRob extends Robot { //Onde "MeuRob" o nome do rob, digitado

anteriormente. //Onde est escrito "Robot" digite no lugar "AdvancedRobot" que uma classe mais avanada.
public void run() { while (true) { // while() um comando de repetio. Como est sendo
mandado um parmetro // "true", causar um loop infinito, fazendo repetir os comandos dentro dele at a batalha acabar. // Quando outro evento tiver sendo executado a repetio interrompida e voltar de onde parou // quando acabar de executar os comandos do evento.

ahead(100); turnGunRight(360); back(100); turnGunRight(360); } } public void onScannedRobot(ScannedRobotEvent e){ fire(1); } }

O prximo passo gravar e compilar o rob. Para gravar, seleciona File -> Save e siga as instrues. Para compilar, seleciona Compile -> Compile. V agora para a tela do ambiente e dentro do item de menu Battles -> New, escolha o seu rob e algum outro para a disputa.

Voc tambm pode examinar como cada um destes robs "samples" foram construdos.

Eventos
sensato conhecer todos os eventos para ter a mente mais aberta quando for comear a programar a inteligncia de seu rob. Os eventos so chamados quando acontece algo especfico no decorrer do combate. Alguns deles te enviam, por parmetro, dados do rob adversrio em questo para voc trabalhar com esses valores dentro do evento. Exemplo: se voc digitar "e.getBearing()" dentro de algum evento que contm na classe da varivel, enviada por parmetro, o mtodo "getBearing()" , como os tipos ScannedRobotEvent e HitRobotEvent, retornar o ngulo do rob inimigo em questo. Sendo que "e" o nome da varivel usada como parmetro, que pode ser qualquer outro. INDICE:
Run onScannedRobot onWin onHitRobot onHitWall onHitByBullet onBulletHit onBulletMissed onBulletHitBullet onDeath onRobotDeath onSkippedTurn onCustomEvent

Run
executado quando o round for iniciado. Diferente do que muitos pensam esse evento s ser chamado novamente quando iniciar outro round. Por isso muito comum e recomendado usar um

loop infinito dentro dele, para que seu rob nunca fique parado quando no tiver sendo executado outro evento. Exemplo:
public void Run() { do { turnRadarLeft(360); setAhead(200); turnRight(300); }while(true) }

onScannedRobot
Executado quando o radar do seu rob encontra um adversrio. um dos eventos mais importantes, pois a nica forma de saber a energia, a distncia, o ngulo dos seus inimigos para poder atira nele. A no ser se voc colidir com outro rob, que j seria um outro evento. Metodos da classe ScannedRobotEvent:
Comandos getName() getBearing() getBearingRadians() getDistance() getEnergy() getHeading() getHeadingRadians() getVelocity() Tipo Retorno String double double double double double double double Descrio Retorno Retorna o nome do rob adversrio scaneado. Retorna o ngulo do rob adversrio em relao ao seu rob ngulo em radianos do rob adversrio em relao ao seu. Retorna a distncia do rob adversrio em relao ao seu rob. Retorna a energia do rob adversrio. Retorna o ngulo em graus do adversrio em relao a tela. Retorna o ngulo em radianos do adversrio em relao a tela. Retorna a velocidade do rob scaneado.

Exemplo:
public void onScannedRobot(ScannedRobotEvent Inimigo) { double angulo = Inimigo.getBearing(); double distancia = Inimigo.getDistance(); if ( distancia < 200 ) { turnGunRight(angulo);

fire(2); } }

Obs: No confunda "getEnergy()" com " Inimigo.getEnergy()", pois o primeiro a energia de seu rob e o outro a energia do rob scaniado.

onWin
executado quando seu rob ganha o round. J que aqui o round terminou, aproveite para programar uma risadinha, uma dana, malhando dos derrotados. Ou para ele parar de andar, evitando que bata na parede, perdendo energia. Exemplo
public void onWin(WinEvent e) { turnRight(36000); }

onHitRobot
executado quando seu rob bate em outro rob. Aproveite que voc est bem perto do inimigo, vire o canho para ele e mande um tiro de fora mxima, porque dificilmente errar. Mtodos da classe HitRobotEvent:
Comandos getName() getBearing() getBearingRadians() getEnergy() isMyFault() Tipo Retorno String double double double boolean Descrio Retorno Retorna o nome do rob adversrio colidido. ngulo em graus do rob adversrio em relao ao seu rob ngulo em radianos do rob adversrio em relao ao seu rob. Retorna a energia do rob adversrio. Retorna true se foi seu rob quem originou o evento, e false se foi o adversrio que bateu em seu rob.

Exemplo:
public void onHitRobot(HitRobotEvent INI) { turnRight(INI.getBearing()); fire(3); }

onHitWall
executado quando seu rob colide com a parede. Quando seu rob bate na parede, perde energia. Ento o mnimo que voc deve fazer mudar a direo dele, seno ele vai ficar de encontro parede at perder toda a sua energia. Mtodos da classe HitWallEvent:
Comandos getBearing() getBearingRadians() Tipo Retorno double double Descrio Retorno ngulo em graus da parede batida em relao ao seu rob. ngulo em radianos da parede batida em relao ao seu rob.

Exemplo:
public void onHitWall(HitWallEvent e) { turnLeft(180); }

onHitByBullet
executado quando seu rob leva um tiro. Se a estratgia do seu rob ficar parado enquanto atira, bom utilizar esse evento para sair do local de onde acabou de levar um tiro, para voc no se tornar um alvo fcil. Mtodos da classe HitByBulletlEvent:
Comandos getName() getBearing() getBearingRadians() getHeading() getHeadingRadians() getBullet() getPower() getVelocity() Tipo Retorno String double double double double Bullet double double Descrio Retorno Retorna o nome do rob adversrio que te acertou um tiro. Retorna o ngulo do rob adversrio em relao ao seu rob. ngulo em radianos do rob adversrio em relao ao seu rob. Retorna o ngulo em graus do rob adversrio em relao a tela. ngulo em radiaons do rob adversrio em relao a tela. Retorna o Bullet (tiro) do rob adversrio que atingiu seu rob. Retorna a fora do tiro. Retorna a velocidade do tiro.

Exemplo:
public void onHitByBullet(HitByBulletEvent e) { ahead(100); }

onBulletHit
executado quando seu tiro acerta um adversrio. Mtodos da classe BulletHitEvent:
Comandos getName() getBullet() getEnergy( ) Tipo Retorno String Bullet double Descrio Retorno Retorna o nome do rob adversrio que voc acertou um tiro. Retorna o Bullet (dados do tiro) de seu rob que atingiu o adversrio. Retorna a energia do rob adversrio aps levar o tiro.

Exemplo:
public void onBulletHit(BulletHitEvent e) { Acertos++; }

Esse evento e os outros abaixo so usados em programaes mais avanadas e complexas.

onBulletMissed
executado quando uma de suas balas colide com a parede(erra o tiro). Mtodos da classe BulletMissedEvent:
Comandos getBullet() Tipo Retorno Bullet Descrio Retorno Retorna o Bullet (dados do tiro), de seu rob, que bateu na parede.

Exemplo:
public void onBulletMissed(BulletMissedEvent e) { ERROS++; }

onBulletHitBullet
executado quando uma de suas balas colide com outra bala. Mtodos da classe BulletHitBulletEvent:
Comandos getBullet() getHitBullet() Tipo Retorno Bullet Bullet Descrio Retorno Retorna o Bullet (dados do tiro) de seu rob. Retorna o Bullet do rob adversrio.

public void onBulletHitBullet(BulletHitBulletEvent e) { }

onDeath
executado se seu rob morrer. Exemplo:
public void onDeath(DeathEvent e) { System.out.println(getName()+" morreu!"); System.out.println("Quantidade de inimigos ainda vivo: "+getOthers()); }

onRobotDeath
executado quando morre um adversrio. Mtodos da classe RobotDeathEvent:
Comandos getName() Tipo Retorno String Descrio Retorno Retorna o nome do rob que morreu.

Exemplo:
public void onRobotDeath(RobotDeathEvent e) { if(Nome==e.getName()) Nome=null; }

onSkippedTurn
Se voc estiver um longo tempo sem ao.

Exemplo:
public void onSkippedTurn(SkippedTurnEvent e) { turnGunLeft(360); }

onCustomEvent
Quando um uso de condio "addCustomEvent" satisfeita.
Comandos getCondition() Tipo Retorno Condition Descrio Retorno Retorna a condio que gerou o evento.

Exemplo:
public void onCustomEvent(CustomEvent e) { }

Mtodos
Movimentao - Robot

Comando ahead( double )

Parmetro a distncia que o rob dever percorrer. a distncia que o rob dever percorrer. o ngulo em graus que o rob dever girar. o ngulo em graus que o rob dever girar. o ngulo em graus que o canho dever girar o ngulo em graus que o canho dever girar o ngulo em graus que o radar dever girar o ngulo em graus que o radar dever girar

back( double ) turnRight( double ) turnLeft( double ) turnGunRigth( double ) turnGunLeft( double ) turnRadarRigth( double ) turnRadarLeft( double )

Descrio Movimenta o rob para frente, uma distncia x dada por parmentro. Se o rob bater em outro, ou na parede antes de completar a distancia desejada o mtodo interrompido. Semelhante ao mtodo anterior, a nica diferena que o rob move para traz. Gira o rob para a direita (sentido horrio). Gira o rob para a esquerda (sentido anti-horrio). Gira o canho para a direita. Gira o canho para a esquerda. Gira o radar para a direita. Gira o radar para a esquerda.

Movimentao - AdvancedRobot
Os comandos da classe AdvancedRobot que comeam com "set" eles funcionam como os herdados da classe Robot. A diferena que enquanto o mtodo est sendo executado ele continua executando as linhas de comando abaixo. Com isso possvel misturar movimentos. Por exemplo, se tiver: ahead(100); turnRight(90); o rob ir andar para frente e depois que tiver terminado de percorrer a distncia 100, ele girar 90. Mas se tiver: setAhead(100); setTurnRight(90); o rob andar para frente e girar 90 ao mesmo tempo, fazendo uma curva.

Comando setAhead( double ) setBack( double ) setTurnRight( double ) setTurnLeft( double )

Parmetro a distncia que o rob dever percorrer. a distncia que o rob dever percorrer. o ngulo em graus que o rob dever girar. o ngulo em graus que o rob dever girar.

Descrio Herdado do mtodo ahead. Herdado do mtodo back. Herdado do mtodo turnRight. Herdado do mtodo turnLetf.

setTurnGunRigth( double ) setTurnGunLeft( double ) setTurnRadarRigth( double ) setTurnRadarLeft( double )

o ngulo em graus que o canho dever girar o ngulo em graus que o canho dever girar o ngulo em graus que o radar dever girar o ngulo em graus que o radar dever girar

Herdado do mtodo turnGunRigth. Herdado do mtodo turnGunLeft. Herdado do mtodo turnRadarRigth. Herdado do mtodo turnRadarLeft.

Movimentao - AdvancedRadiansRobot
Esses mtodos "Radians" so usados quando vai se trabalhar com PI, seno, cosseno, tangente. Os mtodos que comeam com "set" so como aqueles visto acima, que continuam lendo as linhas de comando abaixo, misturando movimentos.
Comando turnRightRadians( double ) turnRightRadians( double ) turnGunRightRadians( double ) turnGunLeftRadians( double ) turnRadarRigthRadians( double ) turnRadarLeftRadians( double ) setTurnRightRadians( double ) setTurnLeftRadians( double ) setTurnGunRightRadians( doubl e) setTurnGunLeftRadians( double ) setTurnRadarRigthRadians( dou ble ) setTurnRadarLeftRadians( doub le ) Parmetro o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos o ngulo em radianos Descrio Gira o rob para a direita. Gira o rob para a esquerda. Gira o canho para a direita. Gira o canho para a esquerda. Gira o radar para a direita. Gira o radar para a esquerda. Herdado do mtodo turnRightRadians. Herdado do mtodo turnLeftRadians. Herdado do mtodo turnGunRightRadians. Herdado do mtodo turnGunLeftRadians. Herdado do mtodo turnRadarRightRadians. Herdado do mtodo turnRadarLeftRadians.

Tiro - Robot
Comando fire( double ) Parmetro a fora do tiro, e subtraido da energia de seu rob. Descrio

Atira imediatamente na fora mandada por parmetro, de 0.1 at 3. Se mandar um tiro maior que 3 ele considera fora 3.
A diferena do mtodo anterior que ele uma

fireBullet( doubl

a fora do tiro, e subtraido da energia

e)

de seu rob.

funo e retorna um valor do tipo Bullet, alm disso, manda outro tiro em seguida, este com mais velocidade, se o primeiro tiro tiver boas possibilidades da acertar.

Tiro - AdvancedRobot
Comandos setFire( double ) setFireBullet( doubl e) Parmetro a fora do tiro, e subtraido da energia de seu rob. a fora do tiro, e subtraido da energia de seu rob. Descrio Herdado do mtodo fire. Herdado do mtodo fireBullet.

Envia Dados Para O Rob


Comando setAdjustGunForRobotTurn( boole an ) setAdjustRadarForGunTurn( boole an ) setColors( Color, Color, Color ) Parmetro Descrio

a cor do rob, a cor do canho, a cor do radar, nesta ordem.

Atribuem as cores do rob.

Retorna Dados do Rbo


Comando getName() getEnergy() getX() getY() getWidth() getHeight() Tipo do Retorn o String double double double double double Descrio do Retorno Retorna o nome do rob. Retorna a energia corrente do rob. A posio X(eixo horizontal) do rob na arena de batalha. Quando 0(zero) ele estar encostado no lado esquerdo. A posio Y(eixo vertical) do rob na arena de batalha. Quando 0(zero) ele estar encostado na parte de baixo. Retorna a largura do rob. Retorna a altura do rob.

getHeading() getGunHeading() getRadarHeading() getGunCoolingRate() getGunHeat() getVelocity()

double double double double double double

Retorna o ngulo em graus ( de 0 at 360 ) que o rob est virado. Se retornar 0(zero) ele est virado para a esquerda, se retornar 90 ele est voltado para cima. Retorna o ngulo em graus que o canho est virado. Como no mtodo anterior. Retorna o ngulo em graus que o radar est virado. Retorna quanto o canho est virando no momento corrente. Retorna a velocidade do rob.

Retorna Dados do Rob - AdvancedRadiansRobot


Comandos getHeadingRadians() getGunHeadingRadians() getRadarHeadingRadians() getTurnRemainingRadians() getGunTurnRemainingRadians() getRadarTurnRemainingRadians() Tipo do Retorn o double double double double double double Retorno Retorna a direo que o rob est voltado, em radianos (de 0 at 2*PI). Retorna o ngulo em radianos do canho est apontado em relao a tela Retorna o ngulo em radianos do radar est voltado em relao a tela

Retorna Dados da Batalha


Comandos getOthers() getBattleFieldHeight() getBattleFieldWidth() getNumRounds() getRoundNum() getTime() Tipo do Retorn o int double double int int long Retorno Retorna o total de oponentes ainda vivos no round. Retorna a altura da arena de batalha. Retorna a largura da arena de batalha. Retorna o total de rounds da batalha. Retorna o nmero do round corrente. Retorna o tempo do round. Quando inicia outro round o tempo volta a 0(zero). O tempo equivale ao nmero de quabgazul.jpgdros mostrados.

Outros
Comando doNothing() scan() stop() stop( boolean ) resume() setResume() setStop() setStop( boolea n) finalize() Parmetro nenhum parmetro nenhum parmetro nenhum parmetro nenhum parmetro nenhum parmetro nenhum parmetro nenhum parmetro Descrio

Funes
Voc pode digitar a funo em qualquer lugar dentro do "public class", no incio ou no fim do cdigo, a linguagem Java permite. INDICE:
anguloRelativo mira dancinha dancinha2

dancinha3 risadinha fogo tiroFatal pertoParede

anguloRelativo
Essa funo muito utilizada, at pelos robs do diretrio samples. Nela voc manda por parmetro o ngulo(valor do tipo double) a ser deslocado pelo radar, ou pelo canho, ou at mesmo do seu rob se voc querer ir em direo ao inimigo, a funo retornar se a volta menor ser no sentido horrio ou anti-horrio.

public double anguloRelativo(double ANG) { if (ANG> -180 && ANG<= 180) return ANG; double REL = ANG; while (REL<= -180) REL += 360; while (ANG> 180) REL -= 360; return REL; }

No evento onScanedRobot ou onHitRobot digite:


turnRadarRight(anguloRelativo(e.getBearing()+getHeading()getRadarHeading()));//para mirar o radar no adversrio. turnGunRight(anguloRelativo(e.getBearing()+getHeading()getGunHeading())); //para mirar o canho no adversrio. turnRight(anguloRelativo(e.getBearing)); //para virar seu rob em direo do

adversrio Obs: Sempre "Right", nunca use "Left" para essa funo porque no da certo.

mira
Isso na verdade um procedimento e no uma funo, criado em base da funo anterior. Ela mira o canho com mais rapidez e o cdigo mais limpo. A funo anterior j est embutida, ela no ser mais necessria.

public void mira(double Adv) { double A=getHeading()+Adv-getGunHeading(); if (!(A > -180 && A <= 180))

{ while (A <= -180) A += 360; while (A > 180) A -= 360; } turnGunRight(A); }

No evento onScanedRobot ou onHitRobot digite:


mira(e.getBearing());//mira o canho contra o adversrio fire(2);

dancinha
Procedimento que voc usa para gozar do adversrio ou comemorar quando ganhar um round.
public void dancinha() { setAhead(5); setTurnRight(360D); setTurnGunLeft(360D); setTurnRadarRight(30D); }

No evento onWin digite:


dancinha();

dancinha2
Aqui outro tipo de dancinha.
public void dancinha2() { setMaxVelocity(8D); setTurnRight(dir * 30); setTurnGunLeft(dir * 30); setTurnRadarRight(dir * 30); if(getTime() % (long)2 == 0L) dir *= -1; }

No evento onWin digite:


dancinha2();

dancinha3
Essa comemorao sai atirando bala pra tudo que lado
public void dancinha3() { setMaxVelocity(5); setTurnGunRight(10000); while(true) { ahead(20); back(20); if (getEnergy() > 0.1) fire(0.1); } }

risadinha
Malhando dos perdedores. Treme o rob como se estivesse rindo.
public void rizadinha() { for (int i = 0; i < 50; i++) { turnRight(30); turnLeft(30); } }

fogo
Esse procedimento melhora o tiro do seu rob, voc no disperdiar energia e o rob parar de atirar de muito longe quando a energia dele for menor que 15.
public void fogo(double Distancia) { if (Distancia> 200 || getEnergy() < 15) fire(1); else if (Distancia > 50) fire(2); else fire(3); }

Para usar:
fogo(e.getDistance());

tiroFatal
Esse procedimento da um tiro baseado na energia inimiga, ela muito boa para dar o ltimo quando o adversrio estiver com um tiro para morrer(energia <12), porque seu rob no disperdiar energia. Por exemplo, se o adversrio estiver com energia=3, e voc der um tiro 3 voc vai mat-lo e vai ganhar 3 de energia (3*2-3 =3), mas com essa funo voc tambm matar e ganhar 5.15 de energia (3*2-0.85=5.15)
public void tiroFatal(double EnergiaIni) { double Tiro = (EnergiaIni / 4) + .1; fire(Tiro); }

Para usar:
if(e.getEnergy<12) tiroFatal(e.getEnergy); else fire(2);

pertoParede
Funo que retorna true(verdadeiro) se seu rob est perto da parede
public boolean pertoParede() { return (getX()<50 || getX()>getBattleFieldWidth()-50 || getY()<50 || getY()>getBattleFieldHeight()-50); }

antes de mandar seu rob andar escreva:


if(pertoParede()) back(100); else ahead(100);

Você também pode gostar