Eduardo Carlos Hamerski Jr
[email protected]
09/05/2002
Conteúdo
•
•
•
•
•
•
•
•
O que é o RoboCode?
Componentes Robocode
Ambiente (Campo de Batalha)
Arquitetura do Simulador de Batalhas
A anatomia de um robô
Robocode API (classes Robot e TeamRobot)]
Criando um robô
Criando um time de robôs
O que é o RoboCode?
• Compõem o Robocode:
– Ambiente para simulação de batalhas entre robôs
(campo de batalha)
– Editor de robôs
– Robocode API
• Criado por Mathew Nelson (Alphaworks/IBM)
–
–
–
–
Ensino de Programação
Performance de aplicações Java
Competições entre desenvolvedores
Outros (não previstos)
Componentes Robocode
• Ambiente
(Campo de batalha)
• Editor de robôs
• Robocode API
Ambiente (Campo de Batalha)
• Local onde a batalha entre os robôs se
desenvolve
• Janela principal da aplicação
• Opções para criar, salvar e abrir novas batalhas
ou batalhas já existentes
• Opções para pausa, continuação e finalização
de uma batalha; destruição de um robô e
visualização de estatísticas de qualquer robô
Arquitetura do Simulador de Batalhas
• Thread Gerenciador de Batalha
– Gerencia os robôs, disparos e a renderização no campo de
batalha
• Thread Robô
– Cada robô é uma thread Java independente
• O método run() possui a lógica que será executada pela thread
– Cada robô tem sua própria fila de eventos
– Os eventos são interceptados e processados pelo próprio robô
• Subsistema de Renderização
– Baseado no Java2D API
A anatomia de um robô
•
•
•
•
Tanque (representação gráfica)
Possui um canhão
Possui um radar
Todos os elementos (tanque, canhão e
radar) giram independentemente
RoboCode API
• Principais classes do Pacote robocode:
– Robot
• Permite implementar robôs simples
– TeamRobot
• Permite implementar robôs mais complexos, com suporte a
times e comunicação
RoboCode API
• Classe Robot
– Mover para frente e para traz
• ahead(double distance)
back(double distance)
– Girar
• turnRight(double degree) e turnLeft(double degree)
• turnGunRight(double degree) e turnGunLeft(double degree)
• turnRadarRight(double degree) e turnRadarLeft(double degree)
– Habilitar independência do giro (tanque/canhão/radar)
• setAdjustGunForRobotTurn(boolean flag)
• setAdjustRadarForRobotTurn(boolean flag)
• setAdjustRadarForGunTurn(boolean flag)
RoboCode API
• Classe Robot
– Obtendo informações do robô e do ambiente
• getX() e getY()
• getHeading(), getGunHeading() e getRadarHeading()
• getBattleFieldWidth() e getBattleFieldHeight()
– Disparos
• fire(double power) e fireBullet(double power)
– Eventos
•
•
•
•
ScannedRobotEvent
HitByBulletEvent
HitRobotEvent
HitWallEvent
 onScannedRobot( ... )
 onHitByBullet( ... )
 onHitRobot( ... )
 onHitWall( ... )
RoboCode API
• Classe TeamRobot
– Herda todos os métodos e eventos definidos
na classe Robot e implementa:
•
•
•
•
•
broadcastMessage(Serializable message)
sendMessage(String name, Serializable message)
isTeammate(String name)
getTeammates()
MessageEvent  onMessageReceived( ... )
Criando um robô
package nome_pacote;
Import robocode.*;
public class NomeRobo extends Robot {
// definições de constantes e atributos
public void run() {
// inicialização
while ( <condição> ) {
// implementação da lógica do robô
}
}
// eventos (ex: onScannetRobot(ScannedRobotEvent e) { ... }
}
(template)
Criando um robô
(exemplo)
package sample;
import robocode.*;
public class MyFirstRobot extends Robot
{
public void run() {
while (true) {
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
}
public void onScannedRobot(ScannedRobotEvent e) { fire(1); }
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}
}
Criando um time de robôs
package nome_pacote;
Import robocode.*;
public class NomeRobo extends TeamRobot {
// definições de constantes e atributos
public void run() {
// inicialização
while ( <condição> ) {
// implementação da lógica do robô
}
}
// eventos (ex: onScannetRobot(ScannedRobotEvent e) { ... }
}
(template)
Criando um time de robôs
(Exemplo 1)
package sampleteam;
import robocode.*;
import java.awt.Color;
import java.io.*;
public class MyFirstLeader extends TeamRobot
{
public void run() {
setColors(Color.red,Color.red,Color.red);
try {
broadcastMessage(newRobotColors(Color.red, Color.red, Color.red));
} catch (IOException e) {
}
while(true) {
setTurnRadarRight(10000);
ahead(100);
back(100);
}
}
Criando um time de robôs
(Exemplo 1)
public void onScannedRobot(ScannedRobotEvent e) {
if (isTeammate(e.getName())) return;
double enemyBearing = this.getHeading() + e.getBearing();
double enemyX = getX() + e.getDistance() *
Math.sin(Math.toRadians(enemyBearing));
double enemyY = getY() + e.getDistance() *
Math.cos(Math.toRadians(enemyBearing));
try {
broadcastMessage(new Point(enemyX,enemyY));
} catch (IOException ex) {
System.out.println("Unable to send order: " + ex);
}
}
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}
}
Criando um time de robôs
(Exemplo 2)
package sampleteam;
import robocode.*;
public class MyFirstDroid extends TeamRobot implements Droid
{
public void run() { System.out.println("MyFirstDroid ready."); }
public void onMessageReceived(MessageEvent e)
{
if (e.getMessage() instanceof Point)
{
Point p = (Point)e.getMessage();
double dx = p.getX() - this.getX();
double dy = p.getY() - this.getY();
double theta = Math.toDegrees(Math.atan2(dx,dy));
turnGunRight(normalRelativeAngle(theta - getGunHeading()));
fire(3);
}
Criando um time de robôs
(Exemplo 2)
else if (e.getMessage() instanceof RobotColors)
{
RobotColors c = (RobotColors)e.getMessage();
setColors(c.getBodyColor(),c.getGunColor(),c.getRadarColor());
}
}
public double normalRelativeAngle(double angle) {
if (angle > -180 && angle <= 180) return angle;
double fixedAngle = angle;
while (fixedAngle <= -180) fixedAngle += 360;
while (fixedAngle > 180)
fixedAngle -= 360;
return fixedAngle;
}
}
Baixando e Instalando
• Robocode roda em qualquer plataforma que
suporte Java 1.3.x ou superior
• O Java pode ser baixado de:
– http://www.java.sun.com
• para desenvolvimento, baixar J2SE 1.4
• Apenas execução, baixar JRE 1.4
• O instalador do Robocode pode ser baixado de:
– http://robocode.alphaworks.ibm.com/home/home.html
Bibliografia
•
•
•
•
•
http://robocode.alphaworks.ibm.com/home/home.html
http://www-106.ibm.com/developerworks/java/library/j-robocode/
http://robocode.net/
http://robocoderepository.com/
http://robocode.diverman.com/
Apêndice
Links para tópicos da Apresentação
Performance de Aplicações Java
...
String s = “texto inicial”;
for (int i = 0; i < 1000; i++)
s += “, append”;
...
...
StringBuffer sb = new StringBuffer();
Sb.append(“texto inicial”);
for (int i = 0; i < 1000; i++)
sb.append(“, append”);
String s = sb.toString();
...
Retornar
Download

robocode