ROBOCODE
666
Prof. Ms. Peter Jandl Junior
Análise e Desenvolvimento de Sistemas
FATEC Jundiaí
08/06/2018 (C) 2018 PeterJandlJr. 2
Já sabemos que desenvolver jogos
digitais melhora as habilidades de
programação e, com isso, abre mais
oportunidades de carreira e negócios.
FAST TRACK REVIEW
08/06/2018 (C) 2018 PeterJandlJr. 3
robocode
■ O que é:
Jogo de programação.
■ Objetivo:
Vencer batalhas tipo vale-
tudo.
■ Com que:
Robôs autônomos
(programador não controla
robô durante o jogo).
■ Como:
Codificação de robô para
competir com outros robôs
num campo de batalha.
08/06/2018 (C) 2018 PeterJandlJr. 4
robocode
■ Robôs são tanques,
capazes de
– movimentar-se;
– localizar adversários;
e
– atirar!
■ Robôs são dispostos
aleatoriamente em
um campo de batalha
(battlefield)
retangular sem entradas
ou saídas.
08/06/2018 (C) 2018 PeterJandlJr. 5
■ Robôs são programados
via Java para ataque e
defesa. Pontuam ao longo
do combate.
■ Objetivos:
– Principal: não ser
destruído!
– Secundário: destruir!
■ Vence o robô que
acumular mais pontos ao
longo dos diversos rounds
da batalha.
robocode
■ O jogador (programador) não
tem influência direta no jogo,
cujas batalhas são realizadas
em tempo real.
■ Robô deve conter algum
código "inteligente" para
competir de maneira
autônoma.
■ Controle interno do jogo
garante a distribuição
uniforme e regular do tempo
entre os robôs, além de prover
sua visualização (rendering).
08/06/2018 (C) 2018 PeterJandlJr. 6
■ API do Robocode fornece
classes prontas como
ponto de partida para
construção de novos
robôs.
■ Uso destas classes é uma
exigência para permitir
integrar o robô criado ao
ambiente Robocode.
robocode::ambiente
■ Janela principal com campo de batalha (arena) e controles.
■ Permite:
– Criar, abrir e salvar batalhas;
– Pausar, continuar e finalizar batalhas;
– Visualizar estatísticas e destruir qualquer robô.
■ É possível customizar:
– Tamanho da arena
– Número de robôs participantes das batalhas
– Número de rounds de cada batalha
– E um bom número de outros detalhes.
08/06/2018 (C) 2018 PeterJandlJr. 7
robocode::editor
08/06/2018 (C) 2018 PeterJandlJr. 8
Editor de Código
Integrado
Janela secundária independente
com acesso a ferramentas básicas
de desenvolvimento.
robocode::API
08/06/2018 (C) 2018 PeterJandlJr. 9
ANATOMIA DOS
ROBÔS
08/06/2018 (C) 2018 PeterJandlJr. 10
robocode::battlefield
■ Tamanho default do
campo de batalha 800 x 600 pixels
■ Então:
– Distância máxima entre quaisquer dois robôs no battlefield
padrão é menor que 1000.
– Qualquer robô pode ser localizado neste tamanho de
campo (raio de varredura = 1200 pixels).
■ Além disso:
– Radar não detecta balas.
– Canhão aquece e impede sequência ilimitada de tiros.
08/06/2018 (C) 2018 PeterJandlJr. 11
robocode::battlefield
08/06/2018 (C) 2018 PeterJandlJr. 12
robocode::pontuação
■ Acerto +3*energia
■ Erro -energia
■ Dano -4*energia-2*(energia-1)
■ Atropelar (ram) +1.2
■ Colisão (parede) -0.6
■ Destruição de robô
– Por meio de tiro(s) +20% dano causado
– Por atropelamento +30% dano causado
■ Vitória no round +10
08/06/2018 (C) 2018 PeterJandlJr. 13
robô::tanque de guerra
■ Componentes:
– Veículo
(base móvel)
– Canhão giratório
– Radar giratório
■ Elementos do tanque:
– Movimento conjunto
é natural.
– Podem ter
movimento
independente.
08/06/2018 (C) 2018 PeterJandlJr. 14
Se veículo se move,
canhão e radar
"acompanham"
Se canhão, radar
"acompanha"
Todos podem ser
movidos livremente
robô::características
■ Energia Inicial 100
■ Velocidade 8 pixels/turn
■ Velocidade de giro 20°/turn
■ Velocidade da bala 20 pixels/turn
■ Energia da bala 0.1 a 3.0
(maior a bala, menor a velocidade)
■ Raio de varredura 1200 pixels
■ Dados de varredura distância, nome, velocidade,
heading, bearing e energia
do adversário localizado.
08/06/2018 (C) 2018 PeterJandlJr. 15
Direção absoluta do
robô e direção
relativa ao robô.
robocode::heading & bearing
08/06/2018 (C) 2018 PeterJandlJr. 16
Norte é
0°
robô::entidade autônoma
programável
■ Os robôs são construídos a partir de classes padronizadas:
– robocode.Robot
robocode.AdvancedRobot
■ Estas classes oferecem a infraestrutura básica para o
funcionamento do robô, o que inclui:
– informações do robô
– ações do robô
– controle de eventos
– informações do ambiente
– execução de ações em paralelo (AdvancedRobot)
08/06/2018 (C) 2018 PeterJandlJr. 17
robô::avançado
■ Robôs melhores podem ser construídos a partir de
robocode.AdvancedRobot.
■ Esta classe oferece a mesma infraestrutura básica disponível
em robocode.Robot.
■ Adicionalmente possibilita:
– A chamada de ações não bloqueantes, ou seja, permite
que o robô execute ações em paralelo, por exemplo, andar
e atirar.
– Operações paralelizáveis tem prefixo set.
– Métodos execute() ou waitFor() acionam conjunto prévio de
operações set em paralelo.
– Ajustes mais sofisticados, além de obtenção de
informações mais detalhadas.
08/06/2018 (C) 2018 PeterJandlJr. 18
robô::entidade autônoma
programável
Informações do Robô
■ getX() | getY()
coordenada do robô
■ getWidth () | getHeight()
dimensões do robô
■ getHeading() |
getGunHeading() |
getRadarHeading()
direção do robô, do canhão e do
radar
■ getVelocity()
velocidade do robô
■ getEnergy()
energia do robô
Ações do Robô
■ ahead(double)|back(double)
movimentação
■ turnRight(double)|turnLeft(double)
gira o robô
■ turnGunRight(double) |
turnGunLeft(double)
gira o canhão
■ turnRadarRight(double) |
turnRadarLeft(double)
gira o radar
■ scan()
varredura por outros robôs
■ fire(double)
dispara um tiro de energia
08/06/2018 (C) 2018 PeterJandlJr. 19
Programação
robô é feita por
meio de suas
ações.
robô::entidade autônoma
programável
Informações do
Ambiente
■ getBattleFieldWidth() |
getBattleFieldHeight()
largura e altura da arena
■ getNumRounds()
núm. de rounds da batalha
■ getRoundNum()
round da batalha
■ getTime()
tempo batalha
■ getOthers()
núm. atual de oponentes
Controle de Eventos
■ onScannedRobot(
ScannedRobotEvent)
detecção de robô
■ onHitByBullet(
HitByBulletEvent)
robô alvejado por tiro
■ onHitByRobot(
HitByBulletEvent)
robô colide com robô
■ onHitWall(
HitWallEvent)
robô colide com parede
08/06/2018 (C) 2018 PeterJandlJr. 20
Programação
robô é feita como
resposta aos
eventos de
batalha!
robô::entidade autônoma
programável
Controle de Tiro
■ onBulletHit(
BulletHitEvent)
quando um tiro acerta alvo
■ onBulletHitBullet(
BulletHitBulletEvent)
quando um tiro acerta um outro
tiro
■ onBulletMissed(
BulletMissedEvent)
quando um tiro erra o alvo
■ onHitByBullet(
HitByBulletEvent)
quando o robô é alvejado por tiro
Controle Avançado
■ onDeath(DeathEvent)
detecção da morte do robô
■ onRobotDeath(
RobotDeathEvent)
detecção de morte de outro robô
■ onWin(WinEvent)
quando robô vence
■ onStatus(StatusEvent)
acionado a cada vez para prover
informações sobre o robô
08/06/2018 (C) 2018 PeterJandlJr. 21
Programação
robô é feita como
resposta aos
eventos de
batalha!
CRIAÇÃO DE ROBÔSDestroy then all!
08/06/2018 (C) 2018 PeterJandlJr. 22
robocode::instalação
■ Fazer download em:
https://sourceforge.net/projects/robocode/files/
robocode | robocode-1.9.3.2-setup.jar [2018-04-04]
■ Não descompacte o arquivo!
Que deve ser executável, se a configuração do Java estiver
correta no seu computador!
– Executable Jar File → dois cliques para executar
next, next e tudo dará certo!
– Outra extensão:
■ Prompt de comandos
■ Navegar até diretório de download
do arquivo obtido.
■ Acione o comando:
java –jar robocode-1.9.3.2-setup.jar
08/06/2018 (C) 2018 PeterJandlJr. 23
Precisamos do Java JDK
7+ instalado no sistema!
Configuração do JDK
@echo off
set JAVA_HOME="C:Program FilesJavajdk-9"
path=%JAVA_HOME%bin;%path%
echo %path%
echo %JAVA_HOME%
java -version
08/06/2018 (C) 2018 PeterJandlJr. 24
Convém possuir um
arquivo como esse
(J9.bat no meu caso).
Localize a versão do JDK
instalada do seu sistema
e adapte este arquivo.
Num prompt de
comandos acione este
bat. Use este prompt para
acionar o robocode!
robocode::execução
08/06/2018 (C) 2018 PeterJandlJr. 25
Funciona também pelo
Explorer:
robocode.bat
robôs::Criação
■ Na janela principal:
– Robot
– Source Editor
■ Na janela do editor:
– File
– New
– Robot
■ Escolha um nome:
– MFR
■ Defina um pacote:
– jandl
■ Edite o código.
08/06/2018 (C) 2018 PeterJandlJr. 26
Aqui começa a diversão!
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 27
(2) Loop principal
(1) Inicialização
(3) Varredura
(4) Alvejado por bala
(5) Colisão com parede
(0) Campos
Robô::estrutura do Código
(0) Campos
■ Área que permite a definição de:
– Variáveis e estruturas de dados
■ (da classe) do robô.
■ Podem ser livremente declaradas para auxiliar no controle do
robô e de suas estratégias de defesa e ataque.
■ Elementos declarados nesta área serão acessíveis em todo
código do robô.
08/06/2018 (C) 2018 PeterJandlJr. 28
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 29
Sem campos neste
primeiro robô.
(0) Campos
Robô::estrutura do Código
(1) Inicialização
■ A inicialização do código de controle do robô pode ser feita na
seção inicial do método run().
■ Elementos locais (i.e., válidos apenas neste método) podem
ser acrescentados.
■ Aqui é colocado o código que necessita ser executado apenas
uma vez para cada instância do robô, ou seja, para
determinar seu estado inicial.
08/06/2018 (C) 2018 PeterJandlJr. 30
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 31
(1) Inicialização Este robô
simples não
requer cuidados
especiais.
Robô::estrutura do Código
(2) Loop principal
■ Laço infinito que determina o comportamento normal do
robô, i.e., aquilo que o tanque fará quando não está atacando
ou sendo atacado.
■ Em geral corresponde à movimentação do robô pelo campo
de batalha.
08/06/2018 (C) 2018 PeterJandlJr. 32
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 33
(2) Loop principal Comportamento
normal do robô.
Robô::estrutura do Código
(3) varredura
■ Como consequência da movimentação do radar (de maneira
independente ou por meio do giro do tanque), oponentes
dentro do raio de varredura (até 1200 pixels de distância)
serão localizados.
■ Cada oponente localizado gera um evento
ScannedRobotEvent que é entregue ao robô por meio do
acionamento do método
onScannedRobot(ScannedRobotEvent).
■ Isto possibilita estabelecer uma estratégia de ataque dirigida
aos oponente localizados.
08/06/2018 (C) 2018 PeterJandlJr. 34
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 35
(3) Varredura Localizou oponente?
Fogo nele!
Robô::estrutura do Código
(3) varredura
■ Como padrão, o canhão e o radar se movimentam junto com
o robô.
■ Assim, se a primeira ação em
onScannedRobot(ScannedRobotEvent) for fire(1), o tiro irá na
direção do robô oponente localizado.
08/06/2018 (C) 2018 PeterJandlJr. 36
Robô::estrutura do Código
(4) alvejado por bala
■ Quando o robô é atingido por um tiro adversário, é gerado um
evento HitByBulletEvent que é entregue ao robô por meio do
acionamento do método onHitByBullet(HitByBulletEvent).
■ Isto possibilita estabelecer uma estratégia de defesa
relacionada aos oponentes.
08/06/2018 (C) 2018 PeterJandlJr. 37
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 38
(4) Alvejado por bala Foi localizado?
Melhor fugir!
Robô::estrutura do Código
(5) colisão com parede
■ Quando o robô colide com uma das parede que delimitam o
campo de batalha é gerado um evento HitWallEvent que é
entregue ao robô por meio do acionamento do método
onHitWall(HitWallEvent).
■ Isto possibilita complementar a estratégia de movimentação
do robô estabelecida no método run().
08/06/2018 (C) 2018 PeterJandlJr. 39
Robô::
estruturadoCódigo
08/06/2018 (C) 2018 PeterJandlJr. 40
(5) Colisão com parede Parede?
Marcha-a-ré!
robôs::Criação
■ Editou
■ Salvou
■ Compilou
■ Tá pronto para batalha!
08/06/2018 (C) 2018 PeterJandlJr. 41
Errinhos não
contam!
Robôs criados no
ambiente já estão
disponíveis para novas
batalhas!
robôs::teste
Batalha ZERO
■ Crie uma nova batalha
■ Com seu robô e UM único
adversário simples
(SittingDuck, para ser
feliz ao meno uma vez!)
Batalha UM, DOIS ...
■ Crie novas batalhas
■ Adicione,
progressivamente,
adversários de tipo
diferente e em
quantidade selecionada.
■ Avalie seu robô! Melhore!
08/06/2018 (C) 2018 PeterJandlJr. 42
ROBOCODE::
TECNICALIDADES
Detalhes. Sempre os detalhes.
08/06/2018 (C) 2018 PeterJandlJr. 43
◼ robocode.Robot
⚫ robocode.AdvancedRobot
robôs::sugestões
INICIANTES
■ Tente criar alguns robôs
combinando os elementos
da API.
■ Observe o comportamento
do robô e os resultados
obtidos.
JOGADORES
■ Estude o código dos robôs
exemplo que acompanham
o Robocode:
– sample.Walls◼
– sample.Tracker◼
– sample.Crazy⚫
■ Combine suas estratégias
na forma de novos robôs.
08/06/2018 (C) 2018 PeterJandlJr. 44
Walls2
08/06/2018 (C) 2018 PeterJandlJr. 45
robôs::
estratégias de movimentação
1. Trajetória Linear
Evita mira fixa.
2. Trajetória Circular ou Elíptica
Evita mira fixa e mira linear.
3. Trajetória Oscilante
Evita mira linear e circular, mas mira fixa é um problema.
4. Trajetória Randômica
Evita mira fixa, linear e circular, mas acaba sendo
estatisticamente alvejado.
5. Trajetória Avançada
Utiliza dados de posicionamento (e trajetória) dos oponentes
para efetuar movimentação.
08/06/2018 (C) 2018 PeterJandlJr. 46
Ficar parado
não dá!
robôs::
estratégias de mira
1. Mira Fixa
Atira na posição onde alvo foi localizado.
2. Mira Linear
Atira na posição futura de alvo, assumindo movimento linear
uniforme. Efetiva para alvos próximos, falha em outras situações.
3. Mira Circular
Atira na posição futura de alvo, assumindo movimento circular
uniforme. Efetiva para alvos próximos, falha em outras situações.
4. Mira Oscilante
Só é efetiva para robôs que possuem este tipo de movimentação.
5. Mira Adaptativa
Utiliza dados de posicionamento (e trajetória) dos oponentes para
identificar padrão de movimentação, adaptando forma da mira.
08/06/2018 (C) 2018 PeterJandlJr. 47
Atirar para
acertar!
robôs::
estratégias de localização
1. Localização Simples
Radar e canhão alinhados todo tempo.
2. Localização Circular
Mantém radar girando continuamente.
3. Localização Travada/Fixa
Mantém radar travado em um algo específico.
4. Localização Ótima
Movimenta radar para localizar o máximo de alvos da maneira
mais rápida possível.
08/06/2018 (C) 2018 PeterJandlJr. 48
Atirar para
acertar!
robôs::criação com eclipse
08/06/2018 (C) 2018 PeterJandlJr. 49
robôs::criação com eclipse
■ IDE provê mais facilidades
para o desenvolvimento de
robôs.
■ Pode ser integrado ao
Robocode, sem
necessidade de qualquer
outro recurso.
■ São necessários três
passos.
1. Criação de projeto em
localização externa ao
Eclipse.
2. Inclusão da API do
Robocode.
3. Ligação com
documentação da API.
08/06/2018 (C) 2018 PeterJandlJr. 50
Também
funciona com o
Netbeans!
robôs::criação com eclipse
■ File | New |
Java Project
■ Escolha o
Project Name
■ Desmarque
Use default location
■ Com Browse selecione diretório
robots da instalação do
Robocode
■ Acione Next
08/06/2018 (C) 2018 PeterJandlJr. 51
robôs::criação com eclipse
■ Selecione aba Libraries
■ Com Add External Jars
selecione arquivo robocode.jar
no diretório libs da instalação
do Robocode
■ Acione Finish
08/06/2018 (C) 2018 PeterJandlJr. 52
robôs::criação com eclipse
■ No Package Explorer abra item
Referenced Libraries
■ Selecione arquivo robocode.jar
■ Com botão direito acione
Properties
■ Com o Browse selecione
diretório javadoc do Robocode
■ Acione OK
08/06/2018 (C) 2018 PeterJandlJr. 53
robôs::criação com eclipse
08/06/2018 (C) 2018 PeterJandlJr. 54
Documentação
integrada da API
Editor de código
avançado
robôs::Criação com eclipse
■ Editou
■ Salvou
■ Compilação automática
do IDE
■ Tá pronto para batalha!
08/06/2018 (C) 2018 PeterJandlJr. 55
Errinhos
continuam não
contando!
Robôs criados dessa forma também
estão disponíveis para novas
batalhas!
HellOfRobot
08/06/2018 (C) 2018 PeterJandlJr. 56
08/06/2018 (C) 2018 PeterJandlJr. 57
Robô Avançado
Ações Paralelas do
Robô
■ setAhead(double)|
setBack(double)
movimentação para frente e
para trás
■ setFire(double) |
setFireBullet(double)
dispara o canhão
■ execute()
executa as ações agendadas
■ waitFor(Condition)
não retorna até a condição
ser alcançada
Ações Paralelas do
Robô
■ setTurnRight(double) |
setTurnLeft(double)
gira o robô
■ setTurnGunRight(double)|
setTurnGunLeft(double)
gira o canhão
■ setTurnRadarRight(double)|
setTurnRadarLeft(double)
gira o radar
08/06/2018 (C) 2018 PeterJandlJr. 58
CRAZY2
08/06/2018 (C) 2018 PeterJandlJr. 59
ROBOCODE
::RECURSOS
Existe salvação!
08/06/2018 (C) 2018 PeterJandlJr. 60
Robocode::Recursos
■ Home
http://robocode.sourceforge.net/
■ Download
https://sourceforge.net/projects/robocode/files/
■ Documentação OnLine
http://robocode.sourceforge.net/docs/robocode/
■ Wiki
http://robowiki.net/wiki/Robocode
■ Artigos
http://robocode.sourceforge.net/developerWorks.php
■ UFSC
https://www.gsigma.ufsc.br/~popov/aulas/robocode/index.html
■ YouTube vídeo
http://www.youtube.com/watch?v=3qOoDuGkwco
08/06/2018 (C) 2018 PeterJandlJr. 61
08/06/2018 (C) 2018 PeterJandlJr. 62
Prof. Peter Jandl Junior
■ prof.peter@fatec.sp.gov.br
■ http://tecnopode.blogspot.com.br
08/06/2018 (C) 2018 PeterJandlJr. 63

