Você está na página 1de 16

Disciplina: Programação Orientada a Objetos Prof. Rogério Rocha

Disciplina: Programação Orientada a Objetos Prof. Rogério Rocha CENTRO UNIVERSITÁRIO UNA DIRETORIA DE EDUCAÇÃO CONTINUADA, PESQUISA

CENTRO UNIVERSITÁRIO UNA

DIRETORIA DE EDUCAÇÃO CONTINUADA, PESQUISA E EXTENSÃO

CURSO

Pós Graduação em Engenharia de Software Centrada em Métodos Ágeis

Programação Orientada a Objetos ROBOCODE

Belo Horizonte, 2010

1

Build the best - destroy the rest! Robocode é um jogo no qual o objetivo é

Build the best - destroy the rest!

Robocode é um jogo no qual o objetivo é desenvolver (programar) tanques de guerra “robôs” para batalhar contra outros tanques em Java ou. NET.

As batalhas são executados em tempo real e na tela. O lema do Robocode é: Construa o melhor, destrua o resto!

Além de ser um ambiente de programação o Robocode é usado para aprender a programar, principalmente na linguagem Java. Universidades estão usando o Robocode como parte do processo de ensino/aprendizagem de POO e também para introduzir a temática da inteligência artificial (IA). A proposta do Robocode é fácil de entender e uma maneira divertida de aprender a programar.

O Robocode vem com seu próprio instalador, editor interno do robô e do compilador Java, o único pré-requisito é uma Máquina Virtual Java (JVM) disponível no sistema onde ele deve ser instalado. Assim, tudo que um desenvolvedor de robôs precisa para começar é fornecido com o arquivo principal de distribuição Robocode (Robocode-xxx setup.jar).

Robocode também suporta o desenvolvimento de robôs 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 possível 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 também 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 informações.

Robocode é distribuído de forma gratuita e está sendo desenvolvido como um projeto de tempo livre quando não há dinheiro envolvido. Os desenvolvedores do Robocode estão 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 são abertos a todos.

2

HISTÓRIA

O jogo Robocode foi originalmente iniciado por Matthew A. Nelson, como um esforço pessoal no final de 2000 e se tornou um profissional quando ele trouxe para a IBM, sob a forma de um download AlphaWorks 1 , em julho de 2001.

No início de 2005, Robocode foi levado para o SourceForge 2 como Open Source com Robocode versão 1.0.7. Neste ponto, o desenvolvimento de Robocode tinha um pouco parado. Entretanto, a comunidade em torno Robocode começou a desenvolver suas próprias versões do Robocode, a fim de se livrar de erros e também para colocar novas funcionalidades em Robocode, as contribuições 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 série de contribuições da comunidade Robocode, foi incorporada pela Robocode oficial com a versão 1.1. Desde então, muitas das novas versões de Robocode ter sido lançado com mais e mais recursos e contribuições da comunidade.

Recentemente (a partir da versão 1.7.2.0), a plataforma. NET é apoiado por um. NET plug-in fornecido por Pavel Savara base jni4net, também desenvolvido por Pavel Savara.

Para se trabalhar com o Robocode é necessário:

Computador com processador Pentium II, equivalente, ou mais recente; 64MB de RAM ou mais; 10MB de disco ou mais para a instalação; Ambiente de desenvolvimento java, JDK versão 1.3, ou mais atual;

Anatomia

HISTÓRIA O jogo Robocode foi originalmente iniciado por Matthew A. Nelson, como um esforço pessoal no

Vehicle - Body (Corpo) O corpo é usado para mover o robô frente e para trás, assim como virar à esquerda ou à direita. Carrega a arma com o radar no topo.

Gun(Canhão) 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 robôs quando se mudou. O radar pode virar à esquerda ou à direita. O radar gera eventos onScannedRobot quando os robôs forem detectadas

  • 1 http://alphaworks.ibm.com/

  • 2 robocode.sourceforge.net

3

Regras

A batalha pode ser configurada: a quantidade de rounds, o tamanho do ring em pixels, os robôs que lutarão entre sí. Pode-se escolher visualizar o nome em baixo dos robôs, as energias, os seus radares, e permitir a mudança de cor durante a batalha.

Regras A batalha pode ser configurada: a quantidade de rounds , o tamanho do ring em

