-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Welcome to the top-asteroids-challenge Wiki!
- Sobre Top Asteroids
- Gameplay
- Campeonato
- Como Participar
- Regras
- Manual Gameplay
- Manual Técnico
- Instruções Python
- Instruções Java
- Instruções C++
- Built-ins
- Submissão
- Sistema de Pontuaçã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.
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.
- 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
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.
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 |
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.
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.
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.
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 .
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