Você é um ponto empreendedor que deseja aumentar a terra sob seu controle. Isso é bastante simples - viaje para fora de sua terra atual e retorne à sua terra e tudo nesse loop agora é de sua propriedade. Mas há um porém. Se algum outro ponto encontrar seu laço e cruzá-lo, você morre.
Se você ainda não experimentou, acesse o Splix.io e experimente um jogo. Use as setas do teclado para controlar seu movimento.
GIF
Crédito: http://splix.io/
Específicos
Todos os jogadores começam em posições aleatórias em um tabuleiro de 200x200. (Eu me reservo o direito de alterar isso :). Você terá uma certa quantidade de movimentos para acumular o maior número de pontos possível. Os pontos são computados por:
- O número de jogadores que você matou vezes 300
- A quantidade de terreno que você possui no final da rodada
Isso mostra que outras pessoas podem roubar sua terra. Se eles iniciarem um loop que cruza parte de sua terra, eles podem reivindicá-lo. Se você morrer durante a rodada, você perde todos os pontos dessa rodada.
Cada rodada tem um grupo de jogadores selecionados aleatoriamente (no máximo 5 jogadores únicos) (sujeito a alterações). Todo jogador participa de um número igual de rodadas. A pontuação final do seu bot é determinada pela pontuação média por jogo. Cada jogo consiste em 2000 turnos (também sujeitos a alterações). Todos os bots fazem seus movimentos ao mesmo tempo.
Casos de morte
Cabeça Butt
Ambos os jogadores morrem quando se enfrentam. Isso ainda é verdade mesmo quando os dois jogadores estão no limite de seu espaço.
No entanto, quando apenas um dos jogadores está em sua terra, o outro jogador morre.
Linha Cruzada
Nesse caso, apenas o jogador roxo morre.
Você não pode cruzar sua própria linha.
Saindo do quadro
Se um jogador tentar sair do tabuleiro, ele morrerá e perderá todos os pontos.
Área de captura
Um jogador capturará a área quando tiver uma trilha e ele entra em sua própria terra novamente.
O vermelho preenche as duas linhas vermelhas. O único caso em que um jogador não preenche é quando outro jogador está dentro do loop. Para deixar claro, isso só se aplica quando o outro jogador está no circuito, e não apenas terras pertencentes a ele. Um jogador pode capturar terras de outra pessoa. Se um jogador não puder preencher a área cercada por sua trilha, a trilha será convertida diretamente em terreno normal. Se o jogador dentro de outro loop terrestre de jogadores morre, a área nesse loop é preenchida. Toda vez que um jogador morre, o tabuleiro é reexaminado para uma área que pode ser preenchida.
Detalhes do controlador
O controlador está aqui . É muito semelhante ao jogo original, mas foram feitas pequenas alterações para torná-lo um melhor ajuste para o KotH e por razões técnicas. Ele é construído com @NathanMerrill 's biblioteca KotHComm , e com ajuda substancial de @NathanMerrill também. Informe-me de todos os bugs encontrados no controlador na sala de bate-papo . Para ser consistente com o KotHComm, usei coleções Eclipse em todo o controlador, mas os bots podem ser gravados usando apenas a biblioteca Java Collections.
Tudo é empacotado em um uberjar na página de lançamentos do github . Para usá-lo, baixe-o e anexe-o ao seu projeto para que você possa usá-lo para o preenchimento automático (instruções para IntelliJ , Eclipse ). Para testar seus envios, execute o jar com java -jar SplixKoTH-all.jar -d path\to\submissions\folder
. Verifique se path\to\submissions\folder
possui uma subpasta chamada java
e coloque todos os seus arquivos lá. Não use nomes de pacotes em seus bots (embora isso seja possível com o KotHComm, é apenas um pouco mais problemático). Para ver todas as opções, use --help
. Para carregar todos os bots, use --question-id 126815
.
Escrevendo um bot
Para começar a escrever um bot, você deve estender SplixPlayer
.
Direction makeMove(ReadOnlyGame game, ReadOnlyBoard board)
- É aqui que você decide qual jogada deseja que seu bot faça. Não deve retornar nulo.
HiddenPlayer getThisHidden()
- Obtenha a
HiddenPlayer
versão dothis
. Útil para comparar seu bot ao quadro.
- Obtenha a
enum Direction
- Valores
East
(x = 1; y = 0)West
(x = -1; y = 0)North
(x = 0; y = 1)South
(x = 0; y = -1)
Direction leftTurn()
- Consiga o
Direction
que conseguiria se fizesse uma curva à esquerda.
- Consiga o
Direction RightTurn()
- Consiga o
Direction
que conseguiria se fizesse uma curva à direita.
- Consiga o
ReadOnlyBoard
Esta é a turma em que você acessa o quadro. Você pode obter uma visão local (20x20) do tabuleiro com as posições dos jogadores mostradas ou uma visão global (o tabuleiro inteiro) com apenas as informações de quem possui e reivindica posições no tabuleiro. É também aqui que você obtém sua posição.
SquareRegion getBounds()
- Recupere o tamanho do quadro.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getGlobal()
- Obtenha um mapa global do quadro.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getView()
- O mesmo que
getGlobal()
, exceto que ele é limitado a uma área de 20x20 em torno do seu jogador e mostra as posições do jogador.
- O mesmo que
Point2D getPosition(SplixPlayer me)
- Obtenha a posição do seu jogador. Use como
board.getPosition(this)
.
- Obtenha a posição do seu jogador. Use como
Point2D getSelfPosition(ReadOnlyBoard)
- Coloque sua posição no quadro. Uso:
Point2D mypos = getSelfPosition(board)
- Coloque sua posição no quadro. Uso:
ReadOnlyGame
ReadOnlyGame
apenas fornece acesso ao número de turnos restantes no jogo int getRemainingIterations()
.
ReadOnlySplixPoint
HiddenPlayer getClaimer()
- Obtenha a
HiddenPlayer
versão de quem está reivindicando um ponto - reivindicando = uma trilha.
- Obtenha a
HiddenPlayer getOwner()
- Veja quem possui um ponto.
HiddenPlayer getWhosOnSpot()
- Se o player estiver posicionado nesse ponto, retorne a versão oculta. Só funciona em
getLocal()
.
- Se o player estiver posicionado nesse ponto, retorne a versão oculta. Só funciona em
Point2D
Ao contrário das outras classes aqui, Point2D
está contido na biblioteca KotHComm.com.nmerrill.kothcomm.game.maps.Point2D
Point2D(int x, int y)
int getX()
int getY()
Point2D moveX(int x)
Point2D moveY(int y)
Point2D wrapX(int maxX)
- Quebra o
x
valor para estar dentro do intervalo demaxX
.
- Quebra o
Point2D wrapY(int maxY)
- Quebra o
y
valor para estar dentro do intervalo demaxY
.
- Quebra o
int cartesianDistance(Point2D other)
- Isso se traduz em quantas voltas levaria para um jogador passar do ponto a para o ponto b.
Suporte para Clojure
O compilador Clojure é fornecido com o SplixKoTH-all.jar
, assim você pode usar o Clojure para o seu bot! Consulte o meu random_bot
para ver como usá-lo.
Depurando um bot
O controlador vem com um depurador para ajudar a testar estratégias. Para iniciá-lo, execute o jar com a --gui
opção
Para anexar o depurador ao seu jar, siga estas instruções para IntelliJ ou estas para Eclipse (versão do Eclipse não testada).
Se você estiver usando um depurador com seu código, poderá usar isso para ajudar a visualizar o que seu bot está vendo. Defina um ponto de interrupção no início do makeMove
seu bot e verifique se ele pausa apenas o segmento atual. Em seguida, clique no botão Iniciar na interface do usuário e passe pelo seu código.
Agora, para juntar tudo:
Executando bots
Para executar seus bots com outras pessoas, você precisa executar o jar na página de lançamentos. Aqui está uma lista de sinalizadores:
--iterations
(-i
) <=int
(padrão500
)- Especifique o número de jogos a serem executados.
--test-bot
(-t
) <=String
- Execute apenas os jogos nos quais o bot está incluído.
--directory
(-d
) <= Caminho- O diretório para executar envios. Use isso para executar seus bots. Verifique se seus bots estão em uma subpasta do caminho nomeado
java
.
- O diretório para executar envios. Use isso para executar seus bots. Verifique se seus bots estão em uma subpasta do caminho nomeado
--question-id
(-q
) <=int
(apenas uso126815
)- Faça o download e compile os outros envios do site.
--random-seed
(-r
) <=int
(o padrão é um número aleatório)- Dê uma semente ao corredor para que os bots que usam aleatoriamente possam ter resultados reproduzidos.
--gui
(-g
)- Execute a interface do usuário do depurador em vez de executar um torneio. Melhor usado com
--test-bot
.
- Execute a interface do usuário do depurador em vez de executar um torneio. Melhor usado com
--multi-thread
(-m
) <=boolean
(padrãotrue
)- Execute um tournoment no modo multithread. Isso permite um resultado mais rápido se o seu computador tiver vários núcleos.
--thread-count
(-c
) <=int
(padrão4
)- Número de threads a serem executados se o multithread for permitido.
--help
(-h
)- Imprima uma mensagem de ajuda semelhante a esta.
Para executar todos os envios nesta página, use java -jar SplixKoTH-all.jar -q 126815
.
Formatando sua postagem
Para garantir que o controlador possa baixar todos os bots, você deve seguir este formato.
[BotName], Java // this is a header
// any explanation you want
[BotName].java // filename, in the codeblock
[code]
Além disso, não use uma declaração de pacote.
Placar
+------+--------------+-----------+
| Rank | Name | Score |
+------+--------------+-----------+
| 1 | ImNotACoward | 8940444.0 |
| 2 | TrapBot | 257328.0 |
| 3 | HunterBot | 218382.0 |
+------+--------------+-----------+
Informe-me se alguma parte das regras não está clara ou se você encontrar algum erro no controlador na sala de bate - papo .
Diverta-se!
fonte
Respostas:
ImNotACoward, Java
Este bot é um especialista em sobrevivência
covarde. Se não houver inimigo por perto, ele reivindica uma parte da terra. Se o loop de outro jogador puder ser alcançado com segurança, eleapunhala o outro jogador pelas costas e oenvolve em um duelo. Se o outro jogador não puder ser atacado com segurança, elefogerealiza um retiro estratégico para sua própria terra.fonte
TrapBot, Java
Este é talvez o bot mais simples. Tudo o que faz é traçar a borda do tabuleiro, dobrando-se para reduzir o risco de ser morto.
fonte
random_bot, Clojure
Isto é RandomBot , mas eu tive que me ater às convenções de nomenclatura e alguns problemas me impedem de usar o hífen no nome, para ressaltar o reinado! O
make-move
fn retorna um vec com o primeiro item sendo o queDirection
você deseja mudar e o segundo sendo o estado que você deseja que seja devolvido no próximo turno. Não use átomos externos, pois esse código pode estar executando vários jogos em paralelo.fonte
HunterBot, Java
Um dos bots mais básicos. Ele procura pontos no tabuleiro para matar outras pessoas e seguirá o caminho mais curto possível para chegar a uma posição de matança. Se estiver fora do seu território, ele fará movimentos aleatórios até ter outra abertura para matar outro jogador. Ele tem alguma lógica para impedir que ele se atropele, e quando todos os outros jogadores estão mortos, ele volta para sua casa. Uma vez em casa, ele entra em uma pequena praça.
fonte