Você está na página 1de 16

Disciplina: Programao Orientada a Objetos Prof.

Rogrio Rocha

CENTRO UNIVERSITRIO UNA DIRETORIA DE EDUCAO CONTINUADA, PESQUISA E EXTENSO

CURSO Ps Graduao em Engenharia de Software Centrada em Mtodos geis

Programao Orientada a Objetos ROBOCODE

Belo Horizonte, 2010


Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Build the best - destroy the rest! Robocode um jogo no qual o objetivo desenvolver (programar) tanques de guerra robs para batalhar contra outros tanques em Java ou. NET. As batalhas so executados em tempo real e na tela. O lema do Robocode : Construa o melhor, destrua o resto! Alm de ser um ambiente de programao o Robocode usado para aprender a programar, principalmente na linguagem Java. Universidades esto usando o Robocode como parte do processo de ensino/aprendizagem de POO e tambm para introduzir a temtica da inteligncia artificial (IA). A proposta do Robocode fcil de entender e uma maneira divertida de aprender a programar. O Robocode vem com seu prprio instalador, editor interno do rob e do compilador Java, o nico pr-requisito uma Mquina Virtual Java (JVM) disponvel no sistema onde ele deve ser instalado. Assim, tudo que um desenvolvedor de robs precisa para comear fornecido com o arquivo principal de distribuio Robocode (Robocode-xxx setup.jar). Robocode tambm suporta o desenvolvimento de robs utilizando IDEs externos, como por exemplo, Eclipse, IntelliJ IDEA, NetBeans, Visual Studio, etc, que suporta o desenvolvedor muito melhor do que o editor do rob em Robocode. O fato de o Robocode rodar na plataforma Java torna possvel execut-lo em qualquer sistema operacional com Java pr-instalados, o que significa que ele ser capaz de rodar em Windows, Linux, Mac OS, mas tambm UNIX e suas variantes de UNIX. Note que o Java 5.0 ou mais recente deve ser instalado no sistema antes de Robocode capaz de executar. Veja os requisitos do sistema para obter mais informaes. Robocode distribudo de forma gratuita e est sendo desenvolvido como um projeto de tempo livre quando no h dinheiro envolvido. Os desenvolvedores do Robocode esto desenvolvendo o Robocode porque eles acham que divertido, e porque melhoram a si mesmos como desenvolvedores desta forma. Robocode um projeto Open Source, o que significa que todas as fontes so abertos a todos.

2 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

HISTRIA O jogo Robocode foi originalmente iniciado por Matthew A. Nelson, como um esforo pessoal no final de 2000 e se tornou um profissional quando ele trouxe para a IBM, sob a forma de um download AlphaWorks1, em julho de 2001. No incio de 2005, Robocode foi levado para o SourceForge 2 como Open Source com Robocode verso 1.0.7. Neste ponto, o desenvolvimento de Robocode tinha um pouco parado. Entretanto, a comunidade em torno Robocode comeou a desenvolver suas prprias verses do Robocode, a fim de se livrar de erros e tambm para colocar novas funcionalidades em Robocode, as contribuies para o Open Source Robocode e mais tarde no projeto RobocodeNG por N. Flemming Larsen. Como nada parecia acontecer com Robocode em mais de um ano, Flemming Larsen N. assumiu o projeto no SourceForge Robocode como administrador e desenvolvedor em julho de 2006. O projeto RobocodeNG foi abandonada, mas a variante Robocode 2006, que continha uma srie de contribuies da comunidade Robocode, foi incorporada pela Robocode oficial com a verso 1.1. Desde ento, muitas das novas verses de Robocode ter sido lanado com mais e mais recursos e contribuies da comunidade. Recentemente (a partir da verso 1.7.2.0), a plataforma. NET apoiado por um. NET plug-in fornecido por Pavel Savara base jni4net, tambm desenvolvido por Pavel Savara. Para se trabalhar com o Robocode necessrio: Computador com processador Pentium II, equivalente, ou mais recente; 64MB de RAM ou mais; 10MB de disco ou mais para a instalao; Ambiente de desenvolvimento java, JDK verso 1.3, ou mais atual; Anatomia

