Vamos jogar Kick The Can!
Embora Moogie seja o atual vencedor, se alguém puder ganhar sua coroa, é incentivado a fazê-lo
Chutar a lata é um jogo infantil. Envolvendo um defensor e vários atacantes. Hoje não é mais esse jogo! Seu trabalho é escrever um bot que o interprete, para ganhar, no estilo rei da colina !
https://en.wikipedia.org/wiki/Kick_the_can
Existem algumas diferenças importantes neste jogo. A primeira diferença principal é que o jogo é multiplayer (5v5). A segunda diferença principal é que ambos os conjuntos de bots podem matar e eliminar jogadores inimigos com minas e bombas lançadas! Bots não podem ver minas (independentemente da distância) ou jogadores a mais de cinco quarteirões de distância!
O mapa é um labirinto da seguinte maneira.
Este labirinto é processualmente gerado pela criação de um labirinto usando um algoritmo de retorno regressivo recursivo em profundidade. E, em seguida, colocando os orifícios mostrados (além de tornar o labirinto mais "imperfeito". O labirinto tem 65x65 blocos de largura e zero indexado. Assim, a bandeira azul (lata) está em 1,1 e a bandeira vermelha (lata) é em 63,63 O time azul gera em 2,2 e 3,3 4,4 etc. o time vermelho gera em 62,62 e 61,61, 60,60 etc. Os blocos em ciano são bots no time azul e os blocos em magenta são bots vermelhos.O jogo é sempre cinco versus cinco. Cada bot da equipe usará seu código (mas poderá armazenar outras variáveis de instância (ou criar arquivos locais) para acompanhar o estado e diferenciar funções.
Jogabilidade
As minas podem ser colocadas como você pode ver em cinza. E as bombas podem ser lançadas a uma distância máxima de até quatro blocos. Eles viajam por até quatro quarteirões através das paredes e outros jogadores matam apenas os inimigos que estão no seu caminho. Após cada passo, eles têm 40% de chance de cair. Portanto, eles têm 100% de chance de 1 alcance 60% a 2 alcance 36% a 3 alcance e 21,6% a três distâncias Colocar uma mina ou lançar uma bomba requer munição de uma equipe. Isso começa em 0 e pode ser aumentado coletando as caixas laranja. Observe que quatro (4) desses caches de munição serão convenientemente centralizados. Os Bots estão alinhados em uma matriz de dois vermelhos e dois azuis. IE RRRRRBBBBB. O manuseio da bandeira é permitido, mas cuidado com o fato de estar perto da bandeira (ou seja, menos de cinco quarteirões) resulta em lentidão e apenas permite movimento. a cada três turnos. A Arena escolhe uma partida aleatória para cada turno. EU.
Objetivo
Programe seus cinco bots (cada um tem o mesmo arquivo de classe) para navegar com sucesso no labirinto e tocar na lata oposta, tomando cuidado para não derrubar acidentalmente a própria lata ou pisar em uma mina.
Programação
As entradas arena e bot estão atualmente em Java, no entanto, existe um wrapper stdin / out para outros idiomas.
O código da arena será disponibilizado, mas aqui estão os detalhes relevantes.
Bot Class
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Principais métodos disponíveis
Observe que o uso de qualquer técnica para modificar ou acessar dados aos quais você geralmente não deve ter acesso não é permitido e resultará em desqualificação.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Especificação da interface do wrapper StdIn / Out
A interface consiste em dois modos: inicialização e execução.
Durante o modo de inicialização, um único quadro INIT é enviado via stdout. A especificação desse quadro é a seguinte:
INIT
{Team Membership Id}
{Game Map}
TINI
Onde: {Team Membership Id} é um caractere único: R ou B. B significa time azul, R significa time vermelho.
{Mapa do Jogo} é uma série de linhas de caracteres ascii que representam uma linha do mapa. Os seguintes caracteres ascii são válidos: F = bandeira azul G = bandeira vermelha O = espaço aberto W = parede
O jogo continuará enviando quadros de jogos por stdout para cada bot da seguinte forma:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Onde:
{Munição} é uma sequência de dígitos, o valor será 0 ou maior {Alive Bot Count} é uma sequência de dígitos, o valor será 0 ou maior {Caixa X} é uma sequência de dígitos que representa a coordenada X do bot no mapa do jogo. O valor será 0 <= X <Largura do mapa. {Caixa Y} é uma sequência de dígitos que representa a coordenada Y do bot no mapa do jogo. O valor será 0 <= Y <Altura do mapa. {Mapa local} é uma série de linhas de caracteres ascii que representam o mapa inteiro ao redor do bot. Os seguintes caracteres ascii são válidos: F = bandeira azul G = bandeira vermelha O = espaço aberto W = parede R = bot vermelho do time B = bot azul do time M = mina A = munição
O controlador espera que seu bot produza (para stdout) uma resposta de linha única no formato:
{Action},{Direction}
Onde:
{Ação} é um dos seguintes: Move Defuse Mine Throw
{Direction} é um dígito único entre 0 e 4, inclusive. (consulte as informações de direção anteriormente)
NOTA: todas as strings serão delimitadas por \ n final de linha.Este será um torneio de eliminação. Meus bots de amostra participarão como preenchedores, mas não vou me premiar. No caso de uma vitória de um dos meus bots, o título passa para o segundo membro e continuará até que exista um bot que não seja meu. Cada partida consiste em 11 rodadas de chute na lata. Se nenhuma das equipes venceu uma única partida, ambas serão eliminadas. Se houver um empate com pontuação diferente de zero, será disputada uma partida de desempate. Se um empate permanecer, ambos serão eliminados. As rodadas posteriores podem consistir em mais partidas. A propagação do torneio será baseada no número de upvotes a partir de 31/07/16 (data sujeita a alteração).
Cada partida dura 4096 turnos. Uma vitória concede um ponto. Um empate ou perda concede zero pontos. Boa sorte!
Fique à vontade para olhar o código ou criticá-lo neste repositório do GitHub.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Observe que não tenho intérpretes para muitos idiomas no meu computador e posso precisar de voluntários para executar a simulação no computador. Ou posso baixar o intérprete de idioma. Por favor, verifique se seus bots.
- Responda em um período de tempo razoável (digamos 250 ms)
- Não danificará minha máquina host
fonte
Respostas:
NavPointBot, Java 8
Bot é branco / azul
Este bot nomeia um líder de bots amigáveis em cada quadro que atribuirá pontos de navegação para cada bot para navegar.
Inicialmente, todos os bots estão no depósito de munição para encontrar serviço, então dois bots são designados como guardas, com o restante procurando por munição e atacando a bandeira inimiga.
Descobri que o jogo depende muito da localização inicial dos depósitos. Como tal, não posso realmente dizer que este bot é melhor que qualquer outro.
Correr com
java NavPointBot
fonte
Pathfinder otimizado JAVA
Agradeço ao @Moogie por me ajudar a otimizar minha localização desarrumada. Aqui está a fonte do bot. Esse cara sabe o quanto é importante defender sua bandeira. Ele aloca três defensores e dois atacantes. Os defensores ficam para trás e defendem / coletam munição, os dois atacantes seguem um caminho (bastante reto) até a bandeira (e colhem a munição no meio). Ele atira em quem vê, e deve ser uma competição feroz. Os defensores colocam minas ao redor da bandeira e acampam até que não haja mais oposição para que possam ir e chutar a lata.
fonte