DarwinBotsManual
Abrir la app EnglishEN

Bots de torneo

Cómo se diseña un bot que gana partidos de la liga F1: qué se cobra de verdad, qué conviene gastar y las virtudes que separan a los campeones del Bestiario.

En Competir están los formatos, las reglas y el Elo; esta página es la otra mitad: cómo se piensa un bot que las aproveche. Un partido no es una simulación libre. Los costos se cobran de verdad, los muertos no dejan comida, las mutaciones vienen apagadas y la ronda la gana el que dura. La estrategia de torneo es, antes que nada, economía.

Otra cancha, otras reglas

El mundo de un partido con la Base F1 es chico y sin rincones: un campo de 9237 × 6928 con los dos ejes conectados (no hay paredes donde esconderse), suelo con rozamiento, una velocidad máxima de 180 y sin día ni noche. Dos detalles que cambian todo el diseño:

La despensa también es finita: cada ronda arranca con 15 algas de 3000 y la repoblación solo repone si bajan de 10, así que la energía que entra al mundo es acotada. Con los valores por defecto del torneo (5 bots por especie, 3000 de arranque, tope de 5000 ciclos), lo que decide la ronda es cómo administrás la tuya.

Lo que la liga cobra, con el multiplicador en 1:

AcciónPrecio
Una comparación (aunque el gen no dispare)0,004
Un store0,04
Empujar, por unidad0,05
Girargratis
Un disparo2
Un intento de lazo2
Un cloroplasto nuevo0,2
Vivir un ciclo (edad + 1000 de cuerpo)0,02

Los números, las lecturas de memoria y toda la aritmética salen gratis, y girar también: escanear dando vueltas no cuesta nada; lo que cuesta es moverse, escribir y disparar. Medido con estos ajustes: un bot quieto paga 0,02 por ciclo, uno que empuja a fondo (40 de empuje) paga unos 2 y se queda seco antes de los 1500 ciclos, y uno que busca a empujoncitos paga 0,34 y llega al tope de 5000 con energía de sobra. Nadar a fondo es la forma más cara de no encontrar nada.

Las virtudes del campeón

Eficiencia antes que valor. Corrí un duelo suelto entre dos bots con pedigree, Russia y Teriyaki, en el campo de la liga: en 800 ciclos no se cruzaron ni una vez (los dos cazan a la espera), pero a ese ritmo uno quedaba con 2750 de energía y el otro con 580. Si la ronda llega al tope de ciclos y se decide por energía, gana el que gastó menos. Y ojo con el detalle más traicionero de la tabla: las comparaciones se cobran aunque el gen no dispare. Un ADN con decenas de condiciones paga todas, todos los ciclos: Russia dormida, sin hacer absolutamente nada, paga 0,31 por ciclo, casi todo en las unas 65 comparaciones de sus condiciones.

Robustez: no depender de un solo canal. Mi primer buscador tenía un solo ojo y una lección gratis: cuando un pariente se le ponía delante, se quedaba mirándolo para siempre. Veía algo (entonces no buscaba), pero no era comida (entonces no lo cazaba): clavado, gastando sin avanzar. Los bots de torneo reparten la mirada: Russia usa ocho ojos bien abiertos para el perímetro y uno fino de mira, así que ningún pariente distraído le tapa el mundo. La versión mínima del arreglo es hacer que «no veo nada o solo veo familia» cuenten igual.

Comportamiento social: no canibalizarse. En la liga tus cinco bots iniciales son tu equipo, y un equipo que se cobra entre sí pierde dos veces: pierde la energía y pierde bots. La forma más barata de distinguir a los suyos es la firma de .refeye contra .myeye (ver Un bot que reconoce a su especie); Russia, Teriyaki y el buscador de más abajo la usan. Lo medí con tres copias de Russia (200 ciclos) y dos del buscador (400): cero bajas propias. Y hay un motivo extra: a un conespecífico tu veneno y tu toxina no le hacen nada, así que morderlo es gastar gratis (Defensivos). El contraejemplo es Singula, de más abajo: drena a lo que mira sin preguntar, y su enjambre se lo cobra.

Saber rehusar una pelea. Las reglas premian al que dura: la ronda la gana la última especie en pie y, al tope de ciclos, la de más bots o más energía. Pelear siempre no es una estrategia: cada disparo te cuesta 2, lo absorbe o no el rival, y contra uno que absorbe tus golpes o te gana el intercambio, lo único que hacés es financiarte tu propia derrota. Antes de morder, mirá cómo viene equipado (.refshell, .refpoison, .refvenom): es lo que hace Paranoia para elegir a quién cazar (Defensivos). Y si el intercambio no te conviene, no lo aceptés: alejarse cuesta lo mismo que acercarse, y en el duelo de más arriba el bot que nunca peleó iba ganando.

Tres con pedigree, verificados

Los nombres del Bestiario con liga ganada se compran baratos: hay campeones de verdad y bots que solo se llaman campeón. Estos tres corren y hacen lo que acá se dice; cada corrida fue con los ajustes de la liga y sin mutaciones.

Russia duerme, Russia cobra

Russia (Russia_F1_League_By_Spike43884_11-19-2014.txt, de Spike43884, liga Rusia 2014) es un cazador a la espera. Su firma es la hibernación: al nacer (en el primer ciclo todos los sentidos leen 0) y siempre que no ve nada y anda corto de energía se apaga entera y paga 0,31 por ciclo; despierta en cuanto un ojo lateral ve algo. El gen que la apaga:

