Skip to content
Vinicius Gasparini edited this page Jun 4, 2020 · 2 revisions

Welcome to the top-asteroids-challenge Wiki!

Table of Contents

  1. Sobre Top Asteroids
  2. Gameplay
  3. Campeonato
  4. Como Participar
  5. Regras
  6. Manual Gameplay
  7. Manual Técnico
  8. Instruções Python
  9. Instruções Java
  10. Instruções C++
  11. Built-ins
  12. Submissão
  13. Sistema de Pontuação

Sobre Top Asteroids

Confira o video de demonstração

Video de Divulgação

Top Asteroids é uma competição de Bots (ou IAs) promovida originalmente pela empresa TFG (agora Wild Life).

O jogo utilizado é uma adaptação com batalha do clássico Asteroids, desenhado para fornecer gameplay competitivo e interessante para os bots.

O pacote inicial contem os executáveis do jogo para Windows, OSX e Linux, e a pasta "Bots" onde se encontra a interface para programação dos bots.

Gameplay

Vence a IA que obtiver mais Pontos acumulados durante uma série de partidas. Pontos são obtidos ao destruir outras naves, ou perdidos ao morrer para um asteroid. Olhar seção "Sistema de Pontuação" para maiores detalhes.

Regras

  • O participante tem a opção de escolher uma das 3 linguagens fornecidas
  • O participante pode incluir novos fontes se julgar necessário
  • Para participar, o participante deverá enviar todos fontes necessários para compilar seu bot junto com instruções de como o fazer, até a data limite.

O participante será desqualificado se o bot:

  • Demorar mais de 30 ticks para responder
  • Causar leaks ou exceder a memória (50mb max.)
  • Utilizar mais de 2 threads (contando com a principal)
  • Inviabilizar o andamento das partidas devido a crashes ou hangs
  • Ler ou escrever arquivos
  • Manipular prioridade do processo
  • Utilizar qualquer tipo de conexão (fora a interface disponibilizada)
  • Montar time com outro bot
  • Possuir código indecifrável ou mal escrito
  • Utilizar má fé para adquirir qualquer vantagem

Manual Gameplay

O controle da nave é feito por meio dos thrusters. O Main Thruster é mais potente que faz o movimento pra frente e para traz. Os Side Thrusters servem para rotação quando em sentidos alternados e para movimento lateral quando no mesmo sentido.

O canhão da nave somente atira para frente. Possui 3 níveis de charge, onde quanto mais potente mais rápido.

Constantes Globais

Pode se considerar o movimento da nave como inercial, sem atrito e com colisões elásticas. Nesta tabela estão listados as constantes de gameplay:

Attribute Value
Update Interval 0.05 s (por tick)
Ship Mass 1 kg
Main Thruster Force 30kg*m/s2
Side Thrusters Force (each) 15 kg*m/s2
Side Thruster Offset 2 m
Laser charge time per Slot 0.5 s
Laser Speed Charge 1 25 m/s
Laser Speed Charge 2 50 m/s
Laser Speed Charge 3 75 m/s
Laser Lifetime 3 s
Meteor Speed After Split 8 m/s
Meteor Masses 9 kg, 3 kg, 1 kg
Meteor Radius 4 m, 2 m, 1 m

Observar que tempo dentro da simulação é independente do real. Tempo dentro da simulação pode ser inferido utilizando-se os ticks.

Manual Técnico

Dentro do pacote estamos disponibilizando a interface para implementação dos bots em 3 linguagens diferentes (Python, Java e C++). O participante poderá escolher a linguagem que preferir.

As entidades listadas a seguir possuem representações similares nas 3 linguagens:

GameState Contem toda a representação do estado atual da partida.

Atributos Tipo Descrição
GameState.timestep float Intervalo fixo entre ciclos / ticks do jogo (em segundos)
GameState.tick int Ciclo atual do jogo. Pode pular mais de um valor se bot demorar muito para responder. Cada tick corresponde a aproximadamente 0.05 s na simulação física.
GameState.arenaRadius float Raio da arena
GameState.ships mapa/dict uid:Ship Dicionário contendo todas naves ativas e presentes no jogo
GameState.rocks mapa/dict uid:Rock Dicionário contendo todas pedras ativas e presentes no jogo
GameState.lasers mapa/dict uid:Laser Dicionário contendo todos lasers ativos e presentes no jogo
[Método] GameState.log(String msg) Envia uma mensagem de debug / log para ser mostrada dentro do jogo.

GameObject Contem atributos comuns a todos objetos físicos do jogo.

Atributos Tipo Descrição
GameObject.uid int Identificador único do objeto
GameObject.posx float Posição do objeto
GameObject.posy float Posição do objeto
GameObject.velx float Velocidade do objeto (por segundo)
GameObject.vely float Velocidade do objeto (por segundo)
GameObject.radius float Raio do objeto

Ship : GameObject atributos herdados de GameObject +

Atributos Tipo Descrição
Ship.ang float Direção que nave está apontando
Ship.velang float Velocidade angular da nave (por segundo)
Ship.charge float Força carregada da arma laser
Ship.score int Número de abates

Rock : GameObject somente atributos herdados de GameObject

Laser : GameObject atributos herdados de GameObject +

