Eres un punto emprendedor que quiere aumentar la tierra bajo su control. Esto es bastante simple: viaja fuera de tu tierra actual y regresa a tu tierra y todo en ese circuito ahora es tuyo. Pero hay una trampa. Si algún otro punto de alguna manera encuentra tu lazo y lo cruza, mueres.
Si aún no lo has probado, ve a Splix.io y prueba un juego. Usa los cursores para controlar tu movimiento.
GIF
Crédito: http://splix.io/
Detalles específicos
Todos los jugadores comienzan en posiciones aleatorias en un tablero de 200x200. (Me reservo el derecho de cambiar esto :). Tendrás una cierta cantidad de movimientos para acumular la mayor cantidad de puntos posible. Los puntos son contados por:
- El número de jugadores que has matado multiplicado por 300
- La cantidad de tierra que posees al final de la ronda
Esto trae a colación el punto de que otros pueden robar tu tierra. Si comienzan un ciclo que cruza parte de su tierra, pueden reclamarlo. Si mueres durante la ronda, pierdes todos los puntos de esa ronda.
Cada ronda tiene un grupo de jugadores seleccionados al azar (máximo 5 jugadores únicos) (sujeto a cambios). Cada jugador participa en un número igual de rondas. El puntaje final de tu bot está determinado por su puntaje promedio por juego. Cada juego consta de 2000 turnos (también sujetos a cambios). Todos los bots hacen sus movimientos al mismo tiempo.
Casos de muerte
Cabeza a tope
Ambos jugadores mueren cuando se topan mutuamente. Esto sigue siendo cierto incluso cuando ambos jugadores están al borde de su espacio.
Sin embargo, cuando solo uno de los jugadores está en su tierra, el otro jugador muere.
Cruz de línea
En este caso, solo el jugador morado muere.
No puedes cruzar tu propia línea.
Saliendo del tablero
Si un jugador intenta salir del tablero, morirá y perderá todos los puntos.
Área de captura
Un jugador capturará el área cuando tenga un rastro y vuelva a entrar en su propia tierra.
El rojo se llena entre las dos líneas rojas. El único caso en el que un jugador no completa es cuando otro jugador está dentro del circuito. Para ser claros, esto solo se aplica cuando el otro jugador está en el circuito, no solo la tierra que posee. Un jugador puede capturar tierras de otra persona. Si un jugador no puede completar el área rodeada por su rastro, el rastro se convierte directamente en tierra normal. Si el jugador dentro del circuito terrestre de otro jugador muere, el área en ese circuito se llena. Cada vez que un jugador muere, el tablero se vuelve a examinar para un área que se puede completar.
Detalles del controlador
El controlador es aquí . Es muy similar al juego original, pero se han realizado pequeños cambios para hacer que este se ajuste mejor a KotH y por razones técnicas. Está construido con @NathanMerrill 's biblioteca KotHComm , y con la ayuda sustancial de @NathanMerrill también. Avíseme de cualquier error que encuentre en el controlador en la sala de chat . Para ser coherente con KotHComm, he usado colecciones de Eclipse en todo el controlador, pero los bots pueden escribirse usando solo la biblioteca de Colecciones de Java.
Todo está empaquetado en un uberjar en la página de versiones de github . Para usarlo, descárguelo y adjúntelo a su proyecto para que pueda usarlo para completar automáticamente (instrucciones para IntelliJ , Eclipse ). Para probar sus envíos, ejecuta el jar con java -jar SplixKoTH-all.jar -d path\to\submissions\folder
. Asegúrese de que path\to\submissions\folder
tenga una subfoler llamada java
y coloque todos sus archivos allí. No use nombres de paquetes en sus bots (aunque puede ser posible con KotHComm, es solo un poco más de problemas). Para ver todas las opciones, use --help
. Para cargar todos los bots, use --question-id 126815
.
Escribiendo un bot
Para comenzar a escribir un bot, debes extender SplixPlayer
.
Direction makeMove(ReadOnlyGame game, ReadOnlyBoard board)
- Aquí es donde decides qué movimiento quieres que haga tu bot. No debe devolver nulo.
HiddenPlayer getThisHidden()
- Obtenga la
HiddenPlayer
versión dethis
. Útil para comparar tu bot con el tablero.
- Obtenga la
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()
- Obtenga lo
Direction
que obtendría si girara a la izquierda.
- Obtenga lo
Direction RightTurn()
- Obtenga lo
Direction
que obtendría si girara a la derecha.
- Obtenga lo
ReadOnlyBoard
Esta es la clase donde accedes al tablero. Puede obtener una vista local (20x20) del tablero con las posiciones de los jugadores mostradas, o una vista global (todo el tablero) con solo la información de quién posee y reclama las posiciones en el tablero. Aquí también es donde obtienes tu posición.
SquareRegion getBounds()
- Recupera el tamaño del tablero.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getGlobal()
- Obtenga un mapa global del tablero.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getView()
- Igual que
getGlobal()
, excepto que está limitado a un área de 20x20 alrededor de su jugador, y que muestra las posiciones de los jugadores.
- Igual que
Point2D getPosition(SplixPlayer me)
- Obtén la posición de tu jugador. Usar como
board.getPosition(this)
.
- Obtén la posición de tu jugador. Usar como
Point2D getSelfPosition(ReadOnlyBoard)
- Obtenga su posición en el tablero. Uso:
Point2D mypos = getSelfPosition(board)
- Obtenga su posición en el tablero. Uso:
ReadOnlyGame
ReadOnlyGame
solo proporciona acceso a la cantidad de turnos que quedan en el juego int getRemainingIterations()
.
ReadOnlySplixPoint
HiddenPlayer getClaimer()
- Obtenga la
HiddenPlayer
versión de quién reclama un punto: reclamar = un rastro.
- Obtenga la
HiddenPlayer getOwner()
- Averigua quién posee un punto.
HiddenPlayer getWhosOnSpot()
- Si el jugador está posicionado en este punto, devuelve la versión oculta del mismo. Solo funciona en
getLocal()
.
- Si el jugador está posicionado en este punto, devuelve la versión oculta del mismo. Solo funciona en
Point2D
A diferencia de las otras clases aquí, Point2D
está contenida en la 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)
- Envuelva el
x
valor para estar dentro del rango demaxX
.
- Envuelva el
Point2D wrapY(int maxY)
- Envuelva el
y
valor para estar dentro del rango demaxY
.
- Envuelva el
int cartesianDistance(Point2D other)
- Esto se traduce en cuántos turnos le tomaría a un jugador moverse del punto a al punto b.
Soporte Clojure
El compilador de Clojure se incluye con el SplixKoTH-all.jar
, por lo que puede usar Clojure para su bot. Consulte mi random_bot
para ver cómo usarlo.
Depuración de un bot
El controlador viene con un depurador para ayudar a probar estrategias. Para comenzar, ejecuta el frasco con el--gui
opción.
Para adjuntar el depurador a su jar, siga estas instrucciones para IntelliJ, o estas instrucciones para Eclipse (versión de Eclipse sin probar).
Si está usando un depurador con su código, puede usar esto para ayudar a visualizar lo que su bot está viendo. Establezca un punto de interrupción al comienzo de makeMove
su bot y asegúrese de que solo pause el hilo actual. A continuación, haga clic en el botón de inicio en la interfaz de usuario y revise su código.
Ahora, para ponerlo todo junto:
Ejecutando bots
Para ejecutar sus bots con otros, debe ejecutar el jar en la página de lanzamientos. Aquí hay una lista de banderas:
--iterations
(-i
) <=int
(predeterminado500
)- Especifique el número de juegos para ejecutar.
--test-bot
(-t
) <=String
- Ejecute solo los juegos en los que está incluido el bot.
--directory
(-d
) <= Ruta- El directorio desde donde se ejecutarán los envíos. Use esto para ejecutar sus bots. Asegúrese de que sus bots estén en una subcarpeta de la ruta nombrada
java
.
- El directorio desde donde se ejecutarán los envíos. Use esto para ejecutar sus bots. Asegúrese de que sus bots estén en una subcarpeta de la ruta nombrada
--question-id
(-q
) <=int
(solo uso126815
)- Descargue y compile los otros envíos del sitio.
--random-seed
(-r
) <=int
(predeterminado a un número aleatorio)- Dele una semilla al corredor para que los bots que usan aleatoriamente puedan reproducir los resultados.
--gui
(-g
)- Ejecute la interfaz de usuario del depurador en lugar de ejecutar un torneo. Mejor usado con
--test-bot
.
- Ejecute la interfaz de usuario del depurador en lugar de ejecutar un torneo. Mejor usado con
--multi-thread
(-m
) <=boolean
(predeterminadotrue
)- Ejecute un torneo en modo multihilo. Esto permite un resultado más rápido si su computadora tiene múltiples núcleos.
--thread-count
(-c
) <=int
(predeterminado4
)- Número de subprocesos que se ejecutarán si se permiten subprocesos múltiples.
--help
(-h
)- Imprima un mensaje de ayuda similar a este.
Para ejecutar todos los envíos en esta página, use java -jar SplixKoTH-all.jar -q 126815
.
Formateando tu publicación
Para asegurarse de que el controlador pueda descargar todos los bots, debe seguir este formato.
[BotName], Java // this is a header
// any explanation you want
[BotName].java // filename, in the codeblock
[code]
Además, no use una declaración de paquete.
Marcador
+------+--------------+-----------+
| Rank | Name | Score |
+------+--------------+-----------+
| 1 | ImNotACoward | 8940444.0 |
| 2 | TrapBot | 257328.0 |
| 3 | HunterBot | 218382.0 |
+------+--------------+-----------+
Avíseme si alguna parte de las reglas no está clara, o si encuentra algún error en el controlador en la sala de chat .
¡Que te diviertas!
fuente
Respuestas:
ImNotACoward, Java
Este bot es un experto en supervivencia
cobarde. Si no hay ningún enemigo cerca, reclama una parte de la tierra. Si se puede alcanzar el bucle de otro jugador de manera segura,apuñala al otro jugador en la parte posterior y loinvolucra en un duelo. Si el otro jugador no puede ser atacado de forma segura,huyerealiza una retirada estratégica a su propia tierra.fuente
TrapBot, Java
Este es quizás el bot más simple. Todo lo que hace es trazar el borde del tablero, doblarse sobre sí mismo para reducir el riesgo de ser asesinado.
fuente
random_bot, Clojure
Esto es RandomBot , pero tuve que apegarme a las convenciones de nomenclatura, y algunos problemas me impiden usar el guión en el nombre, ¡así que subrayan el reinado! El
make-move
fn devuelve un vec con el primer elemento en elDirection
que desea moverse, y el segundo es el estado en el que desea que se le devuelva en el próximo turno. No use átomos externos, ya que este código puede ejecutar múltiples juegos en paralelo.fuente
HunterBot, Java
Uno de los bots más básicos. Busca en el tablero puntos para matar a otros, y seguirá el camino más corto posible para llegar a una posición de asesinato. Si está fuera de su territorio, realizará movimientos aleatorios hasta que tenga otra abertura para matar a otro jugador. Tiene cierta lógica para evitar que se atropelle, y cuando todos los demás jugadores están muertos, regresa a su hogar. Una vez en casa, solo entra en una pequeña plaza.
fuente