O documento discute o jogo Robocode, que é um jogo de programação onde os jogadores criam robôs de batalha em Java para competirem em uma arena virtual. O documento explica:
1) O objetivo de Robocode é desenvolver habilidades de programação através da criação de robôs que competem em batalhas;
2) Os robôs são programados para se movimentarem, atirarem e reagirem a eventos como detectar inimigos ou colidirem com paredes;
3) O jogo é composto por arenas de batal
2. 15/05/2018 (C) 2018 PeterJandlJr. 2
O desenvolvimento de jogos digitais tem
o potencial de conjugar a melhoria nas
habilidades de programação, além de
oportunizar carreira e novos negócios.
11. robocode
■ O que é?
■ Objetivo?
■ Jogadores?
■ Jogo de programação.
■ Codificar um robô de
batalha para competir
com outros robôs num
campo de batalha.
■ Os robôs. Programador
não controla seu robô
(durante o jogo)!
15/05/2018 (C) 2018 PeterJandlJr. 11
13. robocode
■ Criador?
■ Onde?
■ Por que?
■ Quando?
2000/2001
■ Mathew Nelson
■ AlphaWorks/IBM
■ Performance de
aplicações Java
■ Competição entre
desenvolvedores
■ Ensino de Programação
15/05/2018 (C) 2018 PeterJandlJr. 13
Mas vem evoluindo
desde então!
14. 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.
15/05/2018 (C) 2018 PeterJandlJr. 14
Isso não é um
tanque!
15. robocode
■ 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.
15/05/2018 (C) 2018 PeterJandlJr. 15
16. robocode
■ O jogador (programador) não
tem influência direta no jogo.
Ele deve escrever algum
código "inteligente" para que o
robô enfrente as batalhas
realizadas em tempo real.
■ 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).
15/05/2018 (C) 2018 PeterJandlJr. 16
18. robocode::componentes
■ Ambiente
– Janela principal com campo de batalha (arena) e
controles.
■ Editor de robôs
– Janela secundária independente com acesso a
ferramentas básicas de desenvolvimento.
■ API (Application Programming Interface) do Robocode
– Documentação dos pacotes, classes, interfaces e
exceções que compõem o sistema.
15/05/2018 (C) 2018 PeterJandlJr. 18
19. robocode::Ambiente
■ 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.
15/05/2018 (C) 2018 PeterJandlJr. 19
23. robô = tanque
■ Componentes:
– Veículo
(base móvel)
– Canhão giratório
– Radar giratório
■ Elementos do tanque têm
movimento
independente.
15/05/2018 (C) 2018 PeterJandlJr. 23
24. 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.
15/05/2018 (C) 2018 PeterJandlJr. 24
Direção absoluta do
robô e direção
relativa ao robô.
25. TANQUE=Robô
PROGRAMÁVEL
■ Os robôs são construídos a partir de uma classe padronizada:
– robocode.Robot
■ Esta classe oferece 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
15/05/2018 (C) 2018 PeterJandlJr. 25
26. TANQUE=Robô
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
15/05/2018 (C) 2018 PeterJandlJr. 26
27. TANQUE=Robô
PROGRAMÁVEL
Controle de Eventos do
Robô
■ onScannedRobot(
ScannedRobotEvent)
detecção de robô
■ onHitByBullet(
HitByBulletEvent)
robô alvejado por tiro
■ onHitByRobot(
HitByBulletEvent)
robô colide com robô
■ onHitWall(
HitWallEvent)
robô colide com parede
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
15/05/2018 (C) 2018 PeterJandlJr. 27
30. batalhas::Criação
■ Batalhas podem ser:
– mano a mano ou
– com múltiplos
oponentes.
■ Duração:
– Um ou
– muitos rounds.
■ Como criar:
– Janela principal
– Battle | New
– Selecione os robôs
que competirão
– Next
– Ajuste número de
rounds, tamanho do
campo de batalha e
outros detalhes.
– Start Battle
15/05/2018 (C) 2018 PeterJandlJr. 30
Quanto mais rounds,
menor é a influência da
sorte no resultado final!
34. 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ô.
15/05/2018 (C) 2018 PeterJandlJr. 34
36. 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.
15/05/2018 (C) 2018 PeterJandlJr. 36
38. 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.
15/05/2018 (C) 2018 PeterJandlJr. 38
40. 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.
15/05/2018 (C) 2018 PeterJandlJr. 40
42. 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.
15/05/2018 (C) 2018 PeterJandlJr. 42
43. 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.
15/05/2018 (C) 2018 PeterJandlJr. 43
45. 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().
15/05/2018 (C) 2018 PeterJandlJr. 45
47. robôs::Criação
■ Editou
■ Salvou
■ Compilou
■ Tá pronto para batalha!
15/05/2018 (C) 2018 PeterJandlJr. 47
Errinhos não
contam!
Robôs criados no
ambiente já estão
disponíveis para novas
batalhas!
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.
15/05/2018 (C) 2018 PeterJandlJr. 49
Também
funciona com o
Netbeans!
50. 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
15/05/2018 (C) 2018 PeterJandlJr. 50
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
15/05/2018 (C) 2018 PeterJandlJr. 51
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
15/05/2018 (C) 2018 PeterJandlJr. 52
54. robôs::Criação com eclipse
■ Editou
■ Salvou
■ Compilação automática
do IDE
■ Tá pronto para batalha!
15/05/2018 (C) 2018 PeterJandlJr. 54
Errinhos
continuam não
contando!
Robôs criados dessa forma também
estão disponíveis para novas
batalhas!
57. 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.
15/05/2018 (C) 2018 PeterJandlJr. 57
59. 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
15/05/2018 (C) 2018 PeterJandlJr. 59
60. robocode::+tecnicalidades
■ Uso extensivo de threads.
– Gerenciador de Batalha [thread de controle central]
■ Controla os robôs e seus disparos.
■ Efetua a renderização dos robôs na arena.
– Robô [thread individual]
■ Cada robô utiliza uma thread independente.
■ Método run() contém a lógica executada pelo robô, ou seja, determina seu
comportamento.
■ Cada robô intercepta e processa seus próprio eventos, utilizando uma fila
de eventos própria.
■ Subsistema de Renderização
– Baseado no Java2D API.
15/05/2018 (C) 2018 PeterJandlJr. 60
61. 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.
15/05/2018 (C) 2018 PeterJandlJr. 61
62. 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
15/05/2018 (C) 2018 PeterJandlJr. 62
65. ◼ 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.
15/05/2018 (C) 2018 PeterJandlJr. 65