Introdução
O jogo se passa em um mundo pequeno, com diferentes cidades. Os governantes das cidades se odeiam e gostariam de governar o mundo. As pessoas são divididas em dois grupos, guerreiros e nascidos baixos. No entanto, nascidos baixos podem criar guerreiros. Você é o governante de três dessas cidades.
Jogabilidade
Quando o jogo começa, você governa três cidades. Em cada cidade, existem 100 pessoas. Você tem que dividi-los em cavaleiros e nascidos baixos.
Então o jogo atual começa, que é baseado em turnos. Uma curva fica assim: "Produce" knights
=> execute command of first town
=> execute command of next town
(repita para todas as cidades) => try a rebellion
.
- A cada turno, seu programa será chamado para cada cidade que pertence a você . Você pode atacar uma cidade , apoiar uma cidade ou simplesmente esperar . Essas ações serão executadas sequencialmente, não simultaneamente.
- A cada terceiro turno, você recebe um cavaleiro por 2 nascidos baixos (23 nascidos baixos => 11 cavaleiros). A quantidade de nascidos baixos permanece a mesma.
- Cavaleiros dentro de uma cidade têm um bônus de defesa de 1,2. Se você for atacado, seus cavaleiros serão multiplicados por esse número (por exemplo
78 knights
, você o terá93 knights
durante o ataque). Após o ataque, os cavaleiros extras serão removidos (se82 knights
sobreviver, você ainda terá78 knights
). - Em um ataque, cada cavaleiro mata um inimigo antes que ele morra. Por exemplo:
30 knights
ataque100 knights
(sem bônus de defesa) => 70 cavaleiros sobrevivem. - Você pode capturar uma cidade matando todos os cavaleiros dentro dela . Todos os nascidos de baixa idade pertencem a você agora e seus cavaleiros sobreviventes estão estacionados na cidade. Na próxima rodada, você pode governar esta cidade, além de todas as suas outras cidades .
- Depois que uma cidade é capturada, ela não recebe bônus de defesa por 2 turnos completos (porque os portões estão quebrados). No terceiro turno, os portões serão reparados.
- Para impedir que os recém-nascidos se rebelem, você precisa de pelo menos metade do número de cavaleiros que existem (23 nascidos-baixos em uma cidade precisam de pelo menos 12 cavaleiros na mesma cidade). Caso contrário, os nascidos baixos matarão todos os cavaleiros e a cidade se tornará "neutra" (sem um líder, indicado por um PlayerId
-1
). - Cidades neutras "produzirão" cavaleiros, mas não atacarão nem apoiarão nenhuma outra cidade.
Sintaxe
O controlador fornece entrada através de argumentos de comando, seu programa deve ser enviado via stdout.
Saída (preparação)
Antes do jogo começar, o controlador invoca sua submissão sem argumentos. Isso significa que você deve distribuir suas 100 pessoas (para cada cidade) em cavaleiros e nascidos baixos. Você precisa produzir KnightCount KnightCount KnightCount
, por exemplo 95 80 95
.
Entrada
Round;YourPlayerId;YourTownId;PlayerId_TownId_knights_lowborns;PlayerId_TownId_knights_lowborns;...
Na primeira rodada, isso será algo como
1;2;2;0_0_100_0;1_1_50_50;2_2_80_20
. Aqui, você vê que é a primeira rodada, você é o jogador 2 da cidade 2. Você tem 80 cavaleiros e 20 nascidos baixos.
Mais tarde no jogo, poderia ser algo parecido 20;2;1;0_0_100_0;2_1_30_50;2_2_40_20
. Você ainda é o jogador 2 (isso nunca muda), mas capturou a cidade 1 (que você está controlando agora).
Saída
A TownId NumberOfKnights
ou S TownId NumberOfKnights
ou W
(em espera).
Exemplo: A 2 100
(cidade de ataque 2 com 100 cavaleiros) ou S 3 2
(cidade de apoio 3 com 2 cavaleiros).
Regras
- Os bots não devem ser escritos para vencer ou suportar outros bots específicos.
- A gravação em arquivos é permitida. Por favor escreva para "nome da sua submissão .txt", a pasta será esvaziada antes do início do jogo. Outros recursos externos não são permitidos.
- Seu envio tem 1 segundo para responder (por cidade).
- Forneça comandos para compilar e executar seus envios.
Ganhando
O vencedor é aquele com mais cidades após 100 rodadas. Se um jogador captura todas as cidades, o jogo para e ele vence. Se vários jogadores tiverem a mesma quantidade de cidades, a quantidade de cavaleiros contará, e a quantidade de nascidos baixos.
Controlador
Você pode encontrar o controlador no github. Ele também contém 2 samplebots, escritos em Java. Abra-o no Eclipse, coloque os bots compilados na pasta raiz e adicione uma classe ao programa de controle (como os samplebots).
Resultados
Para os resultados finais, corri 10 jogos. Esta é a média:
Cidades dos Jogadores 1. Libertador 37.5 2. Sehtimianer 8.2 3. SuperProducer 5.4 4. Dormitório 1.4 5. Frankenstein 1.2 6. Manteiga 0.8 (mais cavaleiros) 7. TheKing 0.8 (menos cavaleiros) 8. Êxodo 0.6 9. Tartaruga 0.5 (mais cavaleiros) 10. AttackOn3 0.5 (menos cavaleiros) 11. Democracia 0.3 12. CalculatedFail 0.2 13. Revolucionário 0.1
Você pode ler um exemplo de jogo aqui: exemplo de jogo no github
fonte
A
apóia outra cidadeB
, o número determinado de cavaleiros é simplesmente transferido deA
paraB
, após o qual eles são controlados pelo proprietárioB
, correto?Respostas:
Python3, Liberator
O único objetivo deste bot é libertar as pessoas mais comuns do jugo opressivo da tirania.
fonte
Python 2, O Rei
O rei governa a cidade com o maior número de seu império e exige que todos os cavaleiros em excesso sejam enviados a ele de outras cidades sob seu controle. Quando ele tiver cavaleiros suficientes, ele atacará uma cidade inimiga. Ele não é um rei muito inteligente, por isso não estudou história nem entende as consequências de suas ações.
Isso não foi testado com o controlador ou outros bots.
fonte
He is not a very smart King, so has not studied history or understands the consequences of his actions.
Javascript (Nó), Império
Começa forte para assustar outras cidades. As cidades tentam trabalhar juntas para capturar outras. Prioriza a captura de cidades com muitos nascidos baixos.
Executar: império do nó
fonte
knights - lowborns/2
, mas se você tem 30 cavaleiros e 90 nascidos baixos, isso não funciona. Corrija suagetAttackers()
função.DEBUG
bandeira no controlador que estava causando engolir erros, mesmo com aGAME_MESSAGES
bandeira definida como verdadeira. Eu sinto que ainda poderia usar algum trabalho em minha estratégia, especialmente com o Liberator agora em cena, mas com a edição mais recente não vejo erros quando executo meus testes comDEBUG
onJava, Frankenstein
Ao tentar encontrar uma maneira de destruir o Liberator, um pequeno erro entrou no meu código. O código então começou a destruir a competição. Depois de adicionar a democracia e reorganizar os jogadores, começou a falhar. Estudando o código, tentei encontrar sua estratégia. Conseqüentemente, o código a seguir foi criado. Tende a atacar e destruir o melhor jogador. Depois que os melhores jogadores são destruídos, isso destrói facilmente o resto.
Aqui está o jogador original:
fonte
Java, Tartaruga
Graças ao TheBestOne pelos métodos principais, mudei o algoritmo (espero que esteja tudo bem). Esse bot basicamente aprimora sua cidade melhor defendida para rivalizar com a cidade inimiga mais perigosa, mantendo cavaleiros suficientes para impedir a rebelião em suas outras cidades.
Compilar:
javac Turtle.java
Corre:
java Turtle
fonte
dangerousEnemyTown = dangerousEnemyTown.knightCount() >= town.knightCount() ? dangerousEnemyTown : town;
não quis dizerdangerousEnemyTown = bestDefendedTown.knightCount() >= town.knightCount() ? bestDefendedTown : town;
Java 8, Político
Atua como um verdadeiro político. Pena que Crasher ainda o mata.
Compilar:
javac Politician.java
Corre:
java Politician
fonte
lie
método muito comumJava 8, Manteiga
Se espalha o mais uniformemente possível. Sufoca uma cidade se a cidade for suficientemente pequena.
Compilar:
javac Butter.java
Corre:
java Butter
fonte
Java, Revolucionário
Um último, ainda baseado nos métodos principais do TheBestOne. Esse bot tenta incitar rebeliões em todas as cidades, já que o jogador Neutro é inofensivo, matando uma certa quantidade de cavaleiros em relação à população de recém-nascidos. É claro que não atacará o jogador Neutro.
Compilar:
javac Revolutionist.java
Corre:
java Revolutionist
fonte
JAVA, Sehtimianer
Mais uma vez obrigado ao TheBestOne, também copiei seus métodos principais; ) Esta é minha primeira vez jogando um KingOfTheHill-CodeGame, então espero ter feito tudo certo. Apresento orgulhosamente os Sehtimianers: D
Os Sehtimianers tentam ser superiores durante todo o jogo e terminá-lo no final. Espero que meu bot não seja tão ruim :)
fonte
Java, Êxodo
Mais uma vez, com base nos métodos principais do TheBestOne. Esse bot migra de cidade em cidade depois de atingir um certo nível de população de cavaleiros, indiscriminadamente de seu proprietário, e repete esse processo até converter o mundo inteiro.
Compilar:
javac Exodus.java
Corre:
java Exodus
fonte
Python 2, Democracia
Este rei não é rei. É algo moderno. É o rei das pessoas . É democracia. É lento, ineficiente e, quando faz algo, faz errado.
Corra
python2 democracy.py
. Observe que a democracia requer Python 2 .Edit: Corrigido o erro sobre a impressão do objeto da cidade
fonte
<__main__.Town
.C ++ 11, CalculatedFail
Depois de experimentar algumas coisas com o pouco Java que conheço e não conseguir atingir o que queria, escolhi reescrevê-lo em C ++ e adicionar manipulação de arquivos. o problema era que meu C ++ é bastante enferrujado e não muito melhor, então algumas partes são batidas juntas e apenas a primeira solução no google, portanto, não é realmente um código de qualidade ...
Ainda assim, eu consegui um resultado pelo menos funcional que não é muito ruim, vence pelo menos ocasionalmente, mas não posso testá-lo perfeitamente porque não consigo executar todos os outros envios neste pc. Provavelmente reescreverei a segmentação por completo e a adicionarei como outra resposta mais tarde, hoje ou amanhã.
ajuntar com:
g++ -std=c++11 CalculatedFail.cpp -o CalculatedFail.exe
O Google diz que no Linux é CalculatedFail.out em vez do .exe, mas não posso testá-lo.
e corra
CalculatedFail.exe
como ele usa um arquivo para verificar o bônus de def, executar o jogo simultaneamente várias vezes pode levar a erros ...
espero que funcione corretamente sem muitos problemas
fonte
Illuminati Java
Eu li isso e sabia que nunca seria capaz de apresentar uma estratégia viável, então decidi interpretar as pessoas-lagarto lamentavelmente sub-representadas que podem ou não nos governar. Em vez de lutar com os outros bots, este os força a cooperar, apenas para abandoná-los no final. De fato, este bot não deixa nenhum dano permanente.
fonte
Java, SuperProducer
Já é tarde na minha parte do mundo, então não tenho tempo suficiente para elaborar minha submissão. Planejarei elaborar sobre como isso funciona mais tarde.
O desempenho do bot parece altamente dependente da ordem de partida que ganha algumas vezes ...
Eu tive algumas idéias para ajudar a aumentar as rodadas vencedoras ... mas perdi o tempo: P
Compilar: javac SuperProducer.java
Execute: java moogiesoft.SuperProducer
fonte
C ++ 11, attackOn3
o código em si não ficou muito mais bonito, mas agora eu uso outra maneira de segmentar, possivelmente adicionarei comentários ao código posteriormente.
parece estar bem com os bots que estou executando, embora ainda seja difícil contra frankenstein e libertador e não consiga vencer de forma consistente.
compile com:
g++ -std=c++11 attackOn3.cpp -o attackOn3.exe
e execute
attackOn3.exe
fonte