Em um mundo desolado e devastado pela guerra, onde as cidades foram invadidas por bandidos e ladrões, a civilização se reinventou na forma de pequenas cooperativas industriais isoladas, espalhadas pela paisagem anteriormente desabitada. A existência dessas comunidades depende de equipes de trabalhadores mercenários chamados "raspadores", que procuram no território indomável materiais valiosos para vender às cooperativas. À medida que esses materiais se tornam mais escassos, a demolição se tornou uma profissão cada vez mais difícil e perigosa. Trabalhadores humanos frágeis foram substituídos principalmente por suportes robóticos remotos, chamados "bots", e um mercenário típico tem mais chances de ser um programador qualificado do que um soldador armado. Como a presença humana na demolição diminuiu, o mesmo aconteceu com o respeito entre os grupos mercenários. Os bots estão equipados não apenas para coletar sucata, mas para defendê-la e, em alguns casos, pegá-la à força. Os programadores de bot trabalham incansavelmente desenvolvendo novas estratégias para ser mais espertas que os scrappers rivais, resultando em bots cada vez mais agressivos e mais um perigo para os humanos que se aventuram fora dos muros de suas comunidades.
(sim, o logotipo é cortado hilário)
Bem-vindo ao Scrappers!
Esta é uma versão inicial do Scrappers, na qual a coleta e as fábricas de sucata não foram implementadas. É basicamente um "tiro neles".
Você é um programador mercenário encarregado de criar um programa para conduzir remotamente seus bots à vitória sobre grupos de scrappers rivais. Seus robôs são máquinas semelhantes a aranhas, que consistem em geradores de energia e blindagem em seu núcleo, cercados por muitos apêndices equipados com instrumentos de preensão, corte e ataque. O gerador de energia é capaz de produzir 12 unidades de energia (pu) por tick (unidade de tempo de um raspador). Você está no controle de como esse poder é distribuído entre as três principais necessidades de um bot: movimento, escudos e poder de fogo.
Os robôs scrapper são máquinas excepcionalmente ágeis e podem se mover facilmente, embaixo e em torno de todos os obstáculos que encontrarem. Portanto, colisão não é algo que seu programa precise levar em consideração. Você é livre para alocar todos, alguns ou nenhum dos 12pu disponíveis para o seu bot para movimento, desde que lide com números inteiros. Alocar 0pu às funções de movimento de um bot o tornaria imóvel. Alocar 2pu permitiria que um bot movesse 2 unidades de distância (du) por tick, 5pu resultaria em 5du / tick, 11pu resultaria em 11du / tick e assim por diante.
Os geradores de escudos de seus robôs projetam uma bolha de energia defletora em torno do corpo. Um escudo pode desviar até 1 de dano antes de aparecer, deixando seu bot exposto até que o gerador de escudo construa energia suficiente para encaixar o escudo de volta no lugar. Você é livre para alocar todos, alguns ou nenhum dos 12pu disponíveis para o seu bot em seu escudo. Alocar 0pu ao escudo de um bot significa que ele nunca irá gerar um escudo. Alocar 2pu permitiria a um bot gerar um novo escudo 2 de 12 ticks, ou uma vez a cada 6 ticks. 5pu resultaria na regeneração do escudo 5 em cada 12 ticks, e assim por diante.
Ao acumular uma carga em seus lasers de solda, seus robôs podem disparar vigas prejudiciais por curtas distâncias com precisão razoável. Como a geração de escudos, a taxa de tiro dos seus bots depende da energia alocada aos seus lasers. Alocar 0pu aos lasers de um bot significa que ele nunca será acionado. Alocar 2pu permitiria que um bot disparasse 2 em cada 12 ticks, e assim por diante. O laser de um bot viajará até encontrar um objeto ou se dispersar na inutilidade, portanto, esteja atento ao fogo amigo. Embora seus bots sejam bastante precisos, eles não são perfeitos. Você deve esperar +/- 2,5 graus de variação na precisão. À medida que o raio laser viaja, suas partículas são gradualmente desviadas pela atmosfera até que o raio se torne efetivamente inofensivo a uma distância suficiente. Um laser causa 1 ponto de dano à queima-roupa e 2,5% menos dano a cada comprimento de bot que viaja.
Os robôs de raspador são autônomos o suficiente para lidar com funções básicas, mas confiam em você, seu programador, para torná-los úteis como um grupo. Como programador, você pode emitir os seguintes comandos para cada bot individual:
- MOVE: Especifique as coordenadas para as quais um bot se moverá.
- ALVO: Identifique um bot para mirar e disparar quando a alocação de energia permitir.
- PODER: Redistribua o poder entre movimento, escudos e poder de fogo.
Detalhes técnicos do jogo
Existem três programas com os quais você precisará se familiarizar. O Game Engine é o levantador pesado e fornece uma API TCP à qual os programas do player se conectam. O programa do player é o que você escreverá, e eu forneci alguns exemplos com binários aqui . Finalmente, o renderizador processa a saída do Game Engine para produzir um GIF da batalha.
O mecanismo de jogo
Você pode baixar o mecanismo de jogo aqui . Quando o jogo é iniciado, ele começa a escutar na porta 50000 (atualmente não configurável) as conexões dos jogadores. Depois de receber duas conexões de jogadores, ele envia a mensagem PRONTA para os jogadores e inicia o jogo. Os programas do player enviam comandos para o jogo por meio da API TCP. Quando o jogo termina, um arquivo JSON chamado scrappers.json (também não está configurável no momento) é criado. É isso que o renderizador usa para criar um GIF do jogo.
A API TCP
Os programas dos jogadores e o mecanismo de jogo se comunicam passando as seqüências JSON terminadas em nova linha para trás e para quarta através de uma conexão TCP. Existem apenas cinco mensagens JSON diferentes que podem ser enviadas ou recebidas.
Mensagem pronta
A mensagem PRONTA é enviada do jogo para os programas do jogador e é enviada apenas uma vez. Esta mensagem informa ao programa do jogador qual é o seu ID de jogador (PID) e fornece uma lista de todos os bots no jogo. O PID é a única maneira de determinar quais Bots são amigáveis contra inimigos. Mais informações nos campos de bot abaixo.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Bot Message
A mensagem BOT é enviada do jogo para os programas dos jogadores e é enviada quando os atributos de um bot são alterados. Por exemplo, quando os escudos são projetados ou a saúde muda, uma mensagem BOT é enviada. O Bot ID (BID) é único apenas dentro de um determinado jogador.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Mover mensagem
A mensagem MOVE é um comando do programa do jogador para o jogo (mas pense nisso como um comando para um bot). Basta identificar o bot que você deseja mover e as coordenadas. Supõe-se que você esteja comandando seu próprio bot, portanto, nenhum PID é necessário.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Mensagem de destino
A mensagem TARGET diz a um de seus bots para segmentar outro bot.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Mensagem de energia
A mensagem POWER realoca o 12pu disponível para o seu bot entre movimento, poder de fogo e escudos.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
A competição
Se você for corajoso o suficiente para explorar as terras indomáveis, participará de um torneio de dupla eliminação contra seus colegas mercenários. Por favor, crie uma resposta para o seu envio e cole seu código ou forneça um link para um repositório git, essência etc. Qualquer idioma é aceitável, mas você deve assumir que eu não sei nada sobre o idioma e incluir instruções para executar seu programa. Crie quantos envios quiser e não se esqueça de dar nomes a eles!
Os programas de amostra de jogadores serão incluídos no torneio, então eu recomendo testar seu bot contra eles. O torneio começará aproximadamente duas semanas após recebermos quatro envios de programas exclusivos. Boa sorte!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Outras informações importantes
- O jogo é executado a 12 ticks / segundo, para que você não receba mensagens com mais frequência do que a cada 83 milissegundos.
- Cada bot tem 60du de diâmetro. O escudo não ocupa espaço adicional. Com uma precisão de +/- 2,5%, as chances de atingir um bot a uma certa distância são representadas por este gráfico:
- A deterioração dos danos do laser ao longo da distância é representada por este gráfico:
- A precisão de um bot e a deterioração do laser se combinam para calcular o dano médio por tiro. Ou seja, o dano médio que um bot causa quando dispara a uma certa distância. O dano por tiro é representado por este gráfico:
- O laser de um bot se origina a meio caminho entre o centro do bot e sua borda. Assim, empilhar seus bots resultará em fogo amigável.
- Os robôs inimigos aparecem aproximadamente 1440du separados.
- O jogo termina se 120 ticks (10 segundos) passarem sem causar nenhum dano.
- O vencedor é o jogador com mais bots e mais saúde quando o jogo termina.
Compreendendo a imagem renderizada
- O jogador 1 é representado por círculos e o jogador 2 por hexágonos.
- A cor de um bot representa sua alocação de energia. Mais vermelho significa que mais energia foi alocada para o disparo. Mais azul significa mais escudo. Mais verde significa mais movimento.
- O "buraco" no corpo de um bot representa dano. Quanto maior o buraco, mais danos serão causados.
- Os círculos brancos em torno de um bot são seu escudo. Se um bot tiver um escudo no final do turno, ele será mostrado. Se o escudo foi estourado ao sofrer danos, ele não é mostrado.
- As linhas vermelhas entre os robôs representam as fotos tiradas.
- Quando um bot é morto, uma grande "explosão" vermelha é mostrada.
fonte
Respostas:
Extremista (Python 3)
Esse bot sempre dedica todo o seu poder a uma coisa: proteger se não estiver protegido, mover-se se estiver fora de posição e disparar de outra forma. Supera todos os robôs de amostra, exceto o prato da morte.
fonte
Menos imprudente ( Go )
Originalmente, planejava modificar levemente o programa de amostra Reckless Abandon para que os bots não disparassem se um bot amigável estivesse no caminho. Acabei com bots que escolhem novos alvos quando um amigo está no caminho, o que acho melhor. Vai vencer os dois primeiros programas.
O código não é perfeito. A lógica para determinar se um tiro é claro usa algumas suposições bastante aleatórias.
Não parece haver um mecanismo para atingir "ninguém". Esse pode ser um bom recurso para adicionar.
A API TCP é legal, pois qualquer idioma pode ser reproduzido, mas também significa muito código padrão. Se eu não estivesse familiarizado com o idioma em que os bots de amostra foram escritos, provavelmente não teria me motivado a brincar com isso. Uma coleção de amostras padrão em vários idiomas seria um ótimo complemento para seus outros repositórios git.
(a maioria do código a seguir é copiar / colar de um dos bots de amostra)
fonte
Trigger Happy - Java 8
Trigger Happy é uma evolução simples do meu bot Bombard original, mas não mais viável. É um bot muito simples que simplesmente dispara sobre o inimigo atualmente alvejado se houver um tiro certeiro, caso contrário, realiza uma caminhada aleatória para tentar chegar a uma posição melhor. O tempo todo tentando ter um escudo.
No entanto, por toda a sua simplicidade, é muito eficaz. E destruirá prontamente os robôs de amostra.
Observe que existem vários bugs no bot, que às vezes disparam mesmo quando não são um tiro certeiro e podem não manter um escudo ... mas ainda é eficaz, basta enviar esta entrada como está
Death-dish vs Trigger Happy
Código da seguinte maneira:
Para compilar: javac TriggerHappy.java
Para executar: java TriggerHappy
fonte