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