def hibernate 51

' Duermo si no veo nada (o si es familia) y ando corto de energia
cond
 *.eye1 0 =
 *.eye2 0 = and
 *.eye3 0 = and
 *.eye4 0 = and
 *.eye5 0 = and
 *.eye6 0 = and
 *.eye7 0 = and
 *.eye8 0 = and
 *.eye9 0 = and
 *.refeye *.myeye = or
 *.nrg 3000 < and
 *.hibernate 0 = and
start
 1 .hibernate store
stop

De día caza con una mira fina y una periferia ancha, parándose al lado del blanco y robándole la energía con .shoot en −1. Y al que lo muerde le paga con veneno: la picadura le escribe 128 en el giro cada ciclo, así el ladrón se pasa la vida girando en redondo en vez de seguir robando. Contra un alga sola la vació en unos 20 ciclos y pasó de 3000 a más de 6000. Despierta y ociosa vira al azar —girar es gratis— y cría recién con 20000: cada hijo es una apuesta que solo paga con la despensa llena.

Teriyaki escupe y no se deja morder

Teriyaki (Teriyaki_F1_Spike43884_11-05-2014.txt, de Spike43884 con un arreglo de Shadowgod2) es lo contrario: paga un sueldo por andar armado. Mantiene 500 de toxina con un gen de dos líneas:

' No sabe a pollo: toxina mientras falte
cond
 *.poison 500 <
start
 50 .strpoison store
stop

Eso le cuesta unos 2,9 por ciclo (la toxina pierde el 2 % por ciclo, así que reponer 500 es un gasto permanente), pero quien lo muerde recibe el golpe de vuelta envenenado. Ataca mezclando −1 y −6: el −6 también le saca cuerpo, así que de una sola alga que entró con 3000 y 1000 de cuerpo terminó sacando más de 8000. A los parientes ricos les dispara esperma y cría sexual; y si se pasa de 100 de desechos, se alivia disparándolos para atrás. Un bot completo, con precio de bot completo: en el duelo con Russia era el que se quedaba seco.

Singula Haloculus 2: un gen y una bomba demográfica

Singula Haloculus 2 (Singula_Haloculus_2_F1_bacillus_21.04.08.txt, de bacillus, 2008) responde por qué a veces gana el más simple: es un solo gen, siempre encendido, y ganaba ligas igual. Hace tres cosas a la vez. Cría sin freno: pide un hijo con más de 200 de energía, y en 30 ciclos una sola copia había sido doce. Mantiene el cuerpo chico, en un tercio de su energía, con la línea más bonita del Bestiario:

' El cuerpo a un tercio de la energia: sobra, guardo; falta, devuelvo
cond
start
 *.nrg 3 div *.body sub dup .strbody store - .fdbody store
stop

Y se alimenta atando al que está mirando y chupándole 1000 por ciclo por el lazo (.tieloc en −1, .tieval en −1000), sin preguntar de qué especie es: en una corrida sin comida su propio enjambre se drenó entre sí hasta quedar cuatro. La cereza: su disparo es de memoria, a la dirección de la .shootval del otro, y le deja escrito −32000. Un cazador que cobra con −1 y tiene la .shootval rota se mata con su propio disparo: contra Singula el cazador del tutorial amaneció con la .shootval en −32000 y no llegó lejos; y un cazador con la .shootval forzada a −32000 cayó él solo, con el alga de blanco intacta. Por algo su encabezado dice que mata a los bots que se alimentan a disparos.

Probalo antes de anotarlo

Acá va un bot de liga mínimo, completo, para partir: busca barato, caza lo que no es de su especie, cría con la despensa llena y no se come a sus hermanos.

' Bot de liga minimo: caza algas y extranos, no toca a los suyos
cond
 *.robage 0 =
start
 100 .eye5width store
stop

' Cuando no veo nada (o solo veo familia): empujoncito barato
cond
 *.eye5 0 =
 *.refeye *.myeye = or
start
 5 .up store
stop

' Veo a un extrano: me le acerco
cond
 *.eye5 0 >
 *.refeye *.myeye !=
start
 *.refveldx .dx store
 *.refvelup 30 add .up store
stop

' Acompanado del blanco de cerca: le pido energia
cond
 *.eye5 50 >
 *.refeye *.myeye !=
start
 *.refveldx .dx store
 *.refvelup .up store
 -1 .shoot store
stop

' Con energia de sobra, hijos
cond
 *.nrg 5000 >
start
 50 .repro store
stop
end

Con los ajustes de la liga hace lo que promete: busca a 0,34 por ciclo recorriendo el campo entero, vacía un alga en unos 60 ciclos y con lo ganado tira su primer hijo, y dos copias juntas no se cruzan ni un golpe en 400 ciclos. Contra un cazador común del mismo estilo le banca el pulso: son números y cría. Lo que no tiene son defensas: contra un bot armado no tiene nada que decirle; para eso está Defensivos.

Para las pruebas de verdad, en la app:

Y recordá la letra chica del reglamento: el ADN se congela al inscribirse, así que inscribe la versión que quieras correr, no la que estás por arreglar.

Qué probar después