Introducción
El juego tiene lugar en un mundo pequeño con diferentes ciudades. Los gobernantes de las ciudades se odian y desean gobernar el mundo. La gente se divide en dos grupos, guerreros y nacidos bajos. Sin embargo, los nacidos bajos pueden elevarse a guerreros. Eres el gobernante de tres de estas ciudades.
Jugabilidad
Cuando comienza el juego, gobiernas tres ciudades. En cada pueblo hay 100 personas. Tienes que dividirlos en caballeros y nacidos bajos.
Entonces comienza el juego real, que se basa en turnos. Un turno se ve así: "Produce" knights
=> execute command of first town
=> execute command of next town
(repetir para todas las ciudades) => try a rebellion
.
- Cada turno, se invocará su programa para cada ciudad que le pertenezca . Puedes atacar una ciudad , apoyar a una ciudad o simplemente esperar . Estas acciones se ejecutarán secuencialmente, no simultáneamente.
- Cada tercer turno, obtienes un caballero por 2 nacidos bajos (23 nacidos bajos => 11 caballeros). La cantidad de nacidos bajos permanece igual.
- Los caballeros dentro de una ciudad tienen una bonificación de defensa de 1.2. Si te atacan, tus caballeros se multiplicarán por este número (por ejemplo
78 knights
, tienes, tendrás93 knights
durante el ataque). Después del ataque, se eliminarán los caballeros adicionales (si82 knights
sobrevives, aún tendrás78 knights
). - En un ataque, cada caballero mata a un enemigo antes de morir. Por ejemplo:
30 knights
ataque100 knights
(sin bonificación de defensa) => 70 caballeros sobreviven. - Puedes capturar una ciudad matando a todos los caballeros dentro de ella . Todos los nacidos bajos te pertenecen ahora y tus caballeros sobrevivientes están estacionados en la ciudad. En la siguiente ronda, puedes gobernar esta ciudad además de todas tus otras ciudades .
- Después de capturar una ciudad, no tendrá una bonificación de defensa durante 2 turnos completos (porque las puertas están rotas). En el tercer turno, las puertas serán reparadas.
- Para evitar que los nacidos bajos se rebelen, necesitas al menos la mitad de los caballeros que los bajos (23 nacidos bajos en una ciudad necesitan al menos 12 caballeros en la misma ciudad). De lo contrario, los nacidos bajos matarán a todos los caballeros y la ciudad se volverá "neutral" (sin un líder, indicado por un ID de jugador
-1
). - Las ciudades neutrales "producirán" caballeros, pero no atacarán ni apoyarán a ninguna otra ciudad.
Sintaxis
El controlador le proporciona entrada a través de argumentos de comando, su programa tiene que salir a través de stdout.
Salida (preparación)
Antes de que comience el juego, el controlador invoca su presentación sin argumentos. Esto significa que tienes que distribuir a tus 100 personas (para cada ciudad) en caballeros y nacidos bajos. Necesita salida KnightCount KnightCount KnightCount
, por ejemplo 95 80 95
.
Entrada
Round;YourPlayerId;YourTownId;PlayerId_TownId_knights_lowborns;PlayerId_TownId_knights_lowborns;...
En la primera ronda, esto será algo así
1;2;2;0_0_100_0;1_1_50_50;2_2_80_20
. Aquí, ves que es la primera ronda, eres el jugador 2 en la ciudad 2. Tienes 80 caballeros y 20 nacidos bajos.
Más adelante en el juego, podría ser algo así 20;2;1;0_0_100_0;2_1_30_50;2_2_40_20
. Todavía eres el jugador 2 (esto nunca cambia), pero capturaste la ciudad 1 (que estás controlando en este momento).
Salida
A TownId NumberOfKnights
o S TownId NumberOfKnights
o W
(para esperar).
Ejemplo: A 2 100
(atacar la ciudad 2 con 100 caballeros) o S 3 2
(apoyar la ciudad 3 con 2 caballeros).
Reglas
- Los bots no deben escribirse para vencer o admitir otros bots específicos.
- Se permite escribir en archivos. Escribe a " yoursubmissionname .txt", la carpeta se vaciará antes de que comience el juego. Otros recursos externos están prohibidos.
- Su envío tiene 1 segundo para responder (por ciudad).
- Proporcione comandos para compilar y ejecutar sus envíos.
Victorioso
El ganador es el que tiene más ciudades después de 100 rondas. Si un jugador captura todas las ciudades, el juego se detiene y gana. Si varios jugadores tienen la misma cantidad de ciudades, la cantidad de caballeros contará, luego la cantidad de nacidos bajos.
Controlador
Puedes encontrar el controlador en github. También contiene 2 samplebots, escritos en Java. Ábralo en Eclipse, coloque los bots compilados en la carpeta raíz y agregue una clase al programa de control (al igual que los robots de muestra).
Resultados
Para los resultados finales, corrí 10 juegos. Este es el promedio:
Ciudades del jugador 1. Liberator 37.5 2. Sehtimianer 8.2 3. SuperProducer 5.4 4. Sleeper 1.4 5. Frankenstein 1.2 6. Mantequilla 0.8 (más caballeros) 7. TheKing 0.8 (menos caballeros) 8. Éxodo 0.6 9. Tortuga 0.5 (más caballeros) 10. AttackOn3 0.5 (menos caballeros) 11. Democracia 0.3 12. CalculatedFail 0.2 13. Revolucionario 0.1
Puedes leer un juego de muestra aquí: juego de muestra en github
fuente
A
apoya a otra ciudadB
, el número dado de caballeros simplemente se transfiere deA
aB
, después de lo cual son controlados por el propietario deB
, ¿correcto?Respuestas:
Python3, Libertador
El único objetivo de este bot es liberar a las personas más comunes del yugo opresivo de la tiranía.
fuente
Python 2, el rey
El Rey gobierna la ciudad con el mayor número de su imperio y exige que todos los caballeros en exceso le sean enviados desde otras ciudades bajo su control. Cuando tenga suficientes caballeros, atacará una ciudad enemiga. No es un rey muy inteligente, por lo que no ha estudiado historia ni comprende las consecuencias de sus acciones.
Esto no se ha probado con el controlador u otros bots.
fuente
He is not a very smart King, so has not studied history or understands the consequences of his actions.
Javascript (Nodo), Imperio
Comienza fuerte para asustar a otras ciudades. Las ciudades intentan trabajar juntas para capturar a otros. Prioriza la captura de ciudades con muchos nacidos bajos.
Ejecutar: nodo imperio
fuente
knights - lowborns/2
, pero si tienes 30 caballeros y 90 nacidos bajos, esto no funciona. Por favor arregle sugetAttackers()
función.DEBUG
bandera en el controlador que estaba causando que se tragara errores incluso con laGAME_MESSAGES
bandera establecida en verdadero. Siento que todavía podía utilizar algún trabajo en mi estrategia, especialmente con Liberator ahora en la escena, pero con la última edición no veo ningún error cuando ejecuto mis pruebas conDEBUG
elJava, Frankenstein
Al intentar encontrar una manera de destruir Liberator, un pequeño error se deslizó en mi código. El código luego comenzó a destruir la competencia. Después de agregar Democracia y reorganizar a los jugadores, comenzó a fallar. Estudiando el código intenté encontrar su estrategia. En consecuencia, se hizo el siguiente código. Tiende a atacar y destruir al mejor jugador. Después de que los mejores jugadores son destruidos, esto destruye fácilmente al resto.
Aquí está el jugador original:
fuente
Java, tortuga
Gracias a TheBestOne por los métodos principales, acabo de cambiar el algoritmo (espero que esté bien). Este bot básicamente mejora su ciudad mejor defendida para rivalizar con la ciudad enemiga más peligrosa, mientras mantiene suficientes caballeros para evitar la rebelión en sus otras ciudades.
Compilar:
javac Turtle.java
Correr:
java Turtle
fuente
dangerousEnemyTown = dangerousEnemyTown.knightCount() >= town.knightCount() ? dangerousEnemyTown : town;
dangerousEnemyTown = bestDefendedTown.knightCount() >= town.knightCount() ? bestDefendedTown : town;
Java 8, político
Actúa como un verdadero político. Lástima que Crasher todavía lo mate.
Compilar:
javac Politician.java
Correr:
java Politician
fuente
lie
método demasiado comúnJava 8, mantequilla
Se extiende lo más uniformemente posible. Asfixia una ciudad si la ciudad es lo suficientemente pequeña.
Compilar:
javac Butter.java
Correr:
java Butter
fuente
Java, revolucionario
Una última, todavía basada en los métodos básicos de TheBestOne. Este bot intenta incitar rebeliones en cada ciudad, ya que el jugador neutral es inofensivo, matando a una cierta cantidad de caballeros en relación con la población de bajo nacimiento. Por supuesto, no atacará al jugador neutral.
Compilar:
javac Revolutionist.java
Correr:
java Revolutionist
fuente
JAVA, Sehtimianer
Gracias de nuevo a TheBestOne, también copié sus métodos principales; ) Esta es la primera vez que juego KingOfTheHill-CodeGame, así que espero haber hecho todo bien. Presento con orgullo a los Sehtimianers: D
Los Sehtimianers intentan ser superiores en todo el juego y terminarlo al final. Espero que mi bot no lo haga tan mal :)
fuente
Java, éxodo
Una vez más, basado en los métodos principales de TheBestOne. Este bot migra de pueblo en pueblo una vez que ha alcanzado un cierto nivel de población de caballeros, indiscriminadamente de su dueño, y repite este proceso hasta que haya convertido el mundo entero.
Compilar:
javac Exodus.java
Correr:
java Exodus
fuente
Pitón 2, Democracia
Este rey no es rey. Es algo moderno. Es el rey de las personas . Es democracia. Es lento, poco eficiente, y cuando hace algo, lo hace mal.
Ejecutar
python2 democracy.py
. Tenga en cuenta que la democracia requiere Python 2 .Editar: se corrigió un error sobre la impresión del objeto de la ciudad
fuente
<__main__.Town
.C ++ 11, CalculatedFail
Después de probar algunas cosas con el pequeño Java que conozco y no pude lograr lo que quería, elijo volver a escribirlo en C ++ y agregar el manejo de archivos. El problema era que mi C ++ está bastante oxidado y no mucho mejor, por lo que algunas partes están unidas y son la primera solución en Google, por lo que no es un código de calidad ...
Aún así, pude obtener un resultado que al menos funciona que no es tan malo, gana al menos ocasionalmente, pero no puedo probarlo perfectamente porque no puedo ejecutar todas las otras presentaciones en esta PC. Probablemente volveré a escribir la orientación por completo y la agregaré como otra respuesta más tarde hoy o mañana.
compilar con:
g++ -std=c++11 CalculatedFail.cpp -o CalculatedFail.exe
google dice en linux que es CalculatedFail.out en lugar del .exe, pero no puedo probarlo.
y correr
CalculatedFail.exe
Como utiliza un archivo para verificar la bonificación de definición, ejecutar el juego simultáneamente varias veces puede provocar errores ...
espero que funcione correctamente sin demasiados problemas
fuente
Java, Illuminati
Leí esto y sabía que nunca sería capaz de idear una estrategia viable, así que decidí interpretar a los lagartos lamentablemente subrepresentados que pueden o no gobernarnos. En lugar de pelear con los otros bots, este los obliga a cooperar, solo para abandonarlos al final. Este bot, de hecho, no deja ningún daño permanente.
fuente
Java, Superproductor
Es tarde en mi parte del mundo, así que no tengo tiempo suficiente para elaborar mi presentación. Lo haré, planearé explicar cómo funciona más adelante.
El rendimiento del bot parece altamente dependiente del orden de inicio que gana algunas veces ...
Tenía algunas ideas para ayudar a aumentar las rondas ganadoras ... pero fuera de tiempo: P
Compilar: javac SuperProducer.java
Ejecutar: java moogiesoft.SuperProducer
fuente
C ++ 11, attackOn3
el código en sí no se volvió mucho más bonito, pero ahora utilizo otra forma de apuntar, posiblemente agregaré comentarios al código más adelante.
parece estar bien con los bots que estoy ejecutando, aunque todavía es difícil contra frankenstein y liberator y no puede ganar de manera consistente.
compilar con:
g++ -std=c++11 attackOn3.cpp -o attackOn3.exe
y ejecutar
attackOn3.exe
fuente