Introducción
En este juego, los jugadores usan sus ejércitos para luchar contra los ejércitos de otros jugadores, capturar territorios y convertirse en el último hombre en pie. Cada turno, los jugadores reciben un número base de ejércitos para usar a su disposición. Sin embargo, al capturar territorios en ciertas regiones, los jugadores pueden aumentar este número para darles una ventaja potencial más adelante en el juego. (Esto es esencialmente lo mismo que Warlight ).
Todos los bots deben estar escritos en Java, C o C ++ (incluiría otros lenguajes pero no tengo el software o la experiencia para ellos). No es necesario que su envío extienda una clase, y puede crear funciones, clases, interfaces o cualquier otra cosa que sea necesaria, y usar cualquier paquete o clase en las API estándar . Si planea crear una clase o interfaz, considere usar una clase interna o interfaz interna.
No intente alterar programáticamente el controlador u otras presentaciones en esta competencia.
Como se Juega
Visión general
Una matriz bidimensional de 10x10 simulará el tablero, cada elemento / celda representa un "territorio". Habrá 20 rondas y hasta 1000 vueltas por ronda. Cada turno, los jugadores desplegarán primero los ejércitos que tienen en cualquiera de los territorios que poseen, y luego se les dará la oportunidad de transportar sus ejércitos a territorios cercanos en un intento de capturar los territorios de sus oponentes atacando a los ejércitos en ellos. Los jugadores deben desplegar todos sus ejércitos, pero no tienen que moverlos si lo desean.
Atacar / transferir ejércitos
Si el jugador lo desea, puede enviar ejércitos desde un territorio a cualquiera de los ocho adyacentes. El tablero "se envuelve", es decir, si el territorio de un jugador está en un lado, los ejércitos pueden transferirse a un territorio adyacente en el otro lado. Cuando se mueven ejércitos de un territorio, aún debe quedar al menos un ejército en ese territorio. Por ejemplo, si un territorio contiene cinco ejércitos, no se pueden mover más de cuatro a un territorio diferente; si un territorio contiene uno, ese ejército no puede moverse.
Si un jugador envía n
ejércitos de un territorio a otro que posee, ese territorio recibirá n
ejércitos.
Digamos que un jugador envía n
ejércitos desde su territorio a un territorio contrario con o
ejércitos en él. o
disminuirá en n * .6
redondeado al entero más cercano; sin embargo, al mismo tiempo, n
disminuirá en o * .7
redondeado al entero más cercano. Se aplicarán las siguientes reglas que tratan sobre si el territorio contrario ha sido capturado o no:
- Si
o
llega a cero Yn
es mayor que 0, el jugador se hará cargo del territorio, que tendrán
ejércitos. - Si ambos
n
y seo
convierten en cero,o
se establecerá automáticamente en 1 y el territorio no se capturará. - Si
o
permanece mayor que 0, el número de ejércitos en el territorio del jugador aumentará enn
y el territorio contrario no será capturado.
Bonos
Se elegirá un grupo de territorios para representar una bonificación; Si un jugador posee todos los territorios que forman parte del grupo, ese jugador recibirá una cantidad adicional de ejércitos por turno.
Los bonos tienen números de identificación para denotar diferentes y valores que representan la cantidad adicional de ejércitos que un jugador puede recibir. Cada ronda, el valor de un bono será un número aleatorio entre 5 y 10, inclusive, y habrá diez bonos disponibles en el campo, cada uno con diez territorios incluidos en el bono.
Por ejemplo, si un jugador que recibe 5 ejércitos por turno posee todos los territorios que conforman un bono con un valor de 8, el jugador recibirá 13 ejércitos el próximo turno y los turnos posteriores. Sin embargo, si el jugador pierde uno o más de los territorios que componen la bonificación, recibirá solo 5 ejércitos por turno.
De entrada y salida
Su programa debe recibir información a través de argumentos de línea de comandos, que tendrán el siguiente formato:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
yarmies
son ambos números enteros.id
es su identificación yarmies
es la cantidad de ejércitos que necesita desplegar en sus territorios. Debes desplegar todos los ejércitos que te han dado, ni más ni menos.territories
es una serie de cadenas que representan los territorios que posee y los territorios que no posee que son adyacentes al suyo. Las cadenas están en este formato:[row],[col],[bonus id],[player id],[armies]
row
ecol
indique la fila y la columna del tablero donde está el territorio,bonus id
es la identificación del bono del que forma parte este territorio,player id
es la identificación del jugador que posee el territorio yarmies
es el número de ejércitos contenidos en el territorio. Estos son todos los números.bonuses
es una serie de cadenas que representan los bonos en el tablero que puede aprovechar. Las cadenas están en este formato:[id],[armies],[territories left]
id
es la identificación de la bonificación,armies
es la cantidad de ejércitos adicionales que puede recibir al poseer todos los territorios en esta bonificación, yterritories left
es la cantidad de territorios en la bonificación que necesita capturar para recibir los ejércitos adicionales.
Tenga en cuenta que aparecerá un quinto argumento, una "X", si es la primera vuelta de una ronda y puede usarse por razones de conveniencia.
Un ejemplo de entrada en el primer 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
Su programa debe generar dos cadenas separadas por una nueva línea, la primera de las cuales enumera las filas y columnas de los territorios a los que desea agregar ejércitos y la cantidad de ejércitos que desea agregar, y la segunda de las cuales enumera las filas y columnas de los territorios a los que desea enviar ejércitos y la cantidad de ejércitos que desea enviar. La salida puede contener espacios finales.
Para especificar un territorio al que desea agregar ejércitos, su salida debe seguir este formato:
[row],[col],[armies]
row
y col
son la fila y la columna del tablero donde está el territorio al que desea agregar ejércitos, y armies
es el número de ejércitos que desea agregar al territorio.
Para especificar a qué territorios desea enviar ejércitos, su salida debe seguir este formato:
[srow],[scol],[drow],[dcol],[armies]
srow
y scol
son la fila y la columna del tablero desde donde se encuentra el territorio desde el cual quieres transportar ejércitos, drow
y dcol
son la fila y la columna del tablero hacia donde está el territorio al que quieres enviar ejércitos, y armies
es el número de ejércitos que deseas enviar . Tenga en cuenta que si no desea mover ningún ejército, su programa debería imprimir un espacio.
Una salida de muestra puede ser esta:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
En este caso, el jugador despliega cinco ejércitos en el territorio a 0,0 y mueve tres ejércitos de 0,0 a 0,1; tres de 0,0 a 1,0; y tres de 0,0 a 1,1.
Rondas y vueltas
Al comienzo de cada ronda, todos los jugadores recibirán un territorio ubicado en un lugar aleatorio en el tablero (es posible que dos o más jugadores comiencen uno al lado del otro). Los territorios que conforman una bonificación también pueden cambiar.
En el primer turno, cada jugador tendrá un territorio que contiene cinco ejércitos, y recibirán cinco ejércitos que pueden usar (este es el mínimo que pueden recibir). Todos los demás territorios serán propiedad de NPC que no ataquen; cada uno de estos contiene dos ejércitos y tiene una identificación de -1
.
Cada turno se ejecutará su programa y se recopilarán ambas piezas de salida. El controlador aplicará la primera pieza de salida, agregando ejércitos a los territorios, inmediatamente; sin embargo, el controlador esperará hasta que todos los jugadores hayan dado su segunda salida, sus comandos de ataque / transferencia. Una vez que esto se haya completado, los comandos se barajarán aleatoriamente y luego se ejecutarán. Su programa debe proporcionar salida y terminar en un segundo o menos para poder participar en el turno.
Puntuación y victorias
Para cualquier ronda, si queda un jugador, ese jugador ganará 100 puntos. De lo contrario, si pasan 1000 turnos y todavía hay varios jugadores, los 100 puntos se dividirán en partes iguales entre los jugadores restantes (es decir, 3 jugadores restantes rinden 33 puntos cada uno). Ganará el jugador que tenga más puntos al final de las 20 rondas.
Envíos
Su publicación debe incluir un nombre para el bot, el idioma en el que está escrito, una breve descripción y el código utilizado para ejecutarlo. Un bot de muestra se publicará aquí como ejemplo y se utilizará en el concurso. Puede enviar tantos como desee.
Otro
Su programa puede crear, escribir y leer desde un archivo siempre que el nombre del archivo sea el mismo que utilizó para su envío. Estos archivos se eliminarán antes del comienzo de un torneo pero no entre rondas.
Su turno se saltará si:
- eres eliminado (no tienes territorios);
- su programa no imprime nada;
- su programa no termina en un segundo;
- despliega muy pocos ejércitos en sus territorios (desplegar ejércitos en territorios que no son de su propiedad contará para esto) o demasiados ejércitos; o
- su salida hace que el controlador arroje una excepción.
Su comando de ataque / transferencia no se ejecutará si:
- su programa no da salida correcta;
- eliges un territorio para mover ejércitos que no sea el tuyo;
- mueves cero o un número negativo de ejércitos desde tu territorio;
- mueves demasiados ejércitos de tu territorio; o
- eliges un territorio para enviar ejércitos que no sea adyacente al territorio del que elegiste mover ejércitos.
Puede encontrar el controlador y un bot de muestra aquí . El bot participará en el juego, pero probablemente no ganará ninguna ronda (a menos que sea realmente afortunado).
Resultados
Al ejecutar el controlador después de presionar una corrección de errores, WeSwarm sigue siendo una fuerza a tener en cuenta. Se necesitará un bot con una gran estrategia para tener una oportunidad contra él.
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
¡Darse cuenta!
Se ha solucionado un error descubierto por Zsw que causaba que los territorios que desplegaban sus ejércitos después de que otros tuvieran una ventaja potencial en el juego. Se ha enviado una edición al controlador, así que utilice la versión existente que se encuentra utilizando el enlace de arriba.
fuente
Respuestas:
Castler - Java 8
Él solo quiere hacer un castillo cuadrado ... y si se lo deja solo, lo hará. Aunque se aburre con un pequeño castillo, lo hace más y más grande. Esto inevitablemente significará conflicto con otros jugadores y, por lo tanto, se producirá la batalla. Sin embargo, nunca olvida su forma más deseada ... el cuadrado.
Haga clic en la imagen para un gif animado (15 meg) de una simulación completa de 20x 1000 vueltas. Castler anotó 1700 y los otros jugadores anotaron 100 cada uno.
fuente
Ermitaño - Java
Simplemente sigue sumando sus ejércitos a la misma ciudad. No creo que pueda ser derribado sin obtener ejércitos adicionales.
fuente
WeSwarm - C ++ 11 [v2.2]
Actualizado a v2.2 a partir del 25 de agosto de 2015.
v2.2 - ajustado debido a un cambio en la forma en que el controlador informa a los ejércitos.
v2.1 - TNT estaba teniendo problemas para compilar mi código, así que dejé de usarlo
stoi
.v2.0: un refactorizador de código junto con algunas correcciones de errores.
Bienvenido al enjambre. Nuestra fuerza está en los números. Nuestra voluntad eterna es recolectar todas sus bonificaciones para maximizar nuestros engendros. No se interponga en nuestro camino, para que no se sienta abrumado. No intentes derrotarnos, por cada uno que mates, tres más ocuparán su lugar. ¡Puede obligarnos a hacer sacrificios, pero nunca nos obligará a rendirnos!
GIF animado
Archivado:
v2.1: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEU3lkNzVoTUpRTG8
v1.0: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEVzZUUlFydXo2T00
fuente
stoi
no haberse resuelto a pesar de tener 11 C ++. Ha habido constantes problemas con la resolución de lo que todavía tengo que encontrar la manera de hacer, así que podría proporcionar una solución alternativa que no utilizastoi
?LandGrab - Java
Cuanto más tierra mejor. Apunta a territorios exclusivamente libres si los hay, luego, con los ejércitos sobrantes, comienza a acumularse y elimina al enemigo una ficha a la vez.
fuente
Random Halver - Java 8
Un bot muy simple que simplemente mueve la mitad de sus ejércitos en cada territorio a un territorio vecino aleatorio. No importa si el vecino es amigo o enemigo ...
Si bien no puede competir con Castler, lo hace sorprendentemente bien contra el Jugador y otros bots.
fuente