Vehicle - Body (Corpo) O corpo usado para mover o rob frente e para trs, assim como virar esquerda ou direita. Carrega a arma com o radar no topo. Gun(Canho) Montado no corpo e usado para disparar balas de energia. A arma pode virar esquerda ou direita. Radar - Montado sobre a arma e usada para analisar os outros robs quando se mudou. O radar pode virar esquerda ou direita. O radar gera eventos onScannedRobot quando os robs forem detectadas
1 2

http://alphaworks.ibm.com/ robocode.sourceforge.net Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Regras A batalha pode ser configurada: a quantidade de rounds, o tamanho do ring em pixels, os robs que lutaro entre s. Pode-se 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 trz 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 detectados pelo radar(Radar), o radar no capaz de detectar os tiros adversrios. 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, o vencedor do 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).

4 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Criando um 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 robo 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. Bsico x Avanado Enquanto um robo comum (Robot) faz apenas um coisa de cada vez, o robo avanado (AdvancedRobot) pode executar mltiplos movimentos simultaneamente, pode tratar eventos customizados e pode manter arquivos de dados. public classe rb extendes Robot { public void run() { while (true) { ahead(50); turnLeft(90); } } } public classe ra extendes AdvancedRobot { public void run() { while (true) { setahead(50); setturnLeft(90); execute(); } } }
5 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

package ExemplosRR; import robocode.*; //import java.awt.Color; /** * Ex1 - a robot by (your name here) */ public class Ex1 extends Robot { /** * run: Ex1's default behavior */ public void run() {
// After trying out your robot, try uncommenting the import at the top,and the next line:

//setColors(Color.red,Color.blue,Color.green); while(true) { // Replace the next 4 lines with any behavior you would like ahead(100); turnGunRight(360); back(100); turnGunRight(360); } } /** * onScannedRobot: What to do when you see another robot */ public void onScannedRobot(ScannedRobotEvent e) { fire(1); } /** * onHitByBullet: What to do when you're hit by a bullet */ public void onHitByBullet(HitByBulletEvent e) { turnLeft(90 - e.getBearing()); } } O cdigo do Rob anterior entra em um lao infinito que terminar quando 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. 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 tem 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.

6 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Eventos fundamental conhecer todos os eventos para ter a mente mais aberta quando for comear a programar a esttratgia de seu rob. 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. 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 atravs do radar. um dos eventos mais importantes, pois a nica forma de saber a energia, a distncia, o ngulo do 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 Tipo Descrio Retorno getName() String Retorna o nome do rob adversrio scaneado. getBearing() double Retorna o ngulo do rob adversrio em relao ao seu rob getBearingRadians() double ngulo em radianos do rob adversrio em relao ao seu. getDistance() double Retorna a distacia do rob adversrio em relao ao seu rob. getEnergy() double Retorna a energia do rob adversrio. getHeading() double Retorna o ngulo em graus do adversrio em relao a tela. getHeadingRadians() double Retorna o ngulo em radiaons do adversrio em relao a tela. getVelocity() double 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); } } Observao: No confunda "getEnergy()" com "e.getEnergy()", pois o primeiro a energia de seu rob e o outro a energia do rob adversrio tetectado pelo radar.
7 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

onWin executado quando seu rob ganha o round. J que aqui o round terminou, aproveite para programar uma rizadinha, uma dancinha, 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 Tipo Descrio Retorno getName() String Retorna o nome do rob adversrio colidido. getBearing() double ngulo em graus do rob adversrio em relao ao seu rob getBearingRadians() double ngulo em radianos do rob adversrio em relao ao seu rob. getEnergy() double Retorna a energia do rob adversrio. isMyFault() boolean 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 classeHitWallEvent Comandos Tipo Descrio Retorno getBearing() double ngulo em graus da parede batida em relao ao seu rob. getBearingRadians() double ngulo em radianos da parede batida em relao ao seu rob. Exemplo public void onHitWall(HitWallEvent e) { turnLeft(180); }

