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.
[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.