Atributos Tipo Descrição
Laser.lifetime float Tempo restante para tiro desaparecer (em segundos)
Laser.owner int Uid da nave que atirou o laser

Action Especifica as ações que devem ser executadas pelo bot no próximo tick.

Atributos Tipo Range Descrição
Action.thrust float [-1, 1] Motor principal. Impulsiona pra frente e pra trás.
Action.sideThrustFront float [-1, 1] Motor principal. Impulsiona a parte frontal para esquerda ou direita.
Action.sideThrustBack float [-1, 1] Motor principal. Impulsiona a parte traseira para esquerda ou direita.
Action.shoot int [0, 3] Dá comando referente a arma laser: 0 = carregar, N = atirar laser com força N

Instruções Python

Utilize o fonte localizado em "Bots/python/stupid_bot.py" como exemplo para implementar seu bot.

É permitida a alteração do fonte "bot_interface.py" se julgar necessário.

De maneira geral a classe BotBase deve ser extendida e o método Process(GameState) implementado. Informações referentes a nave do bot encontram-se no próprio objeto. O método deve sempre retornar uma Action.

Para instalar o bot, execute o jogo e através do menu "Install New Bot" configure o comando "python" com argumento "-u ./caminho/do/script.py"

ATENÇÃO: A interface utiliza os pipes std:in, std:out e std:err para realizar a comunicação. Portanto, qualquer chamada que os utilize pode ocasionar causar erros (puts, System.out, cout, etc...).

Utilize GameState.log(mensagem) para mostrar mensagens de log dentro da partida. Todos logs gerados podem ser vistos na pasta Logs.

Instruções Java

Utilize o projeto (da IDE Eclipse) localizado em "Bots/java/JavaBot" como exemplo para implementar seu bot.

É permitida a alteração do pacote "bot_interface" se julgar necessário.

De maneira geral a classe BotBase deve ser estendida e o método Process(GameState) implementado. Informações referentes a nave do bot encontram-se no próprio objeto. O método deve retornar uma Action.

Para compilar, gere um "Jar Executável" com sua classe bot.

Para instalar o bot, execute o jogo e através do menu "Install New Bot" configure o parâmetro comando "java", e argumento "-jar ./caminho/do/jar.jar"

ATENÇÃO: A interface utiliza os pipes std:in, std:out e std:err para realizar a comunicação. Portanto, qualquer chamada que os utilize pode ocasionar causar erros (puts, System.out, cout, etc...).

Utilize GameState.log(mensagem) para mostrar mensagens de log dentro da partida. Todos logs gerados podem ser vistos na pasta Logs.

Instruções C++

Os fontes para compilação encontram-se em "Bots/cpp/StupidBot/StupidBot". Utilize sua IDE favorita para montar o projeto.

É permitida a alteração dos fontes "bot_interface.x" e "BotBase.x" se julgar necessário.

De maneira geral a classe BotBase deve ser estendida e o método Process() implementado. Informações referentes a nave do bot encontram-se no atributo *myShip.

Para configurar a ação utilize os atributos thrust, sideThrustFront, sideThrustBack, shoot.

Lembre-se de alterar o main.cpp para carregar sua classe antes de compilar.

Para instalar o bot, execute o jogo e através do menu "Install New Bot" configure o parâmetro comando "./caminho/ate/executavel"

ATENÇÃO: A interface utiliza os pipes std:in, std:out e std:err para realizar a comunicação. Portanto, qualquer chamada que os utilize pode ocasionar causar erros (puts, System.out, cout, etc...).

Utilize GameState->log(mensagem) para mostrar mensagens de log dentro da partida. Todos logs gerados podem ser vistos na pasta Logs.

Built-ins (apenas Windows e Mac)

Além das interfaces para programação dos bots, o jogo fornece 3 IAs built-ins para o participante testar seus algoritmos.

O easy somente mira no adversário mais próximo e atira. O average faz o mesmo enquanto desvia de ameaças. Já o "Human Bot" permite que o espectador humano controle a nave com AWSD + ESPAÇO .

Sistema de Pontuação

Pontuação das Partidas

É considerado uma "partida" uma série de Matches com um grupo definido e fixo de bots. Cada match dura até sobrar somente um bot vivo ou até final da contagem do tempo máximo.

A classificação é dada ao final da série de acordo com contagem de pontos. Os pontos são acumulados ao longo dos Matches e podem adquiridos ou perdidos das seguintes formas:

  • +1 Ponto : Destruir uma nave com um tiro seu.
  • +1 Ponto : Por nave inimiga destruída por asteroide.
  • -1 Ponto : Ser destruído pelo tiro de um adversário.
  • -N Pontos : Ser destruído por um asteroide. Onde N é o número de naves ainda vivas.

Pontuação do Torneio

Dependendo do número de competidores, os participantes serão divididos em chaves e um sistema de torneio por chaves será utilizados para selecionar os melhores bots, sempre promovendo pelo menos a metade dos bots com mais pontos de cada grupo para a próxima etapa.

Para cada grupo, será rodado exatamente 3 partidas para selecionar os melhores bots do grupo.

Manual adaptado por VGasparini

Originalmente disponível em https://github.com/topfreegames/top-asteroids-challenge/wiki