Página 1 de 6 Quem não se surpreendeu ao saber que a nossa tão querida linguagem Java estaria a 55.760.000 Km da Terra em um rover (robô geólogo de exploração) vasculhando os desertos de Marte! Bem, você não terá controle sobre ele, mas poderá programar seu próprio robô em Java e duelar com outros em um incrível jogo, o Robocode. Neste artigo você irá conhecer um pouco sobre ele, com instalar e a criar seu robô. Um pouco de história O jogo foi criado pelo projeto AlphaWorks com o objetivo de ajudar pessoas a aprender Java e tornar isto divertido, o que realmente conseguiram fazer. O projeto AlphaWorks desenvolvido pela IBM, tem como objetivo trazer uma oportunidade para desenvolvedores no mundo todo experimentarem as novas tecnologias, estas tem sua origem em oito laboratórios de pesquisa espalhados pelo mundo. Depois com desenvolvedores, times de marketing e entre outros, elas são divulgadas. Após isto as tecnologias começam a chegar ao público com a disponibilização de download na internet, porém a chave para o sucesso vem com a alta motivação para IBM Research, a comunidade de desenvolvedores e grupos de produtos IBM produzirem material sobre tal assunto. Finalizando para se obter um resultado mais concreto estas tecnologias são combinadas com oportunidades. Neste ponto surgiu o Robocode. Com todo este processo o AlphaWorks criou produtos como XML Parser for Java, WebASjdbc, Jinsight (uma ferramenta para visualizar e analisar e execução de programas Java), e o Bean Machine, também conhecido como The Beanery, um ferramenta de ajuda na criação de JavaBeans, onde se pode adicionar novas capacidades e então visualizar o novo código fonte. Entre as características estão a criação de propriedades, classes BeanInfo, editores de propriedades sob medida ; o Bean Machine ainda provem um bom modo de se aprender as capacidades dos Beans através da produção de um código fácil de se ler. Instalando e conhecendo o jogo O Robocode foi criado por Mathew Nelson, o jogo é todo desenvolvido e Java, assim como os robôs que você pode programar, os quais implementam todos os recursos da linguagem de forma muito bem organizada, Mathew realmente esta de parabéns. Como o jogo é todo feito em Java para jogar você precisará ter em seu computador uma JVM que suporte Java tm 2 versão 1.3 ou superior e mais isto: Pentium II - 400, ou equivalente (Robocode deve rodar em computadores menos potentes, mas devagar) 64MB de RAM possibilidade de 32, mas sem garantias. Aproximadamente 10MB de espaço livre em disco. O jogo pode ser adquirido gratuitamente em www.alphaworks.ibm.com/robocode, com o nome de robocodesetup.jar. Depois de baixar o arquivo, descompacte-o: java jar robocode-setup.jar Após isto você está pronto para jogar, é só executar o arquivo robocode.jar. Dentro do jogo existem quatro telas que são indispensáveis. A primeira fica no menu Battle e New, onde você visualiza os robôs disponíveis (Robots) e escolhe os que irão duelar (Selected Robots), também se escolhe o número de batalhas e outras opções. Agora, se você quiser duelar com outros robôs precisará importa-los para o jogo, indo em Robot e Import downloaded robot, localize o arquivo.jar do robô e clique em Ok, se por acaso quando for iniciar uma nova batalha não achar o robô, aperte F5 para atualizar a lista. Essim como você importou outros robôs pode exportar o seu. O jogo faz isto empacotando a(s) classe(s) já compiladas (.class) em um arquivo.jar (Java Archive). Para fazer isto selecione Package robot for upload, selecione o robô que deseja ser empacotado, clique em Next. Irá aparecer uns campos para serem preenchidos com informações referentes ao seu robô, em seguida clique em Next, selecione o diretório para colocar o robô compactado, Next mais uma vez e finalize clicando em Package!. Agora só nos falta a mais importante, ou pelo menos indispensável, o editor, localizada em Robot e Editor. Se você possui algum outro editor java pode usa-lo, mas lembre se de configurar o ClASSPATH de acordo com o do robocode. Conhecendo o robô Existem três tipos de robôs, os que estendem a classe Robot, os que estendem AdvancedRobot e os que estendem Robot e implementam Droid. Sobre os terceiro caso irei falar mais adiante nos times, agora vamos nos concentrar na classe Robot, que não tem muita diferença em relação a AdvancedRobot, somente menos agilidade nos movimentos e alguns outros recursos.
Página 2 de 6 O nosso robô possui três partes, a base, a arma e o radar: Estas partes estão ligadas entre si, e quando uma se move a superior se move junto, porém isto pode ser ajustado. A arma e o radar se movem 360º em qualquer direção, bem como a base. Quando a velocidade com que um robô se move, é determinada pelo próprio jogo baseada na distância, isto também vale quando ele gira para os lados e quando move a arma ou o radar. Métodos básicos na classe Robot Uma observação presente na API do robocode: Heading ângulo absoluto em graus com 0 apontando para o topo da tela, positivo no sentido horário. 0 <= heading < 360. Bearing ângulo relativo a algum objeto da direção do robô, positivo no sentido horário. -180 < bearing <= 180
Página 3 de 6 Método Tipo de Retorno Descrição setcolors(color robotcolor, Color guncolor, Ajusta cor da base, da arma e do radar Color, radarcolor) run() O método principal de cada robô, sobrescreva-o com as ações básicas de seu robô ahead() Anda para frente back() Anda para trás turnright(double degrees) Gira o robô para a direita em graus turnleft(double degrees) Gira o robô para a esquerda em graus turnradarright(double degrees) Gira o radar para a direita turnradarleft(double degrees) Gira o radar para a esquerda turngunright(double degrees) Gira a arma para a direita turngunleft(double degrees) Gira a arma para a esquerda fire(double power) Atira uma bala, com força de 1 a 3 scan() Procura por outros robôs, normalmente chamado pelo próprio jogo getx() double Retorna a posição X gety() double Retorna a posição Y getenergy() double Retorna a sua energia getothers() int Retorna o número de oponentes na arena getvelocity() double Retorna a velocidade do robô getheading() double Retorna a direção que o robô esta apontando getgunheading() double Retorna a direção que a arma esta apontando getradarheading() double Retorna a direção que o radar esta apontando getgunheat() double Se você atira muito com sua arma ela fica muito quente, então para poder atirar novamente você deve esperar que ela de uma esfriada, este método retorna o calor da arma, se for igual a 0, pode atirar Sobre o método fire(double power), se você atingir um alvo fará dano de 4 * power e ganha 3 * power de energia, se power for maior que 1 você fará 2 * (power - 1) a mais. Quero fazer uma observação sobre os métodos para movimentar seu robô. Se você utiliza o turnright(90) ele vira em 90º para a direita, mas se usar turnrught(-90) e vira 90º para a esquerda! O mesmo acontece com os métodos back(), ahead() e com a arma e o radar. Lembra-se que eu falei que as partes do robô não precisam se mover junto com sua base, ai é que muda, por padrão o robô começa com todos como false. setadjustradarforgunturn(boolean newadjus tradarforgunturn) setadjustradarforrobotturn(boolean newadj ustradarforrobotturn) setadjustgunforrobotturn(boolean newadjus tgunforrobotturn) A classe Robot também possui alguns eventos: o radar não se move se a arma girar o radar não se move se o robô girar a arma não se move se o robô girar Todos estes métodos têm como argumento uma classe específica para o evento. Se quiser saber mais sobre elas, ou qualquer outra classe relacionada ao jogo, veja a API que vem junto com o jogo.
Página 4 de 6 Evento onwin(winevent event) onscannedrobot(scannedrobotevent event) onrobotdeath(robotdeathevent event) onhitwall(hitwallevent event) onhitrobot(hitrobotevent event) onhitbybullet(hitbybulletevent event) ondeath(deathevent event) onbulletmissed(bulletmissedevent event) onbullethitbullet(bullethitbulletevent event) onbullethit(bullethitevent event) Disparado quando... você ganha o round o radar encontra um robô outro robô morrer você colidir com a parede você colidir com outro robô for atingido você morrer você perde uma bala, atingir a parede duas balas se chocam você acerta um robô Métodos básicos na classe AdvancedRobot Os métodos para mover o robô são quase os mesmos, a diferença é que começam com setxxx(), como turnright() ficaria setturnright() e ahead() ficaria setahead().na prática a diferença para girar seu robô seria como a curva é feita, com o primeiro o robô para de andar para fazer a curva, mas no segundo faz isto andando, porém a curva fica mais aberta, ai depende de você decidir qual fica melhor para o seu robô. addcustomevent() permite criar seu próprios eventos, a partir de um objeto Condition, veja o exemplo da criação de um, onde a condição é quando a energia for igual a 20. Condition c = new Condition("perigo") public boolean test() return (getenergy() == 20); ; ; Agora nos falta adicionarmos um novo evento com esta condição. addcustomevent(c); Para capturar o evento usamos o oncustomevent(customevent evt). Observe, do objeto CustomEvent, pegamos um objeto Condition, e então pegamos o nome da condição, para decidir qual é quando temos mais de uma e tratá-la corretamente. public oncustomevent(customevent event) if ( event.getcondition().getname().equals("perigo") ) // imprime uma mensagem de aviso no console System.out.println("Cuidado, você esta morrendo"); execute() executa ações pendentes ou continua executando as que estão em processo, você irá usa-lo muito com métodos getxxx() e setxxx(), veja o evento onwin, a seguir. seteventpriority(string eventclass, int priority) serve para situações onde dois eventos são disparados ao mesmo tempo, como um onscannedrobot e um onhitbybullet, e você precisa decidir de qual o jogo ria tratar primeiro. Ele recebe dois argumentos, uma String para o evento ScannedRobotEvent, CumtomEvent,... e a prioridade do evento, que vai de 0 a 99. Criando um robô O robô que vou mostrar é bem simples, quando acha um inimigo ele o segue ou atira, dependendo de sua distância, parece que ele não faz nada, mas verão como ele pode ser uma pedra no sapato se aperfeiçoado um pouco. Vamos começar criando a estrutura básica do robô.
Página 5 de 6 // o nome do pacote não pode exceder 16 caracteres package org.rsjug.robocode; import robocode.*; // caso queira mudar a cor de seu robô... import java.awt.color; public class Vlade extends AdvancedRobot public run() public onscannedrobot(scannedrobotevent event) public onwin(winevent event) Para aqueles que não conhecem Vlade, viveu em um castelo na Transilvânia, e é uma das teorias que tenta desvendar a existência de Drácula. Vlade era conhecido pela sua habilidade de empalar pessoas. O povo do local conta que certa vez soldados iriam invadir a cidade, passando pela montanha de seu castelo, mas ele cobriu-a toda com homens empalados, assim quando os soldados virão seus amigos desta forma, voltaram como galinhas assustadas. Como virão um bom robô não precisa ter muitos métodos ou ser complexo, o segredo é conhecer bem a API e como ele se comporta! No método run() vamos mudar a cor do nosso robô e definir seu comportamento básico, que é declarado no loop while, recebendo true como parâmetro, para sempre ser executado. public run() setcolors(color.black, Color.BLACK, Color.ORANGE); while (true) seetturngunright(double.positive_infinity ); Pedimos para a arma girar e não o radar, pois se encontrarmos alguma coisa, fica mais fácil só manda-la atirar direto do que primeiro gira-la até a posição do radar, lembrando que quando se move uma parte, a superior se move junto. Agora que já definimos um comportamento para nosso robô, vamos dizer a ele o que fazer quando avistar um inimigo. Bem, ele primeiro avalia a distância, se for maior que 100, ele corre até o alvo, senão atira com força 3 se a distância for até 40, senão atira com 1. public onscannedrobot(scannedrobotevent event) // se a distancia for maior que 100 if (event.getdistance() > 100) // se vira na direçao do robô e corre! setturnright(event.getbearing()); setahead(double.positive_infinity ); else // atira if (event.getdistance() <= 40) fire(3); else fire(1);
Página 6 de 6 Se quiser deixá-lo mais agressivo, mande-o correr na direção do outro robô e atire de qualquer distância, você gasta mais balas, mas tem um melhor ataque. Vamos a comemoração! public onwin(winevent event) setadjustradarforgunturn(true); setadjustgunforrobotturn(true); while (true) setturnleft(double.positive_infinity ); setturngunright(double.positive_infinity ); setturnradarright(double.positive_infinity ); // se lembra do que falei sobre métodos setxx()? execute(); Times Bem, se você acha fácil programar um só robô, tente um time todo; isso mesmo, um time com um líder e droids, robôs sem radar comandados pelo líder e com 20 a mais de energia. Os droids sabem como atira pelo líder, ele localiza os inimigos e lhes diz suas posições, claro, com um pouco de trigonometria hehehe, pensaram que ia se ver livres dela. Neste artigo não vou me aprofundar, desta forma, se quiser criar seu time, recomendo que olhe o que vem com o jogo e visite os links da bibliografia, são ótimos. Bibliografia http://robocode.net/ http://www.alphaworks.ibm.com/robocode http://robowiki.dyndns.org/ http://groups.yahoo.com/group/robocode/ http://www.ecs.soton.ac.uk/~awo101/robocode.html http://www.robocoderepository.com Sobre o Autor Além de um estudante dedicado Matheus Martin (matheus_martin@hotmail.com) é entusiasta da linguagem Java, atualmente se dedica a plataforma J2SE, sonha com a programação para equipamentos aeroespaciais e é escoteiro até a medula. Versão do Artigo: 1.0, 16/02/2004