O robô pode se movimentar para frente ou para tráz e fazer curvas. O canhão(Gun) pode virar no sentido horário e anti-horário em 360 graus, e dar tiros(Bullet) de força >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

são

os

robôs adversários

detectados pelo

radar(Radar), o radar não é capaz de detectar os tiros adversários.

Todos os robôs começam cada round com energia 100, e os que ficarem com energia abaixo de 0 vão 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 pontuação e a colocação.

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_advesário).

Ganha energia quando acerta um tiro no adversario:

(energia) + (2 * (energia_perdida_do_adversário - poder_do_tiro).

4

Criando um robô

A primeira coisa é abrir o editor de robôs do menu principal, clique em Menu -> Editor.

Criando um robô A primeira coisa é abrir o editor de robôs do menu principal, clique

Quando a janela do editor abrir, clique em File -> New Robot para criar um robô novo.

Criando um robô A primeira coisa é abrir o editor de robôs do menu principal, clique

Entre com o nome do seu robo e depois digite o nome do diretório que os arquivos do seu robô ficará esse diretório deverá estar dentro do diretório C:\Robocode\Robots\. Se o diretório que você digitou não existir ele cria automaticamente. Agora deve aparecer o código básico do robô.

Básico x Avançado Enquanto um robo comum (Robot) faz apenas um coisa de cada vez, o robo avançado (AdvancedRobot) pode executar múltiplos movimentos simultaneamente, pode tratar eventos customizados e pode manter arquivos de dados.

public classe rb extendes Robot { public void run()

public classe ra extendes AdvancedRobot { public void run()

{

{

 

while (true)

 

while (true)

{

{

ahead(50);

setahead(50);

turnLeft(90);

setturnLeft(90);

}

execute();

}

}

}

}

}

5

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 código do Robô anterior entra em um laço infinito que terminará quando a batalha acabar.

Quando outro evento tiver sendo executado, a repetição é interrompida e voltará de onde parou quando acabar de executar os comandos do evento.

O próximo passo é gravar e compilar o robô.

Para gravar, seleciona File -> Save e siga as instruções. 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ê também pode examinar como cada um destes robôs samples foram construídos.

6

Eventos

É fundamental conhecer todos os eventos para ter a mente mais aberta quando for começar a programar a esttratégia de seu robô. Alguns deles te enviam, por parâmetro, dados do robô adversário em questão para você trabalhar com esses valores dentro do evento.

Exemplo: se você digitar "e.getBearing()" dentro de algum evento que contém na classe da variável, enviada por parâmetro, o método "getBearing()" , como os tipos ScannedRobotEvent e HitRobotEvent, retornará o ângulo do robô inimigo em questão. Sendo que "e" é o nome da variável usada como parâmetro, 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 não 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 adversário através do radar.

É um dos eventos mais importantes, pois é a única forma de saber a energia, a distância, o ângulo do seus inimigos para poder atira nele. A não ser se você colidir com outro robô, que já seria um outro evento.

Metodos da classe ScannedRobotEvent

Comandos

Tipo

Descrição Retorno

getName()

String Retorna o nome do robô adversário scaneado.

getBearing()

double Retorna o ângulo do robô adversário em relação ao seu robô

getBearingRadians() double Ângulo em radianos do robô adversário em relação ao seu.

getDistance()

double Retorna a distacia do robô adversário em relação ao seu robô.

getEnergy()

double Retorna a energia do robô adversário.

getHeading()

double Retorna o ângulo em graus do adversário em relação a tela.

getHeadingRadians() double Retorna o ângulo em radiaons do adversário em relação 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);

}

Observação: Não confunda "getEnergy()" com "e.getEnergy()", pois o primeiro é a energia de seu robô e o outro a energia do robô adversário tetectado pelo radar.

7

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

perdendo energia.

bata na parede,

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 canhão para ele e mande um tiro de força máxima, porque dificilmente errará.

Métodos da classe HitRobotEvent

Comandos

Tipo

Descrição Retorno

getName()

String Retorna o nome do robô adversário colidido.

getBearing()

double Ângulo em graus do robô adversário em relação ao seu robô

getBearingRadians()

double Ângulo em radianos do robô adversário em relação ao seu robô.

getEnergy()

double Retorna a energia do robô adversário.

isMyFault()

boolean

Retorna true se foi seu robô quem originou o evento, e false se foi o adversário 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. Então o mínimo que você deve fazer é

mudar a direção dele, senão ele vai ficar de encontro energia.

