Você está na página 1de 41

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 • Eventos
• Packaging • Inner classes
• Herança • Java docs
• Polimorfismo • How to duck…
• Código API
Você ainda não ficou
interessado em aprender
Robocode ???
Trabalhe
em equipe
• Você cria e outros
usam seus Robots
• Troca de idéas &
• Você pode participar
técnicas
de um time
• Participar de ligas
• Já Existem
internacionais
Excelentes times
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 Linux
Apenas 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
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:
• 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.
Já posso ??

Existem alguns metodos para obter informações


sobre o robot:

• 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.
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
AdvancedRobot
while (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 necessary
end 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: AdvancedRobot:
•turnRight() •setTurnRight()
•turnLeft() •setTurnLeft()
•turnGunRight() •setTurnGunRight()
•turnGunLeft() •setTurnGunLeft()
•turnRadarRight() •setTurnRadarRight()
•turnRadarLeft() •setTurnRadarLeft()
•ahead() •setAhead()
•back() •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. Tutorial
3. Ligas
4. Fórums
5. Ajuda On-Line
6. Diversos Sites na WEB