tutorial Robocode

Post on 19-Jun-2015

4.398 views 1 download

description

tutorial de como programar para Robocode

Transcript of tutorial Robocode

O que você entende por JOGOS DE COMBATE ?

Guerreiros sarados e musculosos ?

Ferozes e Belicosas criaturas se aniquilando em

um ambiente completamente hostil?

Agora podemos brincar

O que é Robocode ?

Benefícios do Robocode …

• OO• Threading• Packaging• Herança• Polimorfismo• Código API

• Eventos• Inner classes• Java docs• How to duck…

Você ainda não ficou interessado em aprender

Robocode ???

Trabalhe em equipe

• Você cria e outros usam seus Robots

• Você pode participar de um time

• Já Existem Excelentes times

• Troca de idéas & técnicas

• Participar de ligas internacionais

E agora ficou interessado em aprender Robocode ???

Instalação e pré-requisitos …Java VM 1.3.x ou superior

Instalação no Windows

São necessários três exaustivos passos ….– Entre no site robocode.alphaworks.ibm.com- Faça o download

- Execute robocode-setup.jar (autosetup)

Instalação no LinuxApenas um ÚNICO passo ….No site robocode.alphaworks.ibm.com faça

download & rode … java –jar robocode-setup.jar

O que você tem …

Você gratuitamente ganhou …- um ambiente … Battlefield- uma IDE de desenvolvimento- javadocs das API- exemplos de robots- diversão infinita

Robot ?????

Como são os guerreiros do Robocode ?

Anatomia do Robot

Todas as partes possuem movimentos independentes.

Battlefield ..

Quer conhecer a sua Arena de Guerra ?

Sua nova IDE …

Quer conhecer um poderoso editor de Java ?

Robot commands …

• Toda documentação pode ser obtida na API do Robocode …

• Lá você obterá os métodos públicos da classe robocode.Robot ou as derivações obtidas na classe: robocode.AdvancedRobot

Movendo seu Robot

Alguns comandos básicos …• turnRight(double degree) e turnLeft(double degree) gira o

robot um número específico de graus.• ahead(double distance) e back(double distance) movimenta

o robot determinados pixels de distância; estes métodos são terminados ao encontrar uma parede ou outro robot.

• turnGunRight(double degree) e turnGunLeft(double degree) gira a arma um determinado número em graus.

• turnRadarRight(double degree) e turnRadarLeft(double degree) gira o radar um determinado número em graus.

Nenhum desses comandos retorna o controle ao programa até que o movimento seja completado.

Coordinadas e direções

Controlando a Arma, Radar & Tank

• setAdjustGunForRobotTurn(boolean flag): Se enviado true, a arma permanecerá na mesma direção e enquanto o tank dá voltas.

• setAdjustRadarForRobotTurn(boolean flag): Se enviado true, o radar permanecerá na mesma direção e enquanto o tank (e a arma) dá voltas.

• setAdjustRadarForGunTurn(boolean flag): Se enviado true, o radar permanecerá na mesma direção e enquanto a arma dá voltas. Também agirá como se setAdjustRadarForRobotTurn(true) tivesse sido chamado.

Quando o Tank está girando, a direção da arma (e radar) também são movimentados, a menos que seja indicado com os seguintes métodos:

Já posso ??

• getX() e getY() obtém a coordenada atual.• getHeading(), getGunHeading() e getRadarHeading()

obtém a posição corrente do tank, arma, ou radar em graus.

• getBattleFieldWidth() e getBattleFieldHeight() obtém a dimensão da arena no round corrente.

• getBearing() obtém de onde veio o tiro. getDistance() depois de localizado qual a distância do outro robot.

Existem alguns metodos para obter informações sobre o robot:

Fogo ....

Atirando e Controlando os Danos:• cada robot inicia com um determinado "nível de

energia - NE," e ele é destruído quando este nível chega a zero.

• Atirando, o robo pode gastar até 3NE. • fire(double power) e fireBullet(double power) são

usados para especificar a energia do tiro ou da bala.

Eventos ....

Estes são os eventos mais usados: • ScannedRobotEvent. Implementado pelo método

onScannedRobot(); este será disparado quando o seu radar encontrar outro robot.

• HitByBulletEvent. Implementado pelo método onHitByBullet(); este será disparado quando o seu robot for atingido.

