Este desafío ha terminado. Para ver los puntajes finales de los competidores, haga clic aquí.
En este desafío, cada presentación es un bot. Cada bot debe ser una función Javascript. Los bots lucharán para obtener el mayor valor total en oro. El oro se puede cultivar o ganar matando a otros bots, y se usa para mejorar la curación, el ataque, el escudo y la agricultura.
Objetivo:
En una serie de rondas que contienen hasta 1000 turnos (finaliza cuando solo queda un bot), el bot con el valor total más alto (la suma de todo el oro obtenido) es el ganador.
Vueltas:
En cada turno, cada bot que esté vivo (> 0 HP) se ejecutará una vez. Puede devolver un movimiento, que puede ser uno de los siguientes:
- Curar: recupera HP
- Ataque: elimina HP de otro bot
- Escudo: defiende contra ataques posteriores
- Aturdir: se salta el siguiente turno de otro bot
- Granja: gana oro a costa de HP
- Actualización: mejora ciertos movimientos
Todos los bots devolverán su movimiento antes de que se ejecuten, por lo que un aturdimiento, curación, ataque, escudo, etc. no afectará a ningún bot que se mueva más tarde en ese turno. Por ejemplo, si el Bot A aturde al Bot B, y el Bot B está detrás del Bot A en el orden de turno, el Bot B aún se moverá más tarde en ese mismo turno y el aturdimiento ocurrirá en el siguiente turno.
Combate, agricultura y mejora:
Cada bot tiene un HP máximo de 100 y un UID asignado entre 0 y 99. Este UID cambia después de cada ronda, y es la forma en que los bots se siguen entre sí.
La curación es uno de los movimientos más simples, agregando una cantidad de HP determinada por su nivel (comienza en 5 HP). Un bot no puede curar más de 100 HP.
Atacar a un bot por su UID es otro movimiento posible, con un daño base de 5 HP en el nivel 0. Los bots también pueden aturdirse, omitiendo su próximo turno, que también usa UID.
Los bots tienen un escudo HP adicional, que no tiene límite. Este escudo HP absorberá el daño de los ataques directos de otros bots, y se agrega mediante escudo. En el nivel 0, el blindaje agrega 5 HP de escudo.
La agricultura ganará 5 de oro en el nivel 0, a un costo de 2 HP. Este 2 HP no se puede proteger. El único uso para el oro (más allá de ganar) es mejorar los movimientos. La curación, el ataque y la protección tienen un valor base de 5 HP, y la agricultura comienza en 5 de oro. Cada uno de esos movimientos tiene niveles individuales, que comienzan en 0. Estas fórmulas determinarán el valor en HP u oro de un movimiento, donde L es el nivel:
- Curación:
L + 5
- Agresor:
1.25L + 5
- Blindaje:
1.5L + 5
- Agricultura:
2L + 5
El costo de actualizar cualquier movimiento es el mismo para cierto nivel, y está determinado por 2.5L² + 2.5L + 10
dónde L es el nivel actual. Un bot puede usar la función cost(currentLevel)
como un atajo para determinar esto.
Los bots comienzan con 25 de oro, lo que les permite actualizar rápidamente dos movimientos al nivel 1 o un movimiento al nivel 2. Este oro inicial no cuenta para el valor total de un bot. Matar a un bot te da la mitad de su valor total en oro, redondeado, y si dos bots matan a otro en el mismo turno, ambos obtienen la recompensa.
De entrada y salida:
Para comunicarse con el controlador, el valor de retorno de la función se utiliza para enviar información de movimiento. Uno de estos debe ser devuelto:
- Sanar:
heal()
- Ataque:
attack(uid)
- Proteger:
shield()
- Aturdir:
stun(uid)
- Granja:
farm()
- Mejorar:
upgrade("heal" / "attack" / "shield" / "farm")
Para omitir un turno (no hacer nada), no devolver nada o devolver un valor falso.
Para obtener el número de turno actual (comienza en 1), use turn()
.
Los argumentos de su función incluirán información sobre su bot, los UID de otros bots y el almacenamiento entre turnos. El primer argumento es un objeto con las siguientes propiedades: uid
, hp
, gold
, y shield
. Estas son copias de la información actual de su bot. También hay un objeto anidado levels
, con los números de nivel de heal
, attack
, shield
, y farm
.
El segundo argumento es un conjunto aleatorio de todos los bots vivos distintos al tuyo, formateado como un objeto que contiene propiedades uid
, hp
(más escudo) worth
y attack
(nivel de ataque). El tercer argumento es un objeto vacío que se puede usar para el almacenamiento entre turnos.
Bots de ejemplo:
Este bot cultivará hasta que pueda actualizar su ataque al nivel 5, luego atacará un bot aleatorio cada turno hasta que muera (o gane). No es muy efectivo debido a la falta de curación / blindaje.
function freeTestBotA(me, others, storage) {
if (me.levels.attack < 5) {
if (me.gold < cost(me.levels.attack))
return farm();
return upgrade("attack");
}
return attack(others[0].uid);
}
Este bot tiene dos modos: ofensivo y defensivo. Aturdirá a un bot aleatorio o sanará cuando esté en modo defensivo, y atacará o protegerá cuando esté en modo ofensivo. Intentará actualizar sus ataques siempre que sea posible.
function freeTestBotB(me, others, storage) {
if (me.gold >= cost(me.levels.attack))
return upgrade("attack");
if (me.hp < 50)
if (Math.random() < 0.5)
return stun(others[0].uid);
else
return heal();
else
if (Math.random() < 0.5)
return attack(others[0].uid);
else
return shield();
}
Reglas:
- Lagunas estándar prohibidas
- Los bots no pueden leer, modificar o agregar ninguna variable fuera de su alcance, no pueden intentar hacer trampa y no pueden llamar a ninguna función DOM o definida por el controlador
- El valor de retorno debe ser falso o una de las salidas de funciones anteriores
- Los bots no deben diseñarse para apuntar a un bot específico, sino que pueden diseñarse para aprovechar estrategias comunes
- Los bots no pueden atacarse a sí mismos (descubiertos debido a un comentario de @Ness)
- Los bots deben ser suficientemente diferentes de cualquier otro bots para que puedan considerarse razonablemente entradas separadas
- Teaming ahora no está permitido
- El controlador se puede encontrar aquí
- Sala de chat
Nueva depuración del controlador:
Usando el archivo gold-battle-log.js
, puede establecer el valor de la debug
propiedad de un bot en botData
0 (sin registro), 1 (movimientos de registro) o 2 (movimientos de registro, hp, oro, niveles, etc.)
El desafío finaliza a las 1700 UTC del viernes 9 de agosto.
fuente
[closed]
al final es probable que los espectadores casuales se salten la lectura de mi desafío, ya que asumirían que es de baja calidad o fuera de tema.Respuestas:
Invencible
bifurcado de Undyable .
Dados los costos exponenciales de las actualizaciones, también podríamos mejorar la agricultura si no podemos mejorar la curación, permitiendo que el bot recolecte oro de manera más eficiente.
fuente
if
usara esa primera declaración<=
, actualmente nunca se curará por completo.ThanosBot
Hay demasiados bots, no hay suficiente oro para todos. Este bot propone una solución.
Genocidio, sí, pero aleatorio, desapasionado, justo para ricos y pobres por igual.
Lo llamaron loco.
ThanosBot quiere lo mejor para la comunidad de bots y está dispuesto a llegar hasta el final. Al principio, mejorará su ataque, agricultura y curación, para reunir recursos de manera más eficiente y ganar batallas. Progresivamente, comenzará a atacar a las personas al azar mientras sigue reuniendo recursos para las próximas batallas. Seguirá mejorando su ejército, sus armas y él mismo.
Una vez que el 50% de la población haya sido eliminada, los bots nacidos solo conocerán vientres llenos y cielos despejados, se retirará a una vida de agricultura y verá salir el sol en un universo agradecido. Se volverá completamente pacifista, solo se curará con sopas de verduras y agricultura.
fuente
Kill Stealer
¡Ahora no solo roba asesinatos, sino que también roba robos mata!
Este bot no hace mucho, excepto la granja, y cuando se da cuenta de la posibilidad, se une para dar el golpe final a un enemigo moribundo, y de alguna manera se las arregla para ser muy bueno.
fuente
El Equalizador
Este bot busca restaurar la paz en la comunidad bot. Ataca implacablemente a los bots con el ataque más alto, rindiéndose solo si la curación del bot es mejor que su propio ataque. Una vez que no queden bots con una curación peor que su ataque, se retirará a una vida de agricultura pacífica.
fuente
Optimista
Asume que podrá pasar el 80% de su tiempo cultivando pacíficamente, por lo que comienza maximizando la agricultura y solo entonces comienza a prestar atención a sus habilidades de combate. ¡Seguramente nada saldrá mal!
fuente
Asesinato
¿Por qué actualizar el valor de ataque cuando puedes hacer daño por plink y aún así obtener crédito completo?
Una vez más volviendo a llevar a Kill Stealer. Pude simplificar varios bloques de código donde las declaraciones siempre eran verdaderas y jugar con algunos números que resultaron en ganancias masivas sobre el original.
Tengo que dárselo a @dzaima para darme cuenta de que aturdir a un oponente rico que probablemente esté involucrado en una asistencia el turno antes de que ocurra una muerte es bastante inteligente. Una de las (muy) pocas veces
Stun()
tiene un resultado de suma positiva. Una vez más pude mejorar la idea, ya que sabiendo que Kill Stealer ejecutará una lógica similar, Kill Assist busca un "segundo mejor" objetivo (con cierta discreción) y los aturde en su lugar.Actualización menor para evitar aturdir al bot a punto de morir y evitar aturdir al bot que tiene más probabilidades de matar.
Resultados de muestra (top 5 truncado después de 1000 juegos)
fuente
runGame(1) results: [...] captFarmer: 13768
Bot indescriptible (v3)
fuente
PacienteEstrategiaBot
Traté de escribir un bot que comience a enmarcar y defender según sea necesario y luego cambie a matar a otros bots de alto valor más adelante en el juego.
Actualmente, esto no parece funcionar correctamente ya que es asesinado por una pandilla de robots asesinos al comienzo del juego o queda atrapado en algún lugar en su modo ofensivo.
Todavía estoy bastante contento con que este sea mi primer código JS, así que ... (robé fragmentos de código de aquí y de allá porque fue más rápido que buscar en Google toda la sintaxis básica de JS)
fuente
Suiza
Como su nombre lo indica, este bot es
neutral ensu mayoría neutral (ahora ayuda a matar a los bots que van a morir) y solo cultiva y cura, construyendo lentamente su oro (al igual que Suiza)fuente
El bot que cultiva, ataca, protege e incluso cura pero nunca aturde
(El nombre corto es TBTFASAEHBNS , que no debe confundirse con TBTPTGCBCBA )
Este bot básicamente:
Edición 1: se corrigió un problema y se mejoraron algunas cosas pequeñas en el bot basadas en pruebas con muchos juegos.
Edición 2: Mejoras de escudo reducidas.
fuente
SniperBot
Este bot solo será efectivo si alguien comienza a agregar bots que realmente atacan de forma regular. SmartFarmer es mi solución optimizada actual
los buitres no necesitan un ataque
fuente
int
) en la línea 2. ReferenceError: el estado no está definido.me.hp
?if(me.hp <30 && ...)
podría simplificar a la primera cláusula debido a la necesidad de un nivel absurdo de curación para queBullyDozerBot
Mashup de BullyBot y algunos otros bits. Optimist tenía un corto y dulce trozo de ataque oportunista que yo hice (aunque otros bots hacen cálculos similares).
En lugar de intimidar al objetivo aturdiéndolo, lo asesina por su dulce, dulce botín. También se dirige a los más débiles de la manada por intimidación, pero se dará por vencido e irá a la agricultura si el HP del objetivo más débil es demasiado alto.
fuente
FizzBuzz
Mayormente ofensivo bot. Extremadamente molesto por el hecho de que no puede realmente FizzBuzz, por lo que solo zumba enojado. Cuando no es efervescente o zumbido, se dispara a otro bot durante 30 turnos y se da por vencido y elige otro bot para apuntar si no está progresando.
Realiza extraordinariamente inconsistente.No importa, actualizó el controlador, ahora parece estar siempre a la mitad del paquete.fuente
bullyBot
Pruébalo en línea!
Puede que no gane, pero ciertamente hará todo lo posible para asegurarse de que su objetivo tampoco lo haga. bullyBot también trabaja en el primer turno para que si no hay influencia externa, superará a su objetivo 5-0 o los empatará 5-5.
fuente
JustFarm
Pensé que comenzaría simple.
fuente
ScavengerBot (V2)
Me di cuenta de que no era un carroñero antes. La nueva estrategia es esperar hasta que pueda matar a otro bot. Si nadie puede ser asesinado, se sienta y acumula escudo.
fuente
me.levels.attacl
?temperamental
La estrategia predeterminada de Moody's es mejorar la agricultura y la curación por un tiempo, luego eliminar a los otros bots en orden descendente de valor. Sin embargo, si es atacado, se asustará y se centrará en la curación por un tiempo. Si ataca y "falla", porque la víctima se estaba curando o protegiendo más efectivamente que el ataque, se enojará y se irá para mejorar sus habilidades de ataque.
fuente
Bandido
Primer intento de un robot de aprendizaje de refuerzo. Puramente defensivo por ahora para reducir el espacio de búsqueda. Una especie de spin-off más inteligente de FizzBuzz: repite una serie específica de cinco acciones una y otra vez; Las cinco acciones son las elegidas por RL.
Pero por ahora se basa principalmente en la enumeración: acabo de generar las 3 ^ 5 = 243 permutaciones de series de cinco acciones defensivas que se repitieron una y otra vez, y almacenaron sus puntajes promedio (dividido por 200, para obtener el aumento promedio sobre cinco turnos) más de 100 iteraciones en la
storage.prior
matriz. Luego, durante el juego, implementa un enfoque codicioso de epsilon para actualizar esas listas de puntajes para que esté más preparado para el futuro. (También porque usar epsilon = 0.3 fue mucho mejor que epsilon = 0.1, así que simplemente lo guardé).Lo hace bien, colocando constantemente entre scavengerBot y Optimist. Actualmente estoy entrenando un poco más en juegos reales, y estoy buscando mejores formas de enmarcar la estrategia, para ver si puedo mejorarla.
fuente
El oportunista
Este toma prestado un poco de algunos otros (notablemente ScavengerBot (V2) e Unkillable) ya que tenían las mismas ideas que tenía en mente, pero en general me gustan más los estilos bien redondeados y todo en vez de centrarme solo en una o dos cosas Esto probablemente significará que no ganaré, pero debería estar en el medio en algún lugar (lo que me sucede la mayoría del tiempo en muchas cosas).
Entonces roba asesinatos jugosos; cura si es necesario; mejora la granja, ataca y sana en ese orden; y granjas de lo contrario.
fuente
others
ScaredBot
highest attack * (25% of bots)
, o se acerca al extremo inferior deHP + shield
, entonces protege< 50
, sana.La idea es mantenerse con vida el mayor tiempo posible e intentar obtener oro de una manera segura y económica para poder actualizar.
Las prioridades de actualización probablemente deberían modificarse, así como la condición al determinar si se debe proteger.
fuente
SmartFarmer
Granjas, mejora la agricultura, sana si tiene poca salud. La agricultura parecía dominada hasta que llegaron los bots realmente ofensivos. Ahora mi bot es asesinado :-(
fuente
Mort
Cada turno, compara el beneficio amortizado de matar a cada bot con el de la agricultura y la curación y elige la mejor opción. Realmente debería usar el estado para determinar cuánto tiempo tomará matar a un bot, pero por ahora solo supone que cada bot cura o protege un promedio de 5 puntos por turno neto de daño que otros bots hacen.
fuente
Bot amigable
others[0].hp
es enhp + shield
lugar dehp
...fuente
El contador
Este práctico bot calcula el movimiento más beneficioso económicamente, pero le gusta mantener bajo su perfil de ataque para evitar problemas de todos los bots vigilantes. Él no trata de elegir ayudar a los indefensos o aprovecharse de ellos. Más bien, hace lo que más le ayuda.
fuente
realmenteCompettedTurtle
Aquí está la cosa. Se ha vuelto realmente peligroso por ahí. La agricultura aumenta tu valor, convirtiéndote en un objetivo. Así que no es seguro cultivar hasta que hayas construido un escudo enorme y toda la violencia haya desaparecido. Entonces puedes sacar tu cabeza de tu caparazón y comenzar a cultivar. O asesinando. Lo que sea mejor paga
fuente
guardián
Puedo tener más de una presentación, ¿verdad?
Un tenedor de CampBot. No protege, sino que se centra en atacar. Muestra una preferencia por atacar a jugadores con estadísticas de ataque más altas, en lugar de atacar al azar como CampBot. Se enfoca en mejorar su agricultura en lugar de curarlo.
fuente
let victim=potentialVictims[Math.floor(Math.random()*potentialVictims.length)]
Rando
Este tipo tonto elegirá acciones basadas en aleatoriedad uniforme con algunos prejuicios. Si una acción elegida al azar no funciona, entonces se despliega a la siguiente opción.
Entonces, en promedio, debería atacar casi 2/9 de las veces y cultivar casi 3/9 de las veces. El resto tiene una probabilidad de aproximadamente 1/9 si es capaz de actualizar, o si la curación / protección lo vale, etc.
Probablemente no tendrá un buen desempeño, pero al menos hay una pequeña posibilidad de que él reine supremo. Y ese es todo el propósito de Rando. ¡Solo necesita creer en sí mismo! Todas las opciones se ponen delante de él. Solo necesita elegir lo que se necesita para una situación dada.
(Sé que "default" es innecesario, pero creo que es una buena práctica de codificación para código robusto).
fuente
Matar bot
Un bot simple, Kill Bot solo quiere matar a sus enemigos. Dado que el escudo es mucho más eficiente que la curación (especialmente cuando está nivelado), Kill Bot solo trata de ser siempre un objetivo poco atractivo al protegerse cada vez que es atacado. Kill Bot funciona bastante bien entre los robots débiles y pacifistas de por aquí (puedes sentir su desprecio por ellos).
fuente
o.attack
es el nivel de ataque, no su dañoFarmHeal Bot
Bifurcado del bot de @Anonymous 'JustFarm
fuente
Indestructible
Una modificación del bot de Draco18, usando escudos (más efectivo contra otros bots)
fuente