à parede até

perder toda a sua

Métodos da classeHitWallEvent

Comandos

getBearing()

Tipo

Descrição Retorno

double Ângulo em graus da parede batida em relação ao seu robô.

getBearingRadians() double Ângulo em radianos da parede batida em relação ao seu robô.

Exemplo public void onHitWall(HitWallEvent e) {

turnLeft(180);

}

8

onHitByBullet

É executado quando seu robô leva um tiro.

Se a estratégia do seu robô é ficar parado enquanto atira, é bom utilizar esse evento para sair do local de onde acabou de levar um tiro, para você não se tornar um alvo fácil.

Métodos da classe HitByBulletlEvent

Comandos

Tipo

Descrição Retorno

getName()

String

Retorna o nome do robô adversário que te acertou um tiro.

getBearing()

double Retorna o ângulo do robô adversário em relação ao seu robô.

getBearingRadians()

double Ângulo em radianos do robô adversário em relação ao seu robô.

getHeading()

double Retorna o ângulo em graus do robô adversário em relação a tela.

getHeadingRadians()

double Ângulo em radiaons do robô adversário em relação a tela.

getBullet()

Bullet

Retorna o Bullet (tiro) do robô adversário que atingiu seu robô.

getPower()

double Retorna a força do tiro.

getVelocity()

double Retorna a velocidade do tiro.

Exemplo public void onHitByBullet(HitByBulletEvent e) {

ahead(100);

}

onBulletHit

É executado quando seu tiro acerta um adversário.

Métodos da classeBulletHitEvent

Comandos

Tipo

Descrição Retorno

getName()

String Retorna o nome do robô adversário que você acertou um tiro.

getBullet()

Bullet

Retorna o Bullet (dados do tiro) de seu robô que atingiu o adversário.

getEnergy()

double Retorna a energia do robô adversário após levar o tiro.

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

}

Esse

evento e

os

outros

abaixo

são usados

em

programações mais

avançadas

e

complexas.

 

onBulletMissed

É executado quando uma de suas balas colide com a parede(erra o tiro).

 

Métodos da classeBulletMissedEvent Comandos Tipo Retorno Descrição Retorno getBullet() Bullet Retorna o Bullet (dados do tiro), de seu robô, que bateu na parede.

 

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

 
 

9

onBulletHitBullet

É executado quando uma de suas balas colide com outra bala.

Métodos da classeBulletHitBulletEvent

Comandos

Tipo

getBullet() Bullet getHitBullet() Bullet

Descrição Retorno Retorna o Bullet (dados do tiro) de seu robô. Retorna o Bullet do robô adversário.

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 adversário.

Métodos da classeRobotDeathEvent Comandos Tipo Retorno Descrição 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 ação.

Exemplo public void onSkippedTurn(SkippedTurnEvent e) {

turnGunLeft(360);

}

onCustomEvent

Quando um uso de condição "addCustomEvent" é satisfeita.

Comandos Tipo Retorno Descrição Retorno getCondition() Condition Retorna a condição que gerou o evento.

Exemplo public void onCustomEvent(CustomEvent e) { }

10

Métodos

Métodos Movimentação – Robot ahead( double ) a distância que o robô deverá percorrer. Movimenta o

Movimentação Robot

ahead( double ) a distância que o robô deverá percorrer. Movimenta o robô para frente, uma distância x dada por parâmentro. Se o robô bater em outro, ou na parede antes de completar a distancia desejada o método é interrompido.

back( double ) a distância que o robô deverá percorrer. Semelhante ao método anterior, a única diferença é que o robô move para traz.

turnRight( double ) o ângulo em graus que o robô deverá girar. Gira o robô para a direita (sentido horário).

turnLeft( double ) o ângulo em graus que o robô deverá girar. Gira o robô para a esquerda (sentido anti-horário).

turnGunRigth( double ) o ângulo em graus que o canhão deverá girar. Gira o canhão para a direita.

turnGunLeft( double ) o ângulo em graus que o canhão deverá girar. Gira o canhão 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.

Métodos Movimentação – Robot ahead( double ) a distância que o robô deverá percorrer. Movimenta o

11

Movimentação - AdvancedRobot

Os comandos da classe AdvancedRobot que começam com "set" eles funcionam como os herdados da classe Robot. A diferença é que enquanto o método está sendo executado ele continua executando as linhas de comando abaixo. Com isso é possível combinar movimentos.

