Juego del hambre: comer o morir
Si no comes, mueres. Si comes, vives (hasta que mueras). Usted va a morir, así que trate de morir el pasado.
Visión de conjunto
Hay una isla poblada con una manada de presas. Tú controlas un paquete de cinco depredadores. Su objetivo es mantener viva su manada. Haz esto comiendo presas. Las presas tienden a huir de los depredadores y, de lo contrario, intentan permanecer en una bandada. Por supuesto, su paquete estará en el mismo campo que cualquier otro paquete , por lo que la competencia tratará de comerlos antes de que pueda. No dejes que esto te desanime, o morirás de hambre.
Cómo jugar
Cree y envíe un programa de línea de comando para dirigir su paquete. Recibirá información de estado del programa de control en STDIN y enviará comandos en STDOUT. El formato se detalla a continuación. Cada programa solo se ejecutará una vez y debe permanecer en ejecución hasta que no haya más miembros del paquete con vida. Deberá leer la entrada a medida que ingresa y responder rápidamente. Hay un tiempo de espera estricto de 200 ms para cada respuesta. Si no ha respondido para entonces, su paquete no recibirá nuevas instrucciones para el turno actual.
Si el controlador no puede ejecutar su programa, no se considerará válido. Incluya la cadena de línea de comando que necesitaré para ejecutar su envío. Si hay instrucciones especiales (para configurar compiladores, etc.), inclúyalas. Si no puedo hacerlo funcionar, le pediré ayuda en los comentarios. Si no responde, no podré aceptar su envío.
El torneo se llevará a cabo en un sistema Linux de 64 bits. Tenga esto en cuenta al dar las instrucciones necesarias.
Detalles
La posición y dirección de cada criatura tienen la forma de un par de números de coma flotante de doble precisión (por ejemplo
double
) que representan sus coordenadasx
yy
, respectivamente.Cada criatura se considera un punto. Esto significa que pueden superponerse y ocupar el mismo espacio. No te dejarán de lado, y no existe un concepto de colisión con otras criaturas.
La isla es un cuadrado, 500 unidades a un lado. Si intentas aventurarte más allá de esos límites, estarás sujeto al borde. El origen
{0,0}
está en la esquina superior izquierda, con unx
aumento hacia la derecha y uny
aumento hacia abajo. Nuevamente, el mapa no se ajusta .El juego comienza con más de 1500 presas (packCount * 50) . Se reunirán en el centro de la isla, pero rápidamente decidirán comenzar a moverse.
Los paquetes se organizarán en un círculo uniformemente espaciado alrededor del perímetro. El orden del paquete se baraja, así que no cuente con comenzar en una ubicación en particular.
Los animales de presa pueden ver a todos los demás animales dentro de un radio de 30 unidades. Se pueden mover a un máximo de 6.0 unidades por turno.
Los depredadores pueden ver a todos los demás animales dentro de un radio de 50 unidades. Pueden moverse a un máximo de 6.1 unidades por turno. Esto significa que pueden ver presas antes de ser vistas y (apenas) superarlas.
Los depredadores viven y mueren según su nivel de hambre . Comienza en 1000 y disminuye en uno cada turno. Si, después del movimiento, un depredador está dentro de 1 unidad de presa, se lo comerá automáticamente. Esto elimina la presa y establece el hambre del depredador en 1000. Cada depredador solo puede comer una presa por turno. Si hay más de uno dentro del rango, se comerá el que el bucle llegue primero (no necesariamente el más cercano). Un depredador muere si su hambre llega a cero.
Los paquetes comienzan con cinco miembros cada uno. Cada 5000 turnos, todos los paquetes que aún estén en el juego generarán un nuevo miembro. Se colocará dentro del rango visible de un miembro del paquete. Asegúrese de que sus entradas puedan manejar más de cinco miembros.
Cada 1000 turnos, se generarán más presas. El número de nuevas presas será el número de depredadores vivos menos uno.
Los depredadores no pueden atacar a otros depredadores. Comen presas cuando lo atrapan. Eso es.
El orden dentro de un turno es:
- Todas las presas toman decisiones
- Todos los depredadores toman decisiones.
- Todas las presas se mueven
- Todos los depredadores se mueven / comen
El orden en que cada paquete toma sus decisiones / movimientos será aleatorio en cada turno.
Protocolo (general)
Todas las comunicaciones se realizan en formato de cadena US-ASCII
. Los números se convierten en cadenas usando Java Double.toString()
o Integer.toString()
. Su salida debe estar formateada para que Java la pueda leer Double.valueOf(String)
(no generará números enteros). Para obtener detalles sobre los formatos analizables, consulte la documentación deDouble
. Todos los campos de una línea están separados por el \t
carácter estándar , y las líneas nuevas lo están \n
. La cadena completa terminará en un byte nulo \0
.
En los ejemplos a continuación, estoy usando <>
para marcar los campos por razones de legibilidad. Estos no están presentes en las cadenas reales.
Protocolo (entrada)
La cadena de entrada varía en longitud, dependiendo de cuántas criaturas son visibles para su paquete. Puede superar los 100k caracteres, así que prepárate para eso. La configuración básica es:
Línea 0: información básica sobre el juego.
turn
es el número de turno actual, y los recuentos son el número total de presas y depredadores que quedan en el campo. Estos estáninteger
en forma de cadena.<turn>\t<preyCount>\t<predatorCount>\n
Línea 1: los ID únicos y los niveles de hambre de los miembros de tu manada. Estos no se dan en el mismo orden para cada entrada. Use los identificadores únicos para rastrear miembros individuales, no el orden en que aparecen en la entrada. De nuevo, estos son
integer
como cadenas. Para un paquete de dos, esto sería:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Línea 2: las posiciones de los miembros de su manada, en el mismo orden que se indica en la línea 1 . Estos son
double
como una cadena:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Las siguientes líneas son la visibilidad de cada miembro del paquete, en el mismo orden que se da en la línea 1 . Estos se darán como dos líneas por miembro.
El primero para cada uno consiste en ubicaciones para la presa que puede ver. El segundo es la ubicación de los depredadores que puede ver. Estas ubicaciones no son únicas en su conjunto. Por ejemplo, si dos miembros de la manada pueden ver el mismo animal, estará en la cadena de ambos miembros. Además, sus propios miembros de la manada se incluirán. Si desea excluirlos, puede comparar ubicaciones con sus propios miembros. Todas las ubicaciones están en double
formato de cadena.
Para cada miembro vivo:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Finalmente, el último personaje será \0
, al comienzo de la siguiente línea.
Excepción: si recibe la entrada dead\0
, su paquete está muerto. Termine su programa con gracia, por favor. El controlador debería cerrar todos los procesos vivos cuando está cerrado, pero prefiero no tener procesos zombies por todas partes. Como cortesía, puede incluir un tiempo de espera de entrada. Por ejemplo, mi clase de ejemplo finaliza si no recibe información durante 15 segundos.
Protocolo (salida)
La salida es simple. Dará un par de double
valores para cada miembro del paquete en vivo. Estos representan el movimiento que le gustaría que tomaran en este turno. Por ejemplo, si tu criatura se encuentra actualmente {100.0, 100.0}
y les das un comando {-1.0, 1.0}
, se moverán a {99.0, 101.0}
. Todos los números estarán en una sola línea, separados por tabulación.
Por ejemplo, si tuviera 3 miembros de la manada vivos, esta sería una respuesta válida:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Esto se movería sus criaturas por {1.0,-1.0}
, {2.0,-2.0}
y {3.0,-3.0}
. El pedido es el mismo que el recibido en la entrada. ¡No olvides el final \0
!
Si da una entrada no válida, seguirán malos resultados. Si un número único no se puede analizar a double
, se convertirá en cero. Si la cadena en su conjunto no se puede analizar, no se darán nuevas instrucciones, y todo su paquete utilizará las instrucciones del turno anterior.
Todas las direcciones se sujetarán a una distancia máxima de 6.1 unidades. Puede moverse más lento que esto si lo desea. Por ejemplo, {1, 0}
te moverá una unidad. {6,8}
(distancia 10) solo te moverá 6.1 unidades, y se reducirá a alrededor {3.66, 4.88}
. La dirección permanece constante.
Importante: El programa de control lee su STDOUT y STDERR. Si lanza una excepción e imprime en STDERR, es muy poco probable que el mensaje tenga la forma de una respuesta válida. Intenta evitar hacer esto.
Programa de Control / Pruebas
La fuente del controlador se puede encontrar aquí en bitbucket.org . Deberá compilarlo antes de ejecutarlo. La clase principal es Game
, y todas las clases están en el paquete predeterminado. Para ejecutar, incluya el comando de cada paquete como un argumento separado. Por ejemplo, si desea ejecutar un Java ChaserPack y un Python LazyPack.py, puede usar:
java Game "java ChaserPack" "python LazyPack.py"
En el mapa, las presas aparecen en verde y los depredadores en rojo. Sin embargo, el paquete que sea el primer paquete dado como argumento tendrá un color azul. Esto tiene la intención de distinguirlos más fácilmente para propósitos de prueba. Los depredadores también parpadearán en blanco durante cinco cuadros cuando coman.
El juego continuará hasta que el último depredador muera de hambre, escribiendo en la consola a medida que ocurran eventos de hambre o extinción. Una vez que se completa el juego, se otorgará la puntuación para cada paquete. Si quiere no quiere ver los eventos de inanición / extinción, puede usar el -silent
argumento. Entonces solo generará el puntaje final. Debe pasar esto como primer argumento :
java Game -silent "java ChaserCat" "./someOtherPack"
Se incluye un paquete esqueleto de Java llamado GenericPack
. Incluye las operaciones básicas de entrada / salida necesarias. Está allí para dar un claro ejemplo de cómo analizar y responder. Si desea agregar una plantilla en otro idioma, avíseme.
También se incluye un depredador basado en la plantilla, ChaserPack
. No se incluirá en el torneo, y solo se incluye con fines de prueba. Se desempeña bastante mal, debido a un defecto de objetivo intencional. Si no puedes vencerlo, sigue intentándolo.
A continuación se muestra un ejemplo de ejecución del programa de control (haga clic para ver el video). La calidad del video no es excelente (lo siento), pero puedes tener una idea de cómo se mueve la presa. ( precaución: audio )
Puntuación
El ganador será determinado por torneo, ganando puntos en cada ronda.
Cada ronda continúa hasta que todos los depredadores estén muertos. Cada paquete se puntuará según el momento en que su último miembro murió de hambre. Luego se les asignarán puntos según el orden. Los puntos se acumularán durante diez rondas, y el vencedor es el paquete con los puntos totales más altos.
El primer lugar para cada ronda recibirá 100 puntos. Para cada lugar después de eso, la recompensa se reducirá en un 20% (redondeado hacia abajo). Esto continuará hasta que los puntos lleguen a cero (después del puesto 17). Los lugares mayores de 18 años no recibirán puntos por la ronda. Los paquetes que empaten recibirán puntos iguales. Por ejemplo:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
El máximo de puntos posibles en el transcurso del torneo es 1000, desde el primer lugar las diez veces.
Si varios programas finalizan el torneo empatado en el primer lugar, se llevará a cabo otro torneo de diez rondas con solo las entradas del primer lugar enviadas. Esto continuará hasta que emerja un vencedor.
Intentaré organizar un torneo aproximadamente semanalmente, o cuando lleguen nuevas presentaciones.
Reglas adicionales (¡juega limpio!)
No puede leer ni escribir en ningún recurso externo. Como no va a invocar su programa varias veces, cualquier información de estado puede almacenarse internamente.
No interfiera con otros procesos / presentaciones. Esto no significa que no intentes robar a sus presas, sobrepasarlas, etc. Significa que no interfieras con la ejecución del proceso. Esto queda a mi discreción.
Los concursantes están limitados a un máximo de tres entradas. Si envía más, solo calificaré los tres primeros. Si desea revocar uno, bórrelo.
Las entradas pueden no existir únicamente para apuntalar otras entradas. Cada uno debe jugar para ganar por su propio mérito.
Su programa puede generar un máximo de un proceso secundario a la vez ( descendientes totales , no directos). De cualquier manera, asegúrese de no pasar el tiempo de espera. No puede invocar la
Game
clase en sí de ninguna manera.
Resultados - 29 de abril de 2014
Aquí están los resultados del último torneo de diez rondas:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Los paquetes enviados antes de las 09:00 EDT del 29/04/2014 se incluyen en esta ejecución.
También puede ver los detalles de cada ronda . Por alguna razón, decidí numerar las rondas hacia atrás, por lo que comienza con la "ronda 10".
Actualizaciones
23/04/2014: FGreg informó un error relacionado con los tiempos de espera (¡gracias!). Se ha implementado una solución, por lo que los evaluadores querrán actualizar su código de programa de control.
fuente
Respuestas:
Clarividente
Código actualizado para enfrentar AbleDogs
Woo hoo! ¡Finalmente vence a los Netcats! Expandí el código existente (¡créditos a Geobits!) Con algunas pequeñas modificaciones para crear este futuro paquete de predicción. ¡Nada supera a los depredadores que saben dónde se moverá la presa!
De las dos pruebas que hice, mi manada siempre ganó contra Netcats. Pero esto no funcionará tan bien si no hay otros paquetes, ya que la predicción aún falla si hay muchas otras presas en las cercanías.
Probablemente pueda incluir el truco de CivilizedBeasts para reducir sustancialmente el número de presas durante los primeros miles de turnos.
Por el nombre de mi paquete, debes saber qué estrategia uso = D
Editar :
Mejore los casos especiales cuando la versión anterior se atascó en la esquina.flock[ALIGN]
Factor de presa incluidoConté cuántas presas come cada paquete, y aquí está el resultado:
Mi manada es muy agresiva, y creo que la mayoría de los 916 recuentos se obtienen robando presas de Netcats, al igual que RubySpiders.
CivilizedBeasts desafortunadamente está perdiendo debido al camello central de EcoCamel.
Y EcoCamel (con 500 de hambre crítica) es bastante eficiente, come lo suficiente para sobrevivir hasta el final.
También con este clarividente actualizado, el juego apenas alcanza los 10,000 turnos.
El código:
fuente
Netcats
Aquí hay un paquete para que ustedes comiencen. Extiende la
GenericPack
clase incluida con el programa de control. Se ha mejorado desde la publicación original, y ya no se mata de hambre con un rebaño escaso.Los netcats usan una formación de red en forma de vee para atrapar a las presas en la esquina, donde pueden comerlas cuando lo deseen. La red está formada con un miembro de "cabeza" en el centro. Una vez que la cabeza come, intercambia lugares con el miembro más hambriento de la manada, ya que la cabeza es normalmente la primera en tener la oportunidad de comer.
La red comienza bastante pequeña, pero se ensancha cuando el rebaño se hace más pequeño para poder rastrear el campo de manera más eficiente.
Si no se ven presas, la formación se amplía en un patrón de búsqueda ingenuo que cubre la mayor parte de la isla.
Una vez que el paquete se reduce a dos miembros, la red simplemente no funciona. En ese punto, cada uno sigue su propio camino, comiendo con avidez lo más cercano que puede encontrar y haciendo una caminata semi aleatoria de lo contrario.
Esta versión sobrevive mucho mejor que los ingenuos Netcats vistos en el video vinculado en la pregunta.
fuente
Arañas de rubí
Como a veces menos es más y muchas soluciones probablemente intentarían arrinconar a la presa de todos modos ...
Pensé que mi manada podría dividirse y esperar a que otros hicieran el trabajo.
Advertencia: en realidad no se mantiene en funcionamiento, ni lee la entrada a medida que entra ni responde rápidamente. Aún así, como funciona bien con el controlador, espero que califique sin más ajustes.
fuente
Bestias Civilizadas
¡Finalmente, es hora de mostrar mis bestias!
Mi raza piensa que la caza es algo primitiva, por lo que trabajan juntos en un equipo de 4 y abandonan a su quinto aliado, porque: menos depredadores = más presas para ellos mismos. Lo que básicamente hacen es lo que hacen los humanos, atrapan presas y cuidan bien su ganado;)
Se vuelve bastante difícil para mis senos sobrevivir con menos de 200 presas en el turno + -12,000 con solo Netcats enemigos en el juego. Estarás contento con esta raza, ya que realmente devora cantidades masivas de presas con una velocidad como ninguna otra puede jamás (no es que las matanzas rápidas y grandes otorguen la victoria, pero influyen en el tiempo (largo) que toma una ronda completa considerablemente).
fuente
Buitres de rubí
Aquí viene un paquete de parásitos más activos . Están tratando de rodear al depredador en movimiento más cercano , para poder robar su presa . Dependen un poco de la suerte, ya que no tienen una forma inteligente de elegir a quién seguir, pero generalmente están golpeando cazadores y, a veces, arañas .
No están del todo terminados, ya que publiqué esto para impulsar el tempo :)
Espero:
22 de abril de 2014: Se agregó aburrimiento , lo que los hace menos pegajosos y les permite cazar presas por su cuenta y buscar depredadores.
fuente
MalosCamellos EcoEditar: Mutación # 2. Oh, no, llegué tarde con mi implementación de la predicción del movimiento de presas, para ser el primero en vencer a los Netcats. OK, que así sea.
Esta mutación tiene
$hunger_critical
variable (constante). Cambiarlo a un valor superior a 1000 hace que los camellos cacen siempre, como los clarividentes. Entonces:Si
$hunger_critical
se establece, por ejemplo, en 500 (como se muestra a continuación), mis Camellos (después de ver los horrores de la civilización ) intentan comportarse de manera ecológica (por lo tanto, han cambiado el nombre de su raza), es decir, matan solo cuando tienen hambre. Si no tienen hambre, patrullan las áreas críticas de la isla: el centro y las esquinas, para evitar la carnicería inútil de otros cazadores. Bueno, con centro, funciona más o menos. La idea de dar vueltas en las esquinas era ahuyentar a la presa y hacer la vida más difícil para los gatos y los parásitos. Pues no funciona. La estúpida presa va a las esquinas de todos modos.También es interesante que el
flock[ALIGN]
componente solo pueda ser adivinado por los depredadores, y mi implementación es diferente de la mitad. Me temo que hay algún error menor en miestafaejecución de código Geobits', ver / comparar la caza individual de camellos vs clarividentes.Y el programa es bastante largo ahora, lo siento.
Editar: Mutación # 1. La isla resulta ser bastante radiactiva (eso explica la falta de vegetación y la naturaleza inexplicable de las criaturas 'presas'), así que aquí está la primera mutación de mis camellos. Cualquiera de ellos puede convertirse en cazador en solitario, si tiene hambre o si no hay un rincón libre para todos. Hunter intenta perseguir activamente a sus presas cercanas. Si no hay ninguno, patrulla en un amplio círculo alrededor del centro de la isla, luego persigue a la criatura más cercana cuando la encuentra. Desafortunadamente, la dirección de la presa se vuelve impredecible cuando está cerca de su enjambre (vale la pena investigar ...), por lo que la persecución en solitario no es muy eficiente. Pero si tiene éxito, el Camel va a digerir al rincón libre más cercano (si lo hay). Cuando el nivel de hambre está por debajo de cierto nivel, cualquier Camello abandona su esquina (probablemente maldiciendo Netcats ('¿dónde está la comida?') )) y va en itinerancia libre por sí solo. Y así.
La misma broma contada dos veces no es graciosa, pero (1) tuve que comenzar en alguna parte y soy nuevo en estas cosas, (2) Honestamente, pensé en las tácticas de esquina (¿y quién no?), Mirando Netcats, antes de Ruby Las arañas aparecieron en la isla.
Entonces, ¿has oído hablar de los camellos carnívoros? Los animales pobres se despertaron un día en esta isla olvidada de Dios para no encontrar pasto ni árboles en absoluto, sino muchas pequeñas cosas verdes, aunque comestibles, de movimiento rápido (bastante molesto). Al no tener hábitos de caza (pero pronto mutarán, espero), mis Camellos desarrollaron un esquema muy malvado para sobrevivir: se separaron y se fueron a cada uno de los 4 rincones, y el quinto se fue al centro (para morir allí primero, como resulta) En sus destinos esperan pacientemente, realizando una especie de baile de guerra de camellos, o tal vez simplemente tratan de no pisar a otros animales que ya están allí, arañas y todo ...
fuente
vec
propiedad es básicamente solo el desplazamiento del turno anterior al turno actual. Y como dije, hacemos un emparejamiento del turno anterior para descubrir qué presa va en esa dirección, no podemos confiar en el orden de la presa. Esto es posible porque las presas generalmente (en el escenario típico) mantienen una distancia suficiente entre sí (> 12 unidades), por lo que la mayoría de las veces podemos hacer coincidir las presas en el turno anterior con el turno actual.AbleDogs - PHP
Estos bonitos perros han aprendido a morder las pantorrillas de una presa para empujarla a lo largo de las paredes. También les encanta deambular por el pasto en busca de nuevas presas. Por último, se les ha enseñado a abstenerse de comer a menos que realmente necesiten las calorías.
Pon el código en un
AbleDogs
archivo y ejecútalo conphp AbleDogs
Consideraciones Generales
Es el final del juego lo que cuenta. Puede tener el algoritmo de caza más inteligente que haya existido, si no detecta y captura las últimas presas individuales más rápido que la oposición, pierde.
Si tus depredadores no pueden atrapar una presa solo (o al menos en parejas), estás tostado tan pronto como la densidad de la presa baje lo suficiente como para confiar en la suerte ciega o bloquear las presas en las esquinas.
Un predictor de movimiento de presas es básicamente obligatorio. No puedo imaginar superar un programa basado en predictores sin tener tu propio predictor.
Persecución de la cola
La forma más ineficiente de atrapar una presa es perseguirla. Suponiendo que un solo depredador persiga a una sola presa y no tenga influencias externas (paredes, otras presas, etc.), una persecución de cola podría durar para siempre. Tan pronto como ingrese al radio de visión de la presa de 30 unidades, la presa huye a la velocidad 6 para su 6.1, por lo que gana .1 distancia por turno: en línea recta, necesitará aproximadamente 300 turnos para obtenerlo.
Teniendo en cuenta el tamaño de la arena, una presa viajará como máximo la diagonal de un cuadrado de 500 unidades antes de golpear una pared o una esquina, lo que tomará como máximo 117 turnos.
Obviamente, la estrategia ganadora es encontrar una manera de reducir la velocidad de las presas, es decir, tener otro depredador o una pared / esquina frente a él.
Vaticinador
Con una velocidad de presa de 6, una presa puede moverse a un área de 36 * pi unidades al cuadrado. Con un radio de captura de 1, una suposición ciega de dónde será la próxima presa tiene una probabilidad de 1/36 * pi (aproximadamente 1%) de tener éxito. ¡Claramente hay que hacer algo para mejorar eso!
Mirando el código del motor de simulación, puede ver que las entradas son:
Si bien todas las posiciones están disponibles, las velocidades de presa anteriores no lo están. La única forma de calcular estas velocidades sería rastrear cada presa de un turno al siguiente, lo que es casi imposible de hacer (a menos que implemente un algoritmo de seguimiento de movimiento muy inteligente). Por lo tanto, un predictor puede reproducir fácilmente todos los términos del cálculo, excepto la contribución de velocidad que debe adivinarse.
En el caso de una sola presa, la velocidad se puede rastrear sin demasiados problemas, lo que permite construir un predictor "perfecto" para atrapar a una presa aislada del rebaño. Que es básicamente todo lo que necesitas para el final del juego, cuando las presas son muy pocas para interactuar entre ellas. Cuando abundan las presas y el efecto de bandada es lo suficientemente fuerte como para engañar al predictor, la gran densidad de las presas compensará los errores (si no atrapa al que estaba apuntando, es probable que obtenga uno de sus amigos más cercanos )
Presas incómodas
Con el conocimiento exacto del cálculo de la velocidad de la presa, es posible "dirigir" una presa dada hacia una dirección deseada, ajustando la posición de un depredador.
Esto permite fijar una presa contra una pared o dirigirla hacia otro miembro del paquete. Intenté algunas estrategias refinadas, como pellizcar una presa entre dos miembros del paquete. Desafortunadamente, esto resultó menos eficiente que la rutina actual de "pin and scan", ya que mantener a dos depredadores ocupados para perseguir a una sola presa deja a la oposición con demasiados depredadores libres para explorar el pasto.
Robar presas
Una característica del comportamiento de las presas es que la influencia de un depredador aumenta proporcionalmente a su distancia de la presa (siempre que permanezca dentro del radio de visión de la presa). Cuanto más cerca esté un depredador de una presa, menos se alejará de ella.
Significa que cuando dos depredadores compiten para atrapar una presa, el más cercano está obligado a obtenerla primero. Incluso un contendiente súper inteligente que lograría posicionarse justo en frente del eje cazador / presa básicamente asustaría a la presa en las fauces del contendiente.
Para lograr robar una presa, se necesitan al menos un par de depredadores. Uno irá a matar, y los otros permanecerán justo dentro del radio de visión de la presa, lo más lejos posible de la presa para maximizar la influencia y empujar a la presa hacia el cazador.
Además, cada cambio de dirección permitirá que la competencia corte la esquina hacia la presa, y mantenerse detrás del contendiente solo es posible si el "goader" estaba lo suficientemente cerca de la presa al comienzo de la acción.
Por lo tanto, el robo de presas solo tiene una oportunidad de tener éxito si las posiciones iniciales de los "ladrones" son favorables y puedes ahorrar al menos un segundo depredador. En mi experiencia, esto no vale la complejidad.
Cambios sugeridos
Para permitir estrategias más complejas, mover el depredador por encima de la velocidad máxima de la presa podría tener un costo en puntos de hambre, proporcional al exceso de velocidad. Digamos, por ejemplo, subir a la velocidad 6 es gratis y cada punto de velocidad superior a 6 cuesta 100 puntos de hambre (ir a 6.3 cuesta 30 puntos de hambre por turno, quemar 1000 puntos de hambre permitiría alcanzar la velocidad 16 durante un turno, y morir si no lo hace ¡No atrapes a una presa haciéndolo!).
En lugar de matar a un depredador aleatorio cuando más de uno está lo suficientemente cerca como para comer una presa, sugiero dividir la ganancia (por ejemplo, 3 depredadores obtendrían 333.33 puntos de hambre cada uno). Esto permitiría estrategias de final de juego más interesantes (sombrear a un depredador enemigo sería útil si crees que tienes más puntos de hambre, por ejemplo).
El color especial para el primer paquete es bastante difícil de ver. Sugiero cian o naranja en lugar de azul.
fuente
Lazy Pack Haskell
Necesitará la plataforma haskell para ejecutar esto. Luego usas el
runhaskell
comando para ejecutarlo. Mi manada espera a que la presa venga a ellos.fuente
-silent
opción ...No es una entrada, siempre estoy interesado en agregar color personalizado para cada entrada participante en king-of-the-hill ;)
Y también el proceso de alimentación no se visualiza cambiando el color, sino cambiando el tamaño, para que podamos ver múltiples eventos de alimentación en poco tiempo.
Game.java
Predator.java
fuente