revisitando o robocode
TRANSCRIPT
Prof. Ms. Peter Jandl JuniorAula Aberta
Análise e Desenvolvimento de SistemasFATEC JundiaíFATEC Jundiaí
Já sabemos queJá sabemos queMatemática,Física eProgramaçãopodem seruma mistura
09/09/2016(C) 2016 PeterJandlJr 2
uma misturamuitointeressante!
09/09/2016(C) 2016 PeterJandlJr 3
Build the best, destroy the rest!
09/09/2016 4(C) 2016 PeterJandlJr
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
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!
Robôs são tanques, capazes de
movimentar-se; movimentar-se;
localizar adversários; e
atirar!
Robôs são dispostos aleatoriamente emum 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
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
ArenaArena
Robôs
Controles
09/09/2016(C) 2016 PeterJandlJr 9
Robôs
Controles
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
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
Editor de Código Integrado
09/09/2016(C) 2016 PeterJandlJr 12
Documentação padronizada de todos os elementos da API.
09/09/2016(C) 2016 PeterJandlJr 13
Detalhes. Sempre os detalhes.
09/09/2016(C) 2016 PeterJandlJr 14
09/09/2016(C) 2016 PeterJandlJr 15
Tamanho default docampo 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
Norte é 0°
09/09/2016(C) 2016 PeterJandlJr 17
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 +1009/09/2016(C) 2016 PeterJandlJr 18
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
Muitos detalhes?
09/09/2016(C) 2016 PeterJandlJr 20
09/09/2016(C) 2016 PeterJandlJr 21
Componentes: Veículo Veículo
(base móvel)
Canhão giratório
Radar giratório
Elementos do tanque têm tanque têm movimento independente.
09/09/2016(C) 2016 PeterJandlJr 22
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, bearinge energia
09/09/2016(C) 2016 PeterJandlJr 23
Direção absoluta do robô e direção relativa ao robô.
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
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
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
09/09/2016(C) 2016 PeterJandlJr 27
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
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
09/09/2016(C) 2016 PeterJandlJr 30
Onde os fracos não tem vez!
09/09/2016(C) 2016 PeterJandlJr 31
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!
Destroy then all!
09/09/2016(C) 2016 PeterJandlJr 33
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!
(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
Á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
Sem campos neste primeiro robô.
(0) Campos
09/09/2016(C) 2016 PeterJandlJr 37
A inicialização do código de controle do robô pode ser feita na seção inicial do método 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 executado apenas uma vez para cada instância do robô, ou seja, para determinar seu estado inicial.
09/09/2016(C) 2016 PeterJandlJr 38
(1) Inicialização Este robô (1) Inicialização Este robô simples não requer cuidados especiais.
09/09/2016(C) 2016 PeterJandlJr 39
Laço infinito que determina o comportamento normal do robô, i.e., aquilo 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.
09/09/2016(C) 2016 PeterJandlJr 40
(2) Loop principal Comportamento (2) Loop principal Comportamento normal do robô.
09/09/2016(C) 2016 PeterJandlJr 41
Como consequência da movimentação do radar (de maneira independente ou por meio 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 por 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
(3) Varredura Localizou oponente?Fogo nele!
09/09/2016(C) 2016 PeterJandlJr 43
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
Quando o robô é atingido por um tiro adversário, é gerado um evento 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.
09/09/2016(C) 2016 PeterJandlJr 45
(4) Alvejado por bala Foi localizado?Melhor fugir!
09/09/2016(C) 2016 PeterJandlJr 46
Melhor fugir!
Quando o robô colide com uma das parede que delimitam o campo de batalha é gerado 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().método run().
09/09/2016(C) 2016 PeterJandlJr 47
09/09/2016(C) 2016 PeterJandlJr 48
(5) Colisão com parede Parede?Marcha-a-ré!
Editou
SalvouErrinhos 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!
09/09/2016(C) 2016 PeterJandlJr 50
IDE provê mais facilidades para o
1. Criação de projeto em facilidades 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 com qualquer outro recurso.
São necessários três passos.
3. Ligação com documentação da API.
09/09/2016(C) 2016 PeterJandlJr 51
File | New |Java ProjectJava Project
Escolha oProject Name
DesmarqueUse default location
Com Browseselecione diretório selecione diretório robots da instalação do Robocode
Acione Next
09/09/2016(C) 2016 PeterJandlJr 52
Selecione aba LibrariesLibraries
Com Add ExternalJars selecione arquivo robocode.jarno diretório libs da instalação do instalação do Robocode
Acione Finish
09/09/2016(C) 2016 PeterJandlJr 53
No Package Explorerabra itemabra itemReferenced Libraries
Selecione arquivo robocode.jar
Com botão direito acione Properties
Com o BrowseCom o Browseselecione diretório javadoc do Robocode
Acione OK
09/09/2016(C) 2016 PeterJandlJr 54
Editor de código avançado
09/09/2016(C) 2016 PeterJandlJr 55
Documentação integrada da API
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!
Tente criar alguns robôs combinando os
Estude o código dos robôs exemplo que robô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
Desenvolva novas estratégias mais
COMPETIDORES
estratégias mais sofisticadas.
Simule combates e analise os resultados.
09/09/2016(C) 2016 PeterJandlJr 58
09/09/2016(C) 2016 PeterJandlJr 59
Homehttp://robocode.sourceforge.net/http://robocode.sourceforge.net/
Downloadhttps://sourceforge.net/projects/robocode/files/
Documentação OnLinehttp://robocode.sourceforge.net/docs/robocode/
Wikihttp://robowiki.net/wiki/RobocodeWikihttp://robowiki.net/wiki/Robocode
Artigoshttp://robocode.sourceforge.net/developerWorks.php
09/09/2016(C) 2016 PeterJandlJr 60
09/09/2016(C) 2016 PeterJandlJr 61
Prof. Peter Jandl JuniorProf. Peter Jandl Junior
http://tecnopode.blogspot.com.br
09/09/2016(C) 2016 PeterJandlJr 62