setAhead( double ) a distância que o robô deverá percorrer. Herdado do método ahead.

setBack( double ) a distância que o robô deverá percorrer. Herdado do método back. setTurnRight( double ) o ângulo em graus que o robô deverá girar. Herdado do método turnRight.

setTurnLeft( double ) o ângulo em turnLetf.

graus que o robô deverá girar. Herdado do método

setTurnGunRigth( double ) o ângulo em graus que o canhão deverá girar Herdado do método turnGunRigth.

setTurnGunLeft( double ) o ângulo em graus que o canhão deverá girar Herdado do método turnGunLeft.

setTurnRadarRigth( double ) o ângulo em graus que o radar deverá girar Herdado do método turnRadarRigth.

setTurnRadarLeft( double ) o ângulo em graus que o radar deverá girar Herdado do método turnRadarLeft.

Esses métodos "Radians" são usados quando vai se trabalhar com PI, seno, cosseno, tangente. Os métodos que começam com "set" são 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 canhão para a direita.

turnGunLeftRadians( double ) o ângulo em radianos Gira o canhão 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

método

setTurnLeftRadians( double ) o ângulo em radianos Herdado do método turnLeftRadians.

setTurnGunRightRadians(

double

)

o

ângulo

em

radianos

Herdado

do

método

turnGunRightRadians.

setTurnGunLeftRadians(

double

)

o

ângulo

em

radianos

Herdado do método

turnGunLeftRadians.

12

setTurnRadarRigthRadians(

double

)

o

ângulo

em

radianos

Herdado

do

método

turnRadarRightRadians.

setTurnRadarLeftRadians(

double

)

o

ângulo

em

radianos

Herdado

do

método

turnRadarLeftRadians.

Tiro - Robot

fire( double ) a força do tiro, e subtraido da energia de seu robô. Atira imediatamente na força mandada por parâmetro, de 0.1 até 3. Se mandar um tiro maior que 3 ele considera força 3.

fireBullet( double ) a força do tiro, e subtraido da energia de seu robô. A diferença do método anterior é que ele é uma função e retorna um valor do tipo Bullet, além disso, manda outro tiro em seguida, este com mais velocidade, se o primeiro tiro tiver boas possibilidades da acertar.

Tiro AdvancedRobot

setFire( double ) a força do tiro, e subtraido da energia de seu robô. Herdado do método fire.

setFireBullet( double ) a força do tiro, método fireBullet.

e subtraido da

energia de seu robô. Herdado do

Configura o Robô

setAdjustGunForRobotTurn( boolean ) O canhão acompanha ou não o movimento do corpo

setAdjustRadarForGunTurn( boolean ) O radar acompanha ou não o movimento do corpo

setColors( Color, Color, Color ) a cor do robô, a cor do canhão, a cor do radar, nesta ordem. Atribui as cores do robô.

Dados do Rôbo

getName() String Retorna o nome do robô.

getEnergy() double Retorna a energia corrente do robô.

getX() double A posição X(eixo horizontal) do robô na arena de batalha. Quando 0(zero) ele estará encostado no lado esquerdo.

getY() double A posição 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

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 canhão está virado. Como no método anterior.

getRadarHeading() double Retorna o ângulo em graus que o radar está virado.

getGunHeat() double Retorna quanto o canhão está virando no momento corrente.

getVelocity() double Retorna a velocidade do robô.

Dados do Robô - AdvancedRadiansRobot

getHeadingRadians() double Retorna a direção que o robô está voltado, em radianos (de 0 até 2*PI).

getGunHeadingRadians() double Retorna o ângulo em radianos do canhão está apontado em relação a tela

getRadarHeadingRadians() double Retorna o ângulo em radianos do radar está voltado em relação 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 número do round corrente.

getTime() long Retorna o tempo do round. Quando inicia outro round o tempo volta a 0(zero).

Miscelânea

doNothing() nenhum parâmetro

scan() nenhum parâmetro

stop() nenhum parâmetro

stop( boolean )

resume() nenhum parâmetro

14

setResume() nenhum parâmetro

setStop() nenhum parâmetro

setStop( boolean )

finalize() nenhum parâmetro

Robocode API

setResume() nenhum parâmetro setStop() nenhum parâmetro setStop( boolean ) finalize() nenhum parâmetro Robocode API 15 Pós

15