O documento descreve o jogo Robocode, no qual os jogadores programam robôs autônomos para batalhar em um campo de batalha virtual. Robocode ensina conceitos de programação ao exigir que os jogadores programem robôs para se movimentarem, atirarem e reagirem a eventos durante as batalhas.
2. 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.
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ã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.
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 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
8. 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.
11. 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
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 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ô.
17. 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
18. 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
19. 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.
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 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!
23. 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!
24. 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!
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
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
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
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
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
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
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
■ 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
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
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!
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
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!
58. 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