1. Prof. Ms. Peter Jandl Junior
Aula Aberta
Análise e Desenvolvimento de Sistemas
FATEC JundiaíFATEC Jundiaí
2. Já sabemos queJá sabemos que
Matemática,
Física e
Programação
podem ser
uma mistura
09/09/2016(C) 2016 PeterJandlJr 2
uma mistura
muito
interessante!
4. Build the best, destroy the rest!
09/09/2016 4(C) 2016 PeterJandlJr
5. O que é? Jogo de
programação
Objetivo?
programação
Codificar um robô
de batalha para
competir com
outros robôs num
campo de batalha.
Jogadores?
campo de batalha.
Os robôs.
Programador não
controla seu robô!
09/09/2016 5(C) 2016 PeterJandlJr
6. Criador? Mathew Nelson
Onde?
Por que?
Quando?
AlphaWorks/IBM
Performance de
aplicações Java
Competição entre Quando?
2000/2001
Competição entre
desenvolvedores
Ensino de
Programação
09/09/2016 6(C) 2016 PeterJandlJr
Mas vem evoluindo
desde então!
7. Robôs são tanques, capazes de
movimentar-se; 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.retangular sem entradas ou saídas.
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).
09/09/2016 7(C) 2016 PeterJandlJr
8. Robôs são programados via Java para ataque
e defesa. Pontuam ao longo do combate.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.longo dos diversos rounds da batalha.
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.
09/09/2016 8(C) 2016 PeterJandlJr
10. Ambiente
Janela principal com campo de batalha (arena) e 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.
09/09/2016(C) 2016 PeterJandlJr 10
11. Permite:
Criar, abrir e salvar batalhas; Criar, abrir e salvar batalhas;
Pausar, continuar e finalizar batalhas;
Visualizar estatísticas e destruir qualquer robô.
É possível customizar:
Tamanho da arena 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.
09/09/2016(C) 2016 PeterJandlJr 11
16. Tamanho default do
campo de batalha 800 x 600 pixelscampo 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).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.
09/09/2016(C) 2016 PeterJandlJr 16
18. Acerto +3*energia
Erro -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
09/09/2016(C) 2016 PeterJandlJr 18
19. Uso extensivo de threads.
Gerenciador de Batalha [thread de controle central] 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 Cada robô intercepta e processa seus próprio eventos, utilizando
uma fila de eventos própria.
Subsistema de Renderização
Baseado no Java2D API.
09/09/2016(C) 2016 PeterJandlJr 19
22. Componentes:
Veículo Veículo
(base móvel)
Canhão giratório
Radar giratório
Elementos do
tanque têmtanque têm
movimento
independente.
09/09/2016(C) 2016 PeterJandlJr 22
23. Energia Inicial 100
Velocidade 8 pixels/turn 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, Dados de varredura distância, nome,
velocidade,
heading, bearing
e energia
09/09/2016(C) 2016 PeterJandlJr 23
Direção absoluta
do robô e direção
relativa ao robô.
24. Os robôs são construídos a partir de uma
classe padronizada: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
09/09/2016(C) 2016 PeterJandlJr 24
25. getX() | getY()
coordenada do robô
getWidth () | getHeight()
ahead(double)|back(double)
movimentação
turnRight(double) | getWidth () | getHeight()
dimensões do robô
getHeading() |
getGunHeading() |
getRadarHeading()
direção do robô, do
canhão e do radar
getVelocity()
turnRight(double) |
turnLeft(double)
gira o robô
turnGunRight(double) |
turnGunLeft(double)
gira o canhão
turnRadarRight(double) |
turnRadarLeft(double)
Informações do Robô Ações do Robô
getVelocity()
velocidade do robô
getEnergy()
energia do robô
turnRadarLeft(double)
gira o radar
scan()
varredura por outros robôs
09/09/2016(C) 2016 PeterJandlJr 25
26. onScannedRobot(
ScannedRobotEvent)
detecção de robô
getBattleFieldWidth() |
getBattleFieldHeight()
largura e altura da arenadetecção de robô
onHitByBullet(
HitByBulletEvent)
robô alvejado por tiro
onHitByRobot(
HitByBulletEvent)
robô colide com robô
onHitWall(
largura e altura da arena
getNumRounds()
núm. de rounds da batalha
getRoundNum()
round da batalha
getTime()
tempo batalha
getOthers()
Controle de Eventos do Robô Informações do Ambiente
onHitWall(
HitWallEvent)
robô colide com parede
getOthers()
núm. atual de oponentes
09/09/2016(C) 2016 PeterJandlJr 26
28. Robôs melhores podem ser construídos a partir de
robocode.AdvancedRobot.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. 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.
09/09/2016(C) 2016 PeterJandlJr 28
29. setAhead(double)|
setBack(double)
movimentação para
setTurnRight(double) |
setTurnLeft(double)
gira o robômovimentação para
frente e para trás
setFire(double) |
setFireBullet(double)
dispara o canhão
execute()
executa as ações
agendadas
gira o robô
setTurnGunRight(double)|
setTurnGunLeft(double)
gira o canhão
setTurnRadarRight(double)|
setTurnRadarLeft(double)
gira o radar
Ações Paralelas do Robô Ações Paralelas do Robô
agendadas
waitFor(Condition)
não retorna até a
condição ser alcançada
09/09/2016(C) 2016 PeterJandlJr 29
31. Onde os fracos não tem vez!
09/09/2016(C) 2016 PeterJandlJr 31
32. Batalhas podem
ser:
Como criar:
Janela principalser:
mano a mano ou
com múltiplos
oponentes.
Duração:
Um ou
Janela principal
Battle | New
Selecione os robôs
que competirão
Next
Ajuste número de Um ou
muitos rounds.
Ajuste número de
rounds, tamanho do
campo de batalha e
outros detalhes.
Start Battle
09/09/2016(C) 2016 PeterJandlJr 32
Quanto mais rounds,
menor é a influência da
sorte no resultado final!
34. Na janela
principal:
Escolha um nome:
MFRprincipal:
Robot
Source Editor
Na janela do
editor:
File
MFR
Defina um pacote:
jandl
Edite o código.
File
New
Robot
09/09/2016(C) 2016 PeterJandlJr 34
Aqui começa a diversão!
35. (1) Inicialização
(0) Campos
(2) Loop principal
(1) Inicialização
(3) Varredura
09/09/2016(C) 2016 PeterJandlJr 35
(4) Alvejado por bala
(5) Colisão com parede
36. Área que permite a definição de:
Variáveis e estruturas de dados 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 Elementos declarados nesta área serão
acessíveis em todo código do robô.
09/09/2016(C) 2016 PeterJandlJr 36
38. A inicialização do código de controle do robô
pode ser feita na seção inicial do métodopode 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 cadaexecutado apenas uma vez para cada
instância do robô, ou seja, para determinar
seu estado inicial.
09/09/2016(C) 2016 PeterJandlJr 38
39. (1) Inicialização Este robô(1) Inicialização Este robô
simples não
requer cuidados
especiais.
09/09/2016(C) 2016 PeterJandlJr 39
40. Laço infinito que determina o
comportamento normal do robô, i.e., aquilocomportamento 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.
09/09/2016(C) 2016 PeterJandlJr 40
41. (2) Loop principal Comportamento(2) Loop principal Comportamento
normal do robô.
09/09/2016(C) 2016 PeterJandlJr 41
42. Como consequência da movimentação do
radar (de maneira independente ou por meioradar (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étodopor meio do acionamento do método
onScannedRobot(ScannedRobotEvent).
Isto possibilita estabelecer uma estratégia de
ataque dirigida aos oponente localizados.
09/09/2016(C) 2016 PeterJandlJr 42
44. Como padrão, o canhão e o radar se
movimentam junto com o robô.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.
09/09/2016(C) 2016 PeterJandlJr 44
45. Quando o robô é atingido por um tiro
adversário, é gerado um eventoadversá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.
09/09/2016(C) 2016 PeterJandlJr 45
46. (4) Alvejado por bala Foi localizado?
Melhor fugir!
09/09/2016(C) 2016 PeterJandlJr 46
Melhor fugir!
47. Quando o robô colide com uma das parede
que delimitam o campo de batalha é geradoque 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().método run().
09/09/2016(C) 2016 PeterJandlJr 47
49. Editou
Salvou
Errinhos não
contam! Salvou
Compilou
Tá pronto para
contam!
Tá pronto para
batalha!
09/09/2016(C) 2016 PeterJandlJr 49
Robôs criados no
ambiente já estão
disponíveis para novas
batalhas!
51. IDE provê mais
facilidades para o
1. Criação de
projeto emfacilidades para o
desenvolvimento
de robôs.
Pode ser integrado
ao Robocode, sem
necessidade de
qualquer outro
projeto em
localização
externa ao
Eclipse.
2. Inclusão da API
do Robocode.
3. Ligação comqualquer outro
recurso.
São necessários
três passos.
3. Ligação com
documentação da
API.
09/09/2016(C) 2016 PeterJandlJr 51
52. File | New |
Java ProjectJava Project
Escolha o
Project Name
Desmarque
Use default location
Com Browse
selecione diretórioselecione diretório
robots da instalação
do Robocode
Acione Next
09/09/2016(C) 2016 PeterJandlJr 52
53. Selecione aba
LibrariesLibraries
Com Add External
Jars selecione
arquivo robocode.jar
no diretório libs da
instalação doinstalação do
Robocode
Acione Finish
09/09/2016(C) 2016 PeterJandlJr 53
54. No Package Explorer
abra itemabra item
Referenced Libraries
Selecione arquivo
robocode.jar
Com botão direito
acione Properties
Com o Browse Com o Browse
selecione diretório
javadoc do Robocode
Acione OK
09/09/2016(C) 2016 PeterJandlJr 54
56. Editou
Salvou
Errinhos
continuam não
contando!
Salvou
Compilação
automática do IDE
contando!
Tá pronto para
batalha!
09/09/2016(C) 2016 PeterJandlJr 56
Robôs criados dessa forma
também estão disponíveis para
novas batalhas!
57. Tente criar alguns
robôs combinando os
Estude o código dos
robôs exemplo querobôs combinando os
elementos da API.
Observe o
comportamento do
robô e os resultados
obtidos.
robôs exemplo que
acompanham o
Robocode:
sample.Walls
sample.Tracker
sample.Crazy
Combine suas
robocode.Robot
robocode.AdvancedRobot
INICIANTES JOGADORES
Combine suas
estratégias na forma
de novos robôs.
09/09/2016(C) 2016 PeterJandlJr 57
58. Desenvolva novas
estratégias mais
COMPETIDORES
estratégias mais
sofisticadas.
Simule combates e
analise os resultados.
09/09/2016(C) 2016 PeterJandlJr 58