Robocode 666

  • 1.
    ROBOCODE 666 Prof. Ms. PeterJandl Junior Análise e Desenvolvimento de Sistemas FATEC Jundiaí
  • 2.
    08/06/2018 (C) 2018PeterJandlJr. 2 Já sabemos que desenvolver jogos digitais melhora as habilidades de programação e, com isso, abre mais oportunidades de carreira e negócios.
  • 3.
    FAST TRACK REVIEW 08/06/2018(C) 2018 PeterJandlJr. 3
  • 4.
    robocode ■ O queé: Jogo de programação. ■ Objetivo: Vencer batalhas tipo vale- tudo. ■ Com que: Robôs autônomos (programador não controla robô durante o jogo). ■ Como: Codificação de robô para competir com outros robôs num campo de batalha. 08/06/2018 (C) 2018 PeterJandlJr. 4
  • 5.
    robocode ■ Robôs sãotanques, capazes de – movimentar-se; – localizar adversários; e – atirar! ■ Robôs são dispostos aleatoriamente em um campo de batalha (battlefield) retangular sem entradas ou saídas. 08/06/2018 (C) 2018 PeterJandlJr. 5 ■ Robôs são programados via Java para ataque e defesa. Pontuam ao longo do combate. ■ Objetivos: – Principal: não ser destruído! – Secundário: destruir! ■ Vence o robô que acumular mais pontos ao longo dos diversos rounds da batalha.
  • 6.
    robocode ■ O jogador(programador) não tem influência direta no jogo, cujas batalhas são realizadas em tempo real. ■ Robô deve conter algum código "inteligente" para competir de maneira autônoma. ■ Controle interno do jogo garante a distribuição uniforme e regular do tempo entre os robôs, além de prover sua visualização (rendering). 08/06/2018 (C) 2018 PeterJandlJr. 6 ■ API do Robocode fornece classes prontas como ponto de partida para construção de novos robôs. ■ Uso destas classes é uma exigência para permitir integrar o robô criado ao ambiente Robocode.
  • 7.
    robocode::ambiente ■ Janela principalcom campo de batalha (arena) e controles. ■ Permite: – Criar, abrir e salvar batalhas; – Pausar, continuar e finalizar batalhas; – Visualizar estatísticas e destruir qualquer robô. ■ É possível customizar: – Tamanho da arena – Número de robôs participantes das batalhas – Número de rounds de cada batalha – E um bom número de outros detalhes. 08/06/2018 (C) 2018 PeterJandlJr. 7
  • 8.
    robocode::editor 08/06/2018 (C) 2018PeterJandlJr. 8 Editor de Código Integrado Janela secundária independente com acesso a ferramentas básicas de desenvolvimento.
  • 9.
  • 10.
  • 11.
    robocode::battlefield ■ Tamanho defaultdo campo de batalha 800 x 600 pixels ■ Então: – Distância máxima entre quaisquer dois robôs no battlefield padrão é menor que 1000. – Qualquer robô pode ser localizado neste tamanho de campo (raio de varredura = 1200 pixels). ■ Além disso: – Radar não detecta balas. – Canhão aquece e impede sequência ilimitada de tiros. 08/06/2018 (C) 2018 PeterJandlJr. 11
  • 12.
  • 13.
    robocode::pontuação ■ Acerto +3*energia ■Erro -energia ■ Dano -4*energia-2*(energia-1) ■ Atropelar (ram) +1.2 ■ Colisão (parede) -0.6 ■ Destruição de robô – Por meio de tiro(s) +20% dano causado – Por atropelamento +30% dano causado ■ Vitória no round +10 08/06/2018 (C) 2018 PeterJandlJr. 13
  • 14.
    robô::tanque de guerra ■Componentes: – Veículo (base móvel) – Canhão giratório – Radar giratório ■ Elementos do tanque: – Movimento conjunto é natural. – Podem ter movimento independente. 08/06/2018 (C) 2018 PeterJandlJr. 14 Se veículo se move, canhão e radar "acompanham" Se canhão, radar "acompanha" Todos podem ser movidos livremente
  • 15.
    robô::características ■ Energia Inicial100 ■ Velocidade 8 pixels/turn ■ Velocidade de giro 20°/turn ■ Velocidade da bala 20 pixels/turn ■ Energia da bala 0.1 a 3.0 (maior a bala, menor a velocidade) ■ Raio de varredura 1200 pixels ■ Dados de varredura distância, nome, velocidade, heading, bearing e energia do adversário localizado. 08/06/2018 (C) 2018 PeterJandlJr. 15 Direção absoluta do robô e direção relativa ao robô.
  • 16.
    robocode::heading & bearing 08/06/2018(C) 2018 PeterJandlJr. 16 Norte é 0°
  • 17.
    robô::entidade autônoma programável ■ Osrobôs são construídos a partir de classes padronizadas: – robocode.Robot robocode.AdvancedRobot ■ Estas classes oferecem a infraestrutura básica para o funcionamento do robô, o que inclui: – informações do robô – ações do robô – controle de eventos – informações do ambiente – execução de ações em paralelo (AdvancedRobot) 08/06/2018 (C) 2018 PeterJandlJr. 17
  • 18.
    robô::avançado ■ Robôs melhorespodem ser construídos a partir de robocode.AdvancedRobot. ■ Esta classe oferece a mesma infraestrutura básica disponível em robocode.Robot. ■ Adicionalmente possibilita: – A chamada de ações não bloqueantes, ou seja, permite que o robô execute ações em paralelo, por exemplo, andar e atirar. – Operações paralelizáveis tem prefixo set. – Métodos execute() ou waitFor() acionam conjunto prévio de operações set em paralelo. – Ajustes mais sofisticados, além de obtenção de informações mais detalhadas. 08/06/2018 (C) 2018 PeterJandlJr. 18
  • 19.
    robô::entidade autônoma programável Informações doRobô ■ getX() | getY() coordenada do robô ■ getWidth () | getHeight() dimensões do robô ■ getHeading() | getGunHeading() | getRadarHeading() direção do robô, do canhão e do radar ■ getVelocity() velocidade do robô ■ getEnergy() energia do robô Ações do Robô ■ ahead(double)|back(double) movimentação ■ turnRight(double)|turnLeft(double) gira o robô ■ turnGunRight(double) | turnGunLeft(double) gira o canhão ■ turnRadarRight(double) | turnRadarLeft(double) gira o radar ■ scan() varredura por outros robôs ■ fire(double) dispara um tiro de energia 08/06/2018 (C) 2018 PeterJandlJr. 19 Programação robô é feita por meio de suas ações.
  • 20.
    robô::entidade autônoma programável Informações do Ambiente ■getBattleFieldWidth() | getBattleFieldHeight() largura e altura da arena ■ getNumRounds() núm. de rounds da batalha ■ getRoundNum() round da batalha ■ getTime() tempo batalha ■ getOthers() núm. atual de oponentes Controle de Eventos ■ onScannedRobot( ScannedRobotEvent) detecção de robô ■ onHitByBullet( HitByBulletEvent) robô alvejado por tiro ■ onHitByRobot( HitByBulletEvent) robô colide com robô ■ onHitWall( HitWallEvent) robô colide com parede 08/06/2018 (C) 2018 PeterJandlJr. 20 Programação robô é feita como resposta aos eventos de batalha!
  • 21.
    robô::entidade autônoma programável Controle deTiro ■ onBulletHit( BulletHitEvent) quando um tiro acerta alvo ■ onBulletHitBullet( BulletHitBulletEvent) quando um tiro acerta um outro tiro ■ onBulletMissed( BulletMissedEvent) quando um tiro erra o alvo ■ onHitByBullet( HitByBulletEvent) quando o robô é alvejado por tiro Controle Avançado ■ onDeath(DeathEvent) detecção da morte do robô ■ onRobotDeath( RobotDeathEvent) detecção de morte de outro robô ■ onWin(WinEvent) quando robô vence ■ onStatus(StatusEvent) acionado a cada vez para prover informações sobre o robô 08/06/2018 (C) 2018 PeterJandlJr. 21 Programação robô é feita como resposta aos eventos de batalha!
  • 22.
    CRIAÇÃO DE ROBÔSDestroythen all! 08/06/2018 (C) 2018 PeterJandlJr. 22
  • 23.
    robocode::instalação ■ Fazer downloadem: https://sourceforge.net/projects/robocode/files/ robocode | robocode-1.9.3.2-setup.jar [2018-04-04] ■ Não descompacte o arquivo! Que deve ser executável, se a configuração do Java estiver correta no seu computador! – Executable Jar File → dois cliques para executar next, next e tudo dará certo! – Outra extensão: ■ Prompt de comandos ■ Navegar até diretório de download do arquivo obtido. ■ Acione o comando: java –jar robocode-1.9.3.2-setup.jar 08/06/2018 (C) 2018 PeterJandlJr. 23 Precisamos do Java JDK 7+ instalado no sistema!
  • 24.
    Configuração do JDK @echooff set JAVA_HOME="C:Program FilesJavajdk-9" path=%JAVA_HOME%bin;%path% echo %path% echo %JAVA_HOME% java -version 08/06/2018 (C) 2018 PeterJandlJr. 24 Convém possuir um arquivo como esse (J9.bat no meu caso). Localize a versão do JDK instalada do seu sistema e adapte este arquivo. Num prompt de comandos acione este bat. Use este prompt para acionar o robocode!
  • 25.
    robocode::execução 08/06/2018 (C) 2018PeterJandlJr. 25 Funciona também pelo Explorer: robocode.bat
  • 26.
    robôs::Criação ■ Na janelaprincipal: – Robot – Source Editor ■ Na janela do editor: – File – New – Robot ■ Escolha um nome: – MFR ■ Defina um pacote: – jandl ■ Edite o código. 08/06/2018 (C) 2018 PeterJandlJr. 26 Aqui começa a diversão!
  • 27.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 27 (2) Loop principal (1) Inicialização (3) Varredura (4) Alvejado por bala (5) Colisão com parede (0) Campos
  • 28.
    Robô::estrutura do Código (0)Campos ■ Área que permite a definição de: – Variáveis e estruturas de dados ■ (da classe) do robô. ■ Podem ser livremente declaradas para auxiliar no controle do robô e de suas estratégias de defesa e ataque. ■ Elementos declarados nesta área serão acessíveis em todo código do robô. 08/06/2018 (C) 2018 PeterJandlJr. 28
  • 29.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 29 Sem campos neste primeiro robô. (0) Campos
  • 30.
    Robô::estrutura do Código (1)Inicialização ■ A inicialização do código de controle do robô pode ser feita na seção inicial do método run(). ■ Elementos locais (i.e., válidos apenas neste método) podem ser acrescentados. ■ Aqui é colocado o código que necessita ser executado apenas uma vez para cada instância do robô, ou seja, para determinar seu estado inicial. 08/06/2018 (C) 2018 PeterJandlJr. 30
  • 31.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 31 (1) Inicialização Este robô simples não requer cuidados especiais.
  • 32.
    Robô::estrutura do Código (2)Loop principal ■ Laço infinito que determina o comportamento normal do robô, i.e., aquilo que o tanque fará quando não está atacando ou sendo atacado. ■ Em geral corresponde à movimentação do robô pelo campo de batalha. 08/06/2018 (C) 2018 PeterJandlJr. 32
  • 33.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 33 (2) Loop principal Comportamento normal do robô.
  • 34.
    Robô::estrutura do Código (3)varredura ■ Como consequência da movimentação do radar (de maneira independente ou por meio do giro do tanque), oponentes dentro do raio de varredura (até 1200 pixels de distância) serão localizados. ■ Cada oponente localizado gera um evento ScannedRobotEvent que é entregue ao robô por meio do acionamento do método onScannedRobot(ScannedRobotEvent). ■ Isto possibilita estabelecer uma estratégia de ataque dirigida aos oponente localizados. 08/06/2018 (C) 2018 PeterJandlJr. 34
  • 35.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 35 (3) Varredura Localizou oponente? Fogo nele!
  • 36.
    Robô::estrutura do Código (3)varredura ■ Como padrão, o canhão e o radar se movimentam junto com o robô. ■ Assim, se a primeira ação em onScannedRobot(ScannedRobotEvent) for fire(1), o tiro irá na direção do robô oponente localizado. 08/06/2018 (C) 2018 PeterJandlJr. 36
  • 37.
    Robô::estrutura do Código (4)alvejado por bala ■ Quando o robô é atingido por um tiro adversário, é gerado um evento HitByBulletEvent que é entregue ao robô por meio do acionamento do método onHitByBullet(HitByBulletEvent). ■ Isto possibilita estabelecer uma estratégia de defesa relacionada aos oponentes. 08/06/2018 (C) 2018 PeterJandlJr. 37
  • 38.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 38 (4) Alvejado por bala Foi localizado? Melhor fugir!
  • 39.
    Robô::estrutura do Código (5)colisão com parede ■ Quando o robô colide com uma das parede que delimitam o campo de batalha é gerado um evento HitWallEvent que é entregue ao robô por meio do acionamento do método onHitWall(HitWallEvent). ■ Isto possibilita complementar a estratégia de movimentação do robô estabelecida no método run(). 08/06/2018 (C) 2018 PeterJandlJr. 39
  • 40.
    Robô:: estruturadoCódigo 08/06/2018 (C) 2018PeterJandlJr. 40 (5) Colisão com parede Parede? Marcha-a-ré!
  • 41.
    robôs::Criação ■ Editou ■ Salvou ■Compilou ■ Tá pronto para batalha! 08/06/2018 (C) 2018 PeterJandlJr. 41 Errinhos não contam! Robôs criados no ambiente já estão disponíveis para novas batalhas!
  • 42.
    robôs::teste Batalha ZERO ■ Crieuma nova batalha ■ Com seu robô e UM único adversário simples (SittingDuck, para ser feliz ao meno uma vez!) Batalha UM, DOIS ... ■ Crie novas batalhas ■ Adicione, progressivamente, adversários de tipo diferente e em quantidade selecionada. ■ Avalie seu robô! Melhore! 08/06/2018 (C) 2018 PeterJandlJr. 42
  • 43.
    ROBOCODE:: TECNICALIDADES Detalhes. Sempre osdetalhes. 08/06/2018 (C) 2018 PeterJandlJr. 43
  • 44.
    ◼ robocode.Robot ⚫ robocode.AdvancedRobot robôs::sugestões INICIANTES ■Tente criar alguns robôs combinando os elementos da API. ■ Observe o comportamento do robô e os resultados obtidos. JOGADORES ■ Estude o código dos robôs exemplo que acompanham o Robocode: – sample.Walls◼ – sample.Tracker◼ – sample.Crazy⚫ ■ Combine suas estratégias na forma de novos robôs. 08/06/2018 (C) 2018 PeterJandlJr. 44
  • 45.
  • 46.
    robôs:: estratégias de movimentação 1.Trajetória Linear Evita mira fixa. 2. Trajetória Circular ou Elíptica Evita mira fixa e mira linear. 3. Trajetória Oscilante Evita mira linear e circular, mas mira fixa é um problema. 4. Trajetória Randômica Evita mira fixa, linear e circular, mas acaba sendo estatisticamente alvejado. 5. Trajetória Avançada Utiliza dados de posicionamento (e trajetória) dos oponentes para efetuar movimentação. 08/06/2018 (C) 2018 PeterJandlJr. 46 Ficar parado não dá!
  • 47.
    robôs:: estratégias de mira 1.Mira Fixa Atira na posição onde alvo foi localizado. 2. Mira Linear Atira na posição futura de alvo, assumindo movimento linear uniforme. Efetiva para alvos próximos, falha em outras situações. 3. Mira Circular Atira na posição futura de alvo, assumindo movimento circular uniforme. Efetiva para alvos próximos, falha em outras situações. 4. Mira Oscilante Só é efetiva para robôs que possuem este tipo de movimentação. 5. Mira Adaptativa Utiliza dados de posicionamento (e trajetória) dos oponentes para identificar padrão de movimentação, adaptando forma da mira. 08/06/2018 (C) 2018 PeterJandlJr. 47 Atirar para acertar!
  • 48.
    robôs:: estratégias de localização 1.Localização Simples Radar e canhão alinhados todo tempo. 2. Localização Circular Mantém radar girando continuamente. 3. Localização Travada/Fixa Mantém radar travado em um algo específico. 4. Localização Ótima Movimenta radar para localizar o máximo de alvos da maneira mais rápida possível. 08/06/2018 (C) 2018 PeterJandlJr. 48 Atirar para acertar!
  • 49.
  • 50.
    robôs::criação com eclipse ■IDE provê mais facilidades para o desenvolvimento de robôs. ■ Pode ser integrado ao Robocode, sem necessidade de qualquer outro recurso. ■ São necessários três passos. 1. Criação de projeto em localização externa ao Eclipse. 2. Inclusão da API do Robocode. 3. Ligação com documentação da API. 08/06/2018 (C) 2018 PeterJandlJr. 50 Também funciona com o Netbeans!
  • 51.
    robôs::criação com eclipse ■File | New | Java Project ■ Escolha o Project Name ■ Desmarque Use default location ■ Com Browse selecione diretório robots da instalação do Robocode ■ Acione Next 08/06/2018 (C) 2018 PeterJandlJr. 51
  • 52.
    robôs::criação com eclipse ■Selecione aba Libraries ■ Com Add External Jars selecione arquivo robocode.jar no diretório libs da instalação do Robocode ■ Acione Finish 08/06/2018 (C) 2018 PeterJandlJr. 52
  • 53.
    robôs::criação com eclipse ■No Package Explorer abra item Referenced Libraries ■ Selecione arquivo robocode.jar ■ Com botão direito acione Properties ■ Com o Browse selecione diretório javadoc do Robocode ■ Acione OK 08/06/2018 (C) 2018 PeterJandlJr. 53
  • 54.
    robôs::criação com eclipse 08/06/2018(C) 2018 PeterJandlJr. 54 Documentação integrada da API Editor de código avançado
  • 55.
    robôs::Criação com eclipse ■Editou ■ Salvou ■ Compilação automática do IDE ■ Tá pronto para batalha! 08/06/2018 (C) 2018 PeterJandlJr. 55 Errinhos continuam não contando! Robôs criados dessa forma também estão disponíveis para novas batalhas!
  • 56.
  • 57.
    08/06/2018 (C) 2018PeterJandlJr. 57
  • 58.
    Robô Avançado Ações Paralelasdo Robô ■ setAhead(double)| setBack(double) movimentação para frente e para trás ■ setFire(double) | setFireBullet(double) dispara o canhão ■ execute() executa as ações agendadas ■ waitFor(Condition) não retorna até a condição ser alcançada Ações Paralelas do Robô ■ setTurnRight(double) | setTurnLeft(double) gira o robô ■ setTurnGunRight(double)| setTurnGunLeft(double) gira o canhão ■ setTurnRadarRight(double)| setTurnRadarLeft(double) gira o radar 08/06/2018 (C) 2018 PeterJandlJr. 58
  • 59.
  • 60.
  • 61.
    Robocode::Recursos ■ Home http://robocode.sourceforge.net/ ■ Download https://sourceforge.net/projects/robocode/files/ ■Documentação OnLine http://robocode.sourceforge.net/docs/robocode/ ■ Wiki http://robowiki.net/wiki/Robocode ■ Artigos http://robocode.sourceforge.net/developerWorks.php ■ UFSC https://www.gsigma.ufsc.br/~popov/aulas/robocode/index.html ■ YouTube vídeo http://www.youtube.com/watch?v=3qOoDuGkwco 08/06/2018 (C) 2018 PeterJandlJr. 61
  • 62.
    08/06/2018 (C) 2018PeterJandlJr. 62
  • 63.
    Prof. Peter JandlJunior ■ prof.peter@fatec.sp.gov.br ■ http://tecnopode.blogspot.com.br 08/06/2018 (C) 2018 PeterJandlJr. 63