Introdução
Neste jogo, os jogadores usam seus exércitos para combater os exércitos de outros jogadores, capturar territórios e se tornar o último homem de pé. A cada turno, os jogadores recebem um número base de exércitos para usar à sua disposição. Ao capturar territórios em certas regiões, no entanto, os jogadores podem aumentar esse número para dar a eles uma vantagem potencial mais tarde no jogo. (Isso é essencialmente o mesmo que o Warlight ).
Todos os bots devem ser escritos em Java, C ou C ++ (eu incluiria outras linguagens, mas não possui o software ou a experiência para elas). Não é necessário que o seu envio estenda uma classe e você pode criar funções, classes, interfaces ou o que for necessário e usar qualquer pacote ou classe nas APIs padrão . Se você planeja criar uma classe ou interface, considere usar uma classe interna ou interface interna.
Por favor, não tente alterar programaticamente o controlador ou outros envios nesta competição.
Jogabilidade
Visão geral
Uma matriz bidimensional de 10x10 simulará o quadro, cada elemento / célula representando um "território". Serão 20 rodadas e até 1000 turnos por rodada. A cada turno, os jogadores primeiro desdobram os exércitos que eles têm para qualquer um dos territórios que possuem e, em seguida, têm a oportunidade de transportar seus exércitos para territórios próximos, na tentativa de capturar os territórios de seus oponentes, atacando os exércitos neles. Os jogadores devem implantar todos os seus exércitos, mas eles não precisam movê-los, se desejar.
Exércitos de ataque / transferência
Se o jogador desejar, ele / ela pode enviar exércitos de um território para qualquer um dos oito adjacentes. O tabuleiro "envolve", ou seja, se o território de um jogador estiver de um lado, os exércitos dele poderão ser transferidos para um território adjacente do outro lado. Ao mover exércitos de um território, ainda deve haver pelo menos um exército nesse território. Por exemplo, se um território contiver cinco exércitos, não mais que quatro poderão ser movidos para um território diferente; se um território contém um, esse exército não pode se mover.
Se um jogador envia n
exércitos de um território para outro de sua propriedade, esse território receberá n
exércitos.
Digamos que um jogador envie n
exércitos de seu território para um território oposto com o
exércitos. o
diminuirá n * .6
arredondado para o número inteiro mais próximo; no entanto, ao mesmo tempo, n
diminuirá o * .7
arredondado para o número inteiro mais próximo. Serão aplicadas as seguintes regras que tratam da captura ou não do território oposto:
- Se
o
chegar a zero En
for maior que 0, o jogador assumirá o território, que terán
exércitos. - Se ambos
n
eo
se tornarem zero,o
será automaticamente definido como 1 e o território não será capturado. - Se
o
permanecer maior que 0, o número de exércitos no território do jogador aumentarán
e o território oposto não será capturado.
Bónus
Um grupo de territórios será escolhido para representar um bônus; se um jogador possuir todos os territórios que fazem parte do grupo, ele receberá uma quantidade extra de exércitos por turno.
Os bônus têm números de identificação para indicar valores e valores diferentes que representam o número extra de exércitos que um jogador pode receber. A cada rodada, o valor de um bônus será um número aleatório entre 5 e 10, inclusive, e dez bônus estarão disponíveis no campo, cada um com dez territórios incluídos no bônus.
Por exemplo, se um jogador que recebe 5 exércitos por turno possui todos os territórios que compõem um bônus com um valor de 8, o jogador receberá 13 exércitos no próximo turno e nos turnos subsequentes. Se, no entanto, o jogador perder um ou mais territórios que compõem o bônus, ele receberá apenas 5 exércitos por turno.
Entrada / Saída
Seu programa deve receber entrada por meio de argumentos de linha de comando, que terão o seguinte formato:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
earmies
são ambos números inteiros.id
é seu ID earmies
é o número de exércitos que você precisa implantar em seus territórios. Você deve implantar todos os exércitos que lhe foram dados - nem mais nem menos.territories
é uma série de cadeias que representam os territórios que você possui e os territórios que você não possui e que são adjacentes aos seus. As strings estão neste formato:[row],[col],[bonus id],[player id],[armies]
row
ecol
indique a linha e coluna do tabuleiro onde o território se encontra,bonus id
é o id do bônus do qual esse território faz parte,player id
é o id do jogador que é o proprietário do território earmies
é o número de exércitos contidos no território. Estes são todos os números.bonuses
é uma série de strings que representam os bônus no quadro que você pode aproveitar. As strings estão neste formato:[id],[armies],[territories left]
id
é o ID do bônus,armies
é o número de exércitos extras que você pode receber por possuir todos os territórios desse bônus eterritories left
é o número de territórios no bônus que você precisa capturar para receber os exércitos extras.
Observe que um quinto argumento, um "X", aparecerá se for o primeiro turno de uma rodada e puder ser usado por razões de conveniência.
Um exemplo de entrada no primeiro turno:
0 5 "7,6,7,-1,2 8,7,7,-1,2 7,7,7,0,5 6,6,7,-1,2 8,8,9,-1,2 6,7,7,-1,2 7,8,9,-1,2 6,8,9,-1,2 8,6,7,-1,2" "0,5,10 1,5,10 2,9,10 3,9,10 4,9,10 5,5,10 6,5,10 7,6,9 8,7,10 9,7,10" X
Seu programa deve gerar duas cadeias separadas por uma nova linha, a primeira lista as linhas e colunas dos territórios aos quais você deseja adicionar exércitos e o número de exércitos que você deseja adicionar a ele, e a segunda lista as linhas e colunas dos territórios para os quais você deseja enviar exércitos e o número de exércitos para os quais deseja enviar. A saída pode conter espaços à direita.
Para especificar um território ao qual você deseja adicionar exércitos, sua saída deve seguir este formato:
[row],[col],[armies]
row
e col
são a linha e a coluna do quadro onde está o território ao qual você deseja adicionar exércitos e armies
é o número de exércitos que você deseja adicionar ao território.
Para especificar para quais territórios você deseja enviar exércitos, sua saída deve seguir este formato:
[srow],[scol],[drow],[dcol],[armies]
srow
e scol
são a linha e a coluna do quadro de onde é o território do qual você deseja transportar exércitos drow
e dcol
são a linha e a coluna do quadro para o qual o território para o qual você deseja enviar exércitos e armies
é o número de exércitos que você deseja enviar . Observe que se você não deseja mover exércitos, seu programa deve imprimir um espaço.
Uma saída de amostra pode ser esta:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
Nesse caso, o jogador envia cinco exércitos para o território em 0,0 e move três exércitos de 0,0 para 0,1; três de 0,0 a 1,0; e três de 0,0 a 1,1.
Rodadas e voltas
No início de cada rodada, todos os jogadores receberão um território localizado em um local aleatório no tabuleiro (é possível que dois ou mais jogadores iniciem um ao lado do outro). Os territórios que compõem um bônus também podem mudar.
No primeiro turno, cada jogador terá um território contendo cinco exércitos e eles receberão cinco exércitos que poderão usar (este é o mínimo que podem receber). Todos os outros territórios serão de propriedade de NPCs que não atacam; cada um deles contém dois exércitos e tem um ID de -1
.
A cada turno, seu programa será executado e as duas partes da saída serão coletadas. O controlador aplicará a primeira parte da saída, adicionando exércitos aos territórios, imediatamente; no entanto, o controlador aguardará até que todos os jogadores tenham dado sua segunda parte de saída, seus comandos de ataque / transferência. Uma vez concluído, os comandos serão embaralhados aleatoriamente e, em seguida, executados. Seu programa deve fornecer saída e terminar em um segundo ou menos para participar do turno.
Pontuação e Vencimento
Para qualquer rodada, se um jogador permanecer, ele ganhará 100 pontos. Caso contrário, se passar 1000 turnos e ainda houver vários jogadores, os 100 pontos serão divididos igualmente entre os jogadores restantes (ou seja, 3 jogadores restantes renderão 33 pontos cada). Qualquer jogador que tiver mais pontos no final das 20 rodadas vencerá.
Submissões
Sua postagem deve incluir um nome para o bot, o idioma em que está escrito, uma breve descrição e o código usado para executá-lo. Um exemplo de bot será postado aqui como exemplo e será usado no concurso. Você pode enviar quantas desejar.
De outros
Seu programa pode criar, gravar e ler de um arquivo, desde que o nome do arquivo seja o mesmo que você usou para o envio. Esses arquivos serão excluídos antes do início de um torneio, mas não entre as rodadas.
Seu turno será pulado se:
- você é eliminado (não tem territórios);
- seu programa não imprime nada;
- seu programa não termina dentro de um segundo;
- você desdobra muito poucos exércitos em seus territórios (desdobrar exércitos em territórios que você não possui contará para isso) ou muitos exércitos; ou
- sua saída faz com que o controlador lance uma exceção.
Seu comando de ataque / transferência não será executado se:
- seu programa não fornece a saída correta;
- você escolhe um território para retirar exércitos que não é seu;
- você move zero ou um número negativo de exércitos do seu território;
- você move exércitos demais do seu território; ou
- você escolhe um território para o qual enviar exércitos que não seja adjacente ao território do qual escolheu mover exércitos.
Você pode encontrar o controlador e um exemplo de bot aqui . O bot participará do jogo, mas provavelmente não vencerá nenhuma rodada (a menos que tenha muita sorte).
Resultados
Executando o controlador depois de corrigir um bug, o WeSwarm continua sendo uma força a ser reconhecida. Vai demorar um bot com uma ótima estratégia para ter uma chance contra ele.
As of 25-08-15, 04:40 UTC
1: WeSwarm 1420
2: java Player 120
java LandGrab 120
java Hermit 120
java Castler 120
6: java RandomHalver 80
Aviso prévio!
Foi corrigido um bug descoberto por Zsw que fazia territórios que desdobravam seus exércitos após outros terem uma vantagem potencial no jogo. Uma edição foi enviada ao controlador, portanto, use a versão existente encontrada usando o link acima.
fonte
Respostas:
Castler - Java 8
Ele só quer fazer um castelo quadrado ... e, se deixado por conta própria, fará exatamente isso. Embora ele fique entediado com um pequeno castelo, o torna cada vez maior. Isso inevitavelmente significará conflito com outros jogadores e, portanto, a batalha se seguirá. No entanto, ele nunca esquece sua forma mais desejada ... o quadrado.
Clique na imagem para gif animado (15 meg) de uma simulação completa de 20x 1000 voltas. Castler marcou 1700 e os outros jogadores marcaram 100 cada.
fonte
Eremita - Java
Apenas continua adicionando seus exércitos à mesma cidade. Eu não acho que pode ser derrubado sem obter exércitos bônus.
fonte
WeSwarm - C ++ 11 [v2.2]
Atualizado para a v2.2 em 25 de agosto de 2015.
v2.2 - ajustado devido a uma mudança na maneira como o controlador relata exércitos.
v2.1 - A TNT estava tendo problemas para compilar meu código, então parei de usá-lo
stoi
.v2.0 - um refator de código junto com algumas correções de bugs.
Bem-vindo ao enxame. Nossa força está em números. Nossa vontade eterna é coletar todos os seus bônus para maximizar nossos desova. Não fique no nosso caminho, para que você não fique sobrecarregado. Não tente nos derrotar, pois cada um que você matar, mais três acontecerão. Você pode nos forçar a fazer sacrifícios, mas nunca nos forçará a nos render!
Gif Animado
Arquivado:
v2.1: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEU3lkNzVoTUpRTG8
v1.0: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEVzZUUlFydXo2T00
fonte
stoi
não ter sido resolvido, apesar de ter o C ++ 11. Houve problemas consistentes com a solução , que ainda preciso descobrir como fazer, então você poderia fornecer uma solução alternativa que não seja usadastoi
?LandGrab - Java
Quanto mais terra, melhor. Alveja territórios exclusivamente livres, se houver, e, com os exércitos restantes, começa a construir e derrubar o inimigo uma peça de cada vez.
fonte
Halver aleatório - Java 8
Um bot muito simples que simplesmente move metade de seus exércitos em cada território para um território vizinho aleatório. Não importa se o vizinho é amigo ou inimigo ...
Embora não possa competir com Castler, surpreendentemente se sai bem contra o jogador e outros bots.
fonte