Upload
internet
View
121
Download
3
Embed Size (px)
Citation preview
Introdução
I Torneio Robocode
Build the BestDestroy the Rest!!!
Sumário
• Robocode, o que é?• Conceitos básicos• Como programar• Principais características• Funções básicas• Eventos• Primeiro robô
Robocode, o que é?
• Robocode trata-se de um jogo onde competidores programam robôs tanque de guerra para destruir outros tanques de guerra.
• Uma vez programado não pode haver interversão humana para controlá-lo.
Robocode, o que é?
Conceitos Básicos
• Anatomia do tanque de guerra:
Utilizada para disparar balas.Pode girar 360° graus.
Utilizado para enxergar o campode batalha.
Conceitos Básicos
• Campo de batalha.
Robôs
Paredes
Programando
• Podemos programar nossos robôs diretamente no jogo.
Programando
• O editor,
Programando
• Criando um novo robô.
Programando
• Digite o nome do seu robô– Não pode conter espaços;– Não pode conter caracteres especiais;– Não pode iniciar com um número.
Programando
• Nesta próxima tela, digite o nome de sua equipe:– Nome curto, em minúsculo, sem caracteres
especiais e sem espaço.
Programando
• A seguinte tela foi criada.Todo texto iniciando com // ou entre /* e */ são comentários.
Programando
• Personalizando as cores do seu robô.– Remova o comentário da 3 linha.
Apagar a //
Programando
• Personalizando as cores do seu robô.– Remova o comentário da 21 linha.
Apagar a //
Programando
• A linha– setColors(Color.red,Color.blue,Color.green);
• define as cores do robô.• A primeira cor refere-se ao corpo, a segunda à
arma, a terceira ao radar.• As cores devem ser selecionadas sempre
utilizando o Color. + cor em inglês.
Programando
• Exemplo:– Robô com o corpo branco, arma preta e radar
vermelho.setColors(Color.white,Color.black,Color.red);
Programando
• Salvando o robô.
Programando
• Salvando o robô.– Se aparecer, pressione Sim.• É uma mensagem informando o diretório que o seu
robô será salvo e que o diretório será criado.
Programando
• Salvando o robô– Não altere o nome do arquivo, pressione apenas o
botão salvar.
Programando
• Agora falta compilar o robô.
Programando
• Se tudo deu certo.
Primeira Batalha
• Vá para a tela do jogo.
Primeira Batalha
• Clique em Battle -> New
Primeira Batalha
• Configurando a batalha
“Equipes”
Robôs
Robôs que irão participar da batalha.
Primeira Batalha
• Configurando a batalhaSelecione seu robô e clique em add.
Primeira Batalha
• Selecione um outro robô para lutar contra o seu robô.
Pressione Start Battle para iniciar a batalha.
Primeira Batalha
• Note as cores que escolhemos para nosso robô.
Primeira Batalha
• Você deve ter estranhado o movimento do seu robô.– Para frente, gira arma e radar 360°, para trás, gira
arma e radar 360°.– Eu programei isso?
Primeira Batalha
• Vamos dar uma olhada.
Nossa linha de código para configurar a cor do robô.
Aqui está o comportamento do robô.Note que está dentro de um while. Vai repetir até o robô destruir todos os adversários ou ser destruído.
Primeira Batalha
• Vamos analisar o que as funções fazem.
while(true) {ahead(100);turnGunRight(360);back(100);turnGunRight(360);
}
A primeira linha apenas repete as linhas entre { }
Move o robô para frente por 100 pixels.
Move a arma para direita 360°.
Move o robô para trás por 100 pixels.
Move a arma para direita 360°.
Principais Características
• Tempo e medida de distância– Tempo• O tempo é medido em ticks.
– Distância• A distância é medida em pixels.
Principais Características
• Coordenadas
Funções Básicas• Funções de ação
– turnRight(double degree): Gira o robô em um certo número de graus para a direita
– turnLeft(double degree): Gira o robô em um certo número de graus para a esquerda
– turnGunRight(double degree): Gira a arma em um determinado número de graus para a direita
– turnGunLeft(double degree): Gira a arma em um determinado número de graus para a esquerda
– turnRadarRight(double degree): Gira o radar em um certo número de graus para a direita
– turnRadarLeft(double degree): Gira o radar em um certo número de graus para a esquerda.
– fire(double energy): Dispara uma bala com a energia a especificada.
Funções Básicas
• Funções de informação– getBattleFieldWidth() : Obtém a largura (em píxels) do campo de
batalha– getBattleFieldHeight(): Obtém a altura (em píxels) do campo de
batalha– getX(): Obtém a coordenada “x” do robô– getY(): Obtém a coordenada “y” do robô– getHeading(): Obtém a direção em graus do robô– getGunHeading(): Obtém a direção em graus da arma– getRadarHeading(): Obtém a direção em graus do radar– getDistance(): Obtém a distância do oponente em pixels– getBearing(): Obtém o ângulo do oponente em graus em relação a
você
Eventos
• void onScannedRobot(ScannedRobotEvent e) – O código desta função é executado sempre que um robô é detectado pelo radar.
• void onHitRobot(HitRobotEvent e) – O código desta função é executado toda vez que você atinge um inimigo.
• void onHitByBullet(HitByBulletEvent e) – O código desta função é executado toda vez que você for atingido por um inimigo.
Primeiro Robô
• Depois de todas estas funções vamos lá, criar nosso primeiro tanque de guerra!
• Primeiramente vamos montar uma estratégia, a mais simples possível.
• Para montarmos nossa estratégia temos que pensar em 3 coisas.– Posicionamento.– Esquiva.– Ataque.
Primeiro Robô
• Posicionamento– Vamos posicionar o robô no centro do campo de batalha.– O que sabemos?
Queremos mover o robô para este ponto.
Primeiro Robô
• Posicionando o robô no centro.
(getBattleFieldWidth() /2, getBattleFieldHeight() /2)
(getBattleFieldWidth() /2, getY())
(getX(), getY()) a
b
c
a = -b = -c = -
t
t = arc tg c/b
Primeiro Robô
• Como fica o código.double marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +Math.pow(vermelhoX - marromY, 2));
double b = azulX - vermelhoX;double c = marromY - azulY;
double t = Math.atan(c/b);
Primeiro Robô• Já temos o ângulo do nosso tanque em relação ao centro do campo.• O movimento de girar será o ângulo que o robô atualmente está
menos o ângulo do tanque em relação ao centro.
a
b
ct
getHeading() retorna este ângulo.
Primeiro Robô
• Como fica o código.double marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +Math.pow(vermelhoY - marromY, 2));
double b = azulX - vermelhoX;double c = marromY - azulY;
double t = Math.toDegrees(Math.atan(c/b)) - getHeading();
Primeiro Robô• Girando e movendo o robô.
– Utilizaremos as funções turnRight() e ahead().
double marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +Math.pow(vermelhoY - marromY, 2));
double b = azulX - vermelhoX;double c = marromY - azulY;
double t = Math.toDegrees(Math.atan(c/b)) - getHeading();turnRight(t);ahead(a)
Primeiro Robô
• Temos um problema.
Robocode
360°
90°
0°
270°
180°
ConvencionalBasta subtrair90°
Primeiro Robô
• Resultadodouble marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +Math.pow(vermelhoY - marromY, 2));
double b = azulX - vermelhoX;double c = marromY - azulY;
double t = 90 - Math.toDegrees(Math.atan(c/b)) - getHeading();turnRight(t);ahead(a)
Primeiro Robô
• Mais um problema...• Temos que determinar o quadrante que se
encontra a orientação do robô para determinar se usamos o turnRight() ou turnLeft().
• Ou podemos normalizar o ângulo entre -180° e 180.
• Sendo assim apenas turnRight() resolveria nosso problema.
Primeiro Robô
• Resultado final.double marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +Math.pow(vermelhoY - marromY, 2));
double b = azulX - vermelhoX;double c = marromY - azulY;
double t = 90 - Math.toDegrees(Math.atan(c/b)) - getHeading();
while (t <= -180) a += 2 * 180;while (t > 180) a -= 2 * 180;
turnRight(t);ahead(a)
Primeiro Robô
• Vamos colocar o código disponibilizado antes do while.
Só será executando uma vez.
Primeiro Robô
• Agora vamos girar o radar para procurar os inimigos.
• Basta adicionar a linha– turnRadarRight(360);
• Colocamos dentro do while para repetir sempre.
Primeiro Robô
• Vamos posicionar o robô perpendicular ao inimigo.• Desta forma podemos esquivar das balas.• Quando um inimigo é detectado pelo radar a função
onScannedRobot() é chamada.• Faremos isto nesta função.
Primeiro Robô
• Resultado.
public void onScannedRobot(ScannedRobotEvent e) {turnRight(getBearing()+90);
}
Primeiro Robô
• Agora movemos o robô para frente e para trás.
while(true) {ahead(100);turnRadarRight(360);back(100);
}
Primeiro Robô
• Código Finalpackage demolidores;
import robocode.*;import java.awt.Color;
public class MeuRobo extends Robot{
boolean finish = false;public void run() {
setColors(Color.white,Color.black,Color.red); // body,gun,radar
double marromX = (getBattleFieldWidth()/2);double marromY = (getBattleFieldHeight()/2);
double vermelhoX = getX();double vermelhoY = getY();
double azulX = marromX;double azulY = vermelhoY;
Primeiro Robô• Continuação double a = Math.sqrt(Math.pow(vermelhoX - marromX, 2) +
Math.pow(vermelhoY - marromY, 2));double b = azulX - vermelhoX;double c = marromY - azulY;
double t = 90 - Math.toDegrees(Math.atan(c/b)) - getHeading();
while (t <= -180) t += 2 * 180;while (t > 180) t -= 2 * 180;
turnRight(t);ahead(a);
finish = true;while(true) {
ahead(100);turnRadarRight(360);back(100);
}}
public void onScannedRobot(ScannedRobotEvent e) {if (finish)
turnRight(e.getBearing()+90);}
public void onHitByBullet(HitByBulletEvent e) {}
public void onHitWall(HitWallEvent e) {}
}
API e WIKI
• http://robocode.sourceforge.net/docs/robocode/
• http://robowiki.net/• http://mark.random-article.com/weber/java/r
obocode/