8 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

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 Descrio Retorno String Retorna o nome do rob adversrio que te acertou um tiro. double Retorna o ngulo do rob adversrio em relao ao seu rob. double ngulo em radianos do rob adversrio em relao ao seu rob. double Retorna o ngulo em graus do rob adversrio em relao a tela. double ngulo em radiaons do rob adversrio em relao a tela. Bullet Retorna o Bullet (tiro) do rob adversrio que atingiu seu rob. double Retorna a fora do tiro. double Retorna a velocidade do tiro.

Exemplo public void onHitByBullet(HitByBulletEvent e) { ahead(100); } onBulletHit executado quando seu tiro acerta um adversrio. Mtodos da classeBulletHitEvent Comandos Tipo Descrio Retorno getName() String Retorna o nome do rob adversrio que voc acertou um tiro. getBullet() Bullet Retorna o Bullet (dados do tiro) de seu rob que atingiu o adversrio. getEnergy() double 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 classeBulletMissedEvent Comandos Tipo Retorno Descrio Retorno getBullet() Bullet Retorna o Bullet (dados do tiro), de seu rob, que bateu na parede. Exemplo public void onBulletMissed(BulletMissedEvent e) { ERROS++; }

9 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

onBulletHitBullet executado quando uma de suas balas colide com outra bala. Mtodos da classeBulletHitBulletEvent Comandos Tipo Descrio Retorno getBullet() Bullet Retorna o Bullet (dados do tiro) de seu rob. getHitBullet() Bullet 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 classeRobotDeathEvent Comandos Tipo Retorno Descrio Retorno getName() String 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 Tipo Retorno Descrio Retorno getCondition() Condition Retorna a condio que gerou o evento. Exemplo public void onCustomEvent(CustomEvent e) { }

10 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Mtodos

Movimentao Robot ahead( double ) a distncia que o rob dever percorrer. 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. back( double ) a distncia que o rob dever percorrer. Semelhante ao mtodo anterior, a nica diferena que o rob move para traz. turnRight( double ) o ngulo em graus que o rob dever girar. Gira o rob para a direita (sentido horrio). turnLeft( double ) o ngulo em graus que o rob dever girar. Gira o rob para a esquerda (sentido anti-horrio). turnGunRigth( double ) o ngulo em graus que o canho dever girar. Gira o canho para a direita. turnGunLeft( double ) o ngulo em graus que o canho dever girar. Gira o canho para a esquerda. turnRadarRigth( double ) o ngulo em graus que o radar dever girar. Gira o radar para a direita. turnRadarLeft( double ) o ngulo em graus que o radar dever girar. Gira o radar para a esquerda.

11 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

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 combinar movimentos. setAhead( double ) a distncia que o rob dever percorrer. Herdado do mtodo ahead. setBack( double ) a distncia que o rob dever percorrer. Herdado do mtodo back. setTurnRight( double ) o ngulo em graus que o rob dever girar. Herdado do mtodo turnRight. setTurnLeft( double ) o ngulo em graus que o rob dever girar. Herdado do mtodo turnLetf. setTurnGunRigth( double ) o ngulo em graus que o canho dever girar Herdado do mtodo turnGunRigth. setTurnGunLeft( double ) o ngulo em graus que o canho dever girar Herdado do mtodo turnGunLeft. setTurnRadarRigth( double ) o ngulo em graus que o radar dever girar Herdado do mtodo turnRadarRigth. setTurnRadarLeft( double ) o ngulo em graus que o radar dever girar Herdado do mtodo turnRadarLeft. 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. turnRightRadians( double ) o ngulo em radianos Gira o rob para a direita. turnLeftRadians( double ) o ngulo em radianos Gira o rob para a esquerda. turnGunRightRadians( double ) o ngulo em radianos Gira o canho para a direita. turnGunLeftRadians( double ) o ngulo em radianos Gira o canho para a esquerda. turnRadarRigthRadians( double ) o ngulo em radianos Gira o radar para a direita. turnRadarLeftRadians( double ) o ngulo em radianos Gira o radar para a esquerda. setTurnRightRadians( double turnRightRadians. ) o ngulo em radianos Herdado do mtodo

