54
Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Embed Size (px)

Citation preview

Page 1: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Introdução

I Torneio Robocode

Build the BestDestroy the Rest!!!

Page 2: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Sumário

• Robocode, o que é?• Conceitos básicos• Como programar• Principais características• Funções básicas• Eventos• Primeiro robô

Page 3: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 4: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Robocode, o que é?

Page 5: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Conceitos Básicos

• Anatomia do tanque de guerra:

Utilizada para disparar balas.Pode girar 360° graus.

Utilizado para enxergar o campode batalha.

Page 6: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Conceitos Básicos

• Campo de batalha.

Robôs

Paredes

Page 7: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Podemos programar nossos robôs diretamente no jogo.

Page 8: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• O editor,

Page 9: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Criando um novo robô.

Page 10: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 11: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Nesta próxima tela, digite o nome de sua equipe:– Nome curto, em minúsculo, sem caracteres

especiais e sem espaço.

Page 12: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• A seguinte tela foi criada.Todo texto iniciando com // ou entre /* e */ são comentários.

Page 13: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Personalizando as cores do seu robô.– Remova o comentário da 3 linha.

Apagar a //

Page 14: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Personalizando as cores do seu robô.– Remova o comentário da 21 linha.

Apagar a //

Page 15: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 16: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Exemplo:– Robô com o corpo branco, arma preta e radar

vermelho.setColors(Color.white,Color.black,Color.red);

Page 17: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Salvando o robô.

Page 18: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 19: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Salvando o robô– Não altere o nome do arquivo, pressione apenas o

botão salvar.

Page 20: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Agora falta compilar o robô.

Page 21: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Programando

• Se tudo deu certo.

Page 22: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Vá para a tela do jogo.

Page 23: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Clique em Battle -> New

Page 24: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Configurando a batalha

“Equipes”

Robôs

Robôs que irão participar da batalha.

Page 25: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Configurando a batalhaSelecione seu robô e clique em add.

Page 26: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Selecione um outro robô para lutar contra o seu robô.

Pressione Start Battle para iniciar a batalha.

Page 27: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeira Batalha

• Note as cores que escolhemos para nosso robô.

Page 28: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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?

Page 29: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 30: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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°.

Page 31: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Principais Características

• Tempo e medida de distância– Tempo• O tempo é medido em ticks.

– Distância• A distância é medida em pixels.

Page 32: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Principais Características

• Coordenadas

Page 33: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 34: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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ê

Page 35: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 36: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 37: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Posicionamento– Vamos posicionar o robô no centro do campo de batalha.– O que sabemos?

Queremos mover o robô para este ponto.

Page 38: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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

Page 39: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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);

Page 40: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 41: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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();

Page 42: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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)

Page 43: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Temos um problema.

Robocode

360°

90°

270°

180°

ConvencionalBasta subtrair90°

Page 44: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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)

Page 45: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 46: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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)

Page 47: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Vamos colocar o código disponibilizado antes do while.

Só será executando uma vez.

Page 48: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Agora vamos girar o radar para procurar os inimigos.

• Basta adicionar a linha– turnRadarRight(360);

• Colocamos dentro do while para repetir sempre.

Page 49: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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.

Page 50: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Resultado.

public void onScannedRobot(ScannedRobotEvent e) {turnRight(getBearing()+90);

}

Page 51: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

Primeiro Robô

• Agora movemos o robô para frente e para trás.

while(true) {ahead(100);turnRadarRight(360);back(100);

}

Page 52: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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;

Page 53: Introdução I Torneio Robocode Build the Best Destroy the Rest!!!

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) {}

}