• HitRobotEvent. Implementado pelo método onHitRobot(); este será disparado quando o seu robot bater em outro robot.

• HitWallEvent. Implementado pelo método onHitWall(); este será disparado quando o seu robot bater na parede.

Isto é tudo que precisamos para criarmos alguns robot bem complexos e bonitos …

Criando um robot ....

• Inicie o Robot Editor • selecione File->New->Robot • Coloque o nome do seu robot (no formato

Java de nomes, i.e (a..z, A..Z, $, _, 0..9)• Entre com o nome do pacote

Visão do Código …

package meus;import robocode.*;

public class MeuRobot extends Robot {public void run() {

while(true) {... // <<Movimento>>}

} public void onScannedRobot(ScannedRobotEvent e) { ... // <<Encontrou>> } public void onHitByBullet(HitByBulletEvent e) { ... // <<Tomei um tiro>>

}}

Adicionando funcionalidades …

public void run() {turnLeft(getHeading());while(true) {

ahead(1000);turnRight(90);

}}public void onScannedRobot(ScannedRobotEvent e) {

fire(1);}public void onHitByBullet(HitByBulletEvent e) {

turnLeft(180);}

Compilando & Testando seu robot

No menu do Robot Editor:• selecione Compiler -> Compile to compile

your robot code. • No menu do battlefield selecione Battle ->

New

Arquitetura da Battlefield

Obtendo novas sofisticações ...

• Até o momento os robots são simples• Restrições da classe ... ao ser bloqueada • Métodos não retornam o controle até serem finalizados• Nós estamos usando essencialmente a habilidade para tomar decisões.

Precisamos da … AdvancedRobot

AdvancedRobotwhile (round is not over) do call the rendering subsystem to draw robots, bullets, explosions for each robot do wake up the robot wait for it to make a blocking call, up to a max time interval end for clear all robot event queue move bullets, and generate event into robots' event queue if applicable move robots, and generate event into robots' event queue if applicable do battle housekeeping and generate event into robots' event queue if applicable delay for frame rate if necessaryend do

Herdando a Classe AdvancedRobot

• Chamadas a API não bloqueadas.• Podemos mudar a ação de um robot.• Um turno em Robocode é chamado tick (se refere ao clock), um gráfico relacionado pode ser chamado pelo battlefield.

Métodos da Robot vs AdvancedRobot

Robot:•turnRight() •turnLeft() •turnGunRight()•turnGunLeft() •turnRadarRight() •turnRadarLeft() •ahead() •back()

AdvancedRobot:•setTurnRight() •setTurnLeft() •setTurnGunRight() •setTurnGunLeft() •setTurnRadarRight() •setTurnRadarLeft() •setAhead() •setback()

Working with non-blocking method calls

public class MultiMoveBot extends AdvancedRobot { ...public void run() {

...setTurnRight(fullTurn);setAhead(veryFar);setTurnGunLeft(fullTurn);

Para executar um Método

Para obter um controle de um método que foi bloqueado:

while(true) {waitFor(new TurnCompleteCondition(this));toggleDirection();

}

The toggleDirection() method

private void toggleDirection() {if (clockwise) {

setTurnLeft(fullTurn);setBack(veryFar);setTurnGunRight(fullTurn);

} else {setTurnRight(fullTurn);setAhead(veryFar);setTurnGunLeft(fullTurn);

}clockwise = !clockwise;

}

Customizando Eventos …

public void run() { addCustomEvent( new Condition("LeftLimit") { public boolean test() { return (getHeading() <= quarterTurn);

} }); addCustomEvent( new Condition("RightLimit") { public boolean test() { return (getHeading() >= threeQuarterTurn); } });}

Chamada do Evento Customizados

public void onCustomEvent(CustomEvent ev) { Condition cd = ev.getCondition(); System.out.println("-> " + cd.getName()); if (cd.getName().equals("RightLimit")) { setTurnLeft(fullTurn); setTurnGunRight(fullTurn); } else { setTurnRight(fullTurn); setTurnGunLeft(fullTurn); }}

Chaves de Sucesso

As três grandes vantagens da AdvancedRobot são o uso de:• Múltiplos movimentos simultaneamente• Decidir a ação do robot em tempo de tick • Definir os eventos customizados

Recursos Extras 1. Milhares de livros sobre estratégia …2. Tutorial3. Ligas4. Fórums5. Ajuda On-Line6. Diversos Sites na WEB