setTurnLeftRadians( double ) o ngulo em radianos Herdado do mtodo turnLeftRadians. setTurnGunRightRadians( double ) o ngulo em radianos turnGunRightRadians. setTurnGunLeftRadians( double ) o ngulo em turnGunLeftRadians. radianos Herdado do mtodo

Herdado do mtodo

12 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

setTurnRadarRigthRadians( double ) o ngulo em radianos turnRadarRightRadians. setTurnRadarLeftRadians( double ) o ngulo em radianos turnRadarLeftRadians. Tiro - Robot fire( double ) a fora do tiro, e subtraido da energia de seu rob. Atira imediatamente na fora mandada por parmetro, de 0.1 at 3. Se mandar um tiro maior que 3 ele considera fora 3.

Herdado do mtodo

Herdado do mtodo

fireBullet( double ) a fora do tiro, e subtraido da energia de seu rob. A diferena do mtodo anterior que ele uma 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 setFire( double ) a fora do tiro, e subtraido da energia de seu rob. Herdado do mtodo fire. setFireBullet( double ) a fora do tiro, e subtraido da energia de seu rob. Herdado do mtodo fireBullet. Configura o Rob setAdjustGunForRobotTurn( boolean ) O canho acompanha ou no o movimento do corpo setAdjustRadarForGunTurn( boolean ) O radar acompanha ou no o movimento do corpo setColors( Color, Color, Color ) a cor do rob, a cor do canho, a cor do radar, nesta ordem. Atribui as cores do rob. Dados do Rbo getName() String Retorna o nome do rob. getEnergy() double Retorna a energia corrente do rob. getX() double A posio X(eixo horizontal) do rob na arena de batalha. Quando 0(zero) ele estar encostado no lado esquerdo. getY() double A posio Y(eixo vertical) do rob na arena de batalha. Quando 0(zero) ele estar encostado na parte de baixo. getWidth() double Retorna a largura do rob. getHeight() double Retorna a altura do rob.

13 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

getHeading() 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. getGunHeading() double Retorna o ngulo em graus que o canho est virado. Como no mtodo anterior. getRadarHeading() double Retorna o ngulo em graus que o radar est virado. getGunHeat() double Retorna quanto o canho est virando no momento corrente. getVelocity() double Retorna a velocidade do rob. Dados do Rob - AdvancedRadiansRobot getHeadingRadians() double Retorna a direo que o rob est voltado, em radianos (de 0 at 2*PI). getGunHeadingRadians() double Retorna o ngulo em radianos do canho est apontado em relao a tela getRadarHeadingRadians() double Retorna o ngulo em radianos do radar est voltado em relao a tela Dados da Batalha getOthers() int Retorna o total de oponentes ainda vivos no round. getBattleFieldHeight() double Retorna a altura da arena de batalha. getBattleFieldWidth() double Retorna a largura da arena de batalha. getNumRounds() int Retorna o total de rounds da batalha. getRoundNum() int Retorna o nmero do round corrente. getTime() long Retorna o tempo do round. Quando inicia outro round o tempo volta a 0(zero). Miscelnea doNothing() nenhum parmetro scan() nenhum parmetro stop() nenhum parmetro stop( boolean ) resume() nenhum parmetro
14 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

setResume() nenhum parmetro setStop() nenhum parmetro setStop( boolean ) finalize() nenhum parmetro Robocode API

15 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos

Referncias Importantes http://robowiki.net/wiki/Category:Melee_Bots http://www.gsigma.ufsc.br/~popov/aulas/robocode/index.html http://robowiki.net/wiki/Melee http://robowiki.net/wiki/Melee_Strategy http://robocode.sourceforge.net/docs/robocode/ http://en.wikipedia.org/wiki/Robocode http://robocoderepository.com/ http://robocode.sourceforge.net/ http://robo-code.blogspot.com/ http://www.eng.auburn.edu/~sealscd/AI/robocode/ http://robowiki.net/w/index.php http://www.unifran.br/blog/robofran/ http://robowiki.net/wiki/RoboRumble http://robowiki.net/wiki/Twin_Duel/Strategy_Guide

16 Ps Graduao em Engenharia de Software Centrada em Mtodos geis Programao Orientada a Objetos