DarwinBotsManual
Abrir la app EnglishEN

Un alimentador por lazo

Paso a paso: un bot que encuentra una presa, la ata con un lazo, le chupa la energía por el lazo, la suelta cuando se seca y se reproduce con la ganancia.

En Un bot que busca comida le robás la energía a los vegetales a disparos, y en Un vegetal criaste esas algas que fabrican energía de la luz. Este tutorial construye al tercero en discordia: un bot que no caza ni fotosintetiza, sino que ata su comida con un lazo y se la chupa. Cada paso le agrega genes al ADN y te dice qué deberías ver.

Un lazo en vez de un disparo

Cazar a disparos (Un bot que dispara) es correr detrás de la comida. Con un lazo (Lazos y multicelulares) te atás una vez y el lazo trabaja solo: fija a la presa (es un resorte: no se va a ningún lado mientras comés) y la vacía (por el lazo le transferís energía cada ciclo, directo de su reserva a la tuya — Lazos y multicelulares).

El precio: de cada 100 que le sacás, te quedás con 70 como energía, casi 3 como cuerpo y 1 como desecho. Rinde menos que un buen disparo; la compensación es que la orden pasa todos los ciclos, gratis y sin puntería.

Paso 1 · La presa

Necesitás algo con energía que no se defienda. Sembrá en Observar → Sembrar el alga que armaste en Un vegetal marcada como Vegetal (hace fotosíntesis), o unas cuantas copias de un blanco quieto como el de Un bot que dispara:

' Blanco de practica: no hace nada
cond
start
stop

Al blanco lo vamos a ver morir de a poquito; el alga, con el sol de fondo, dura más. Para las mediciones de este tutorial usamos el blanco quieto, un campo de 1200×900 y bots de 3000 de energía.

Paso 2 · Encontrarla y acercarse

El lazo solo alcanza al bot que estás viendo, y de cerca: el motor no ata a más de unos 480 de borde a borde, y menos si los bots son chicos. Así que primero está la caza de siempre: girar buscando, apuntar, acercarse. Con dos genes alcanza, porque el ojo con foco ya te describe al que mejor tenés enfrente: su posición en .refxpos y .refypos, su energía en .refnrg y su especie en .refeye (Visión).

' Manos libres y lo de enfrente no se come: virar al azar y avanzar
cond
 *.tiepres 5 !=
 *.refnrg 100 <
 *.refeye *.myeye =
 or
start
 314 rnd .aimdx store
 10 .up store
stop

' Manos libres y presa a la vista: apuntarle y acercarse
cond
 *.tiepres 5 !=
 *.refnrg 100 >
 *.refeye *.myeye !=
start
 *.refxpos *.refypos angle .setaim store
 10 .up store
stop

Tres decisiones nuevas en esas condiciones:

El primer gen usa or: vira si lo que ve no se come o es pariente, y avanza siempre, empujando lo que estorbe.

Qué deberías ver: el bot pivota y camina al azar hasta que la presa entra al abanico de los ojos; ahí clava el rumbo con .setaim y va derecho. En nuestra corrida la tenía enfocada al ciclo 2 y la tocaba al 11.

Paso 3 · Atarla

' Presa cerca y enfrente: atarla con el puerto 5
cond
 *.tiepres 5 !=
 *.refnrg 100 >
 *.refeye *.myeye !=
 *.eye5 50 >
start
 5 .tie store
stop

Un .eye5 de 50 son unas 200 unidades de borde a borde: al cruzar esa línea, el bot escribe 5 en .tie y al final de la fase de acciones el motor lo ata al bot que está viendo. El 5 es el puerto: el nombre con el que vos vas a elegir ese lazo; la presa lo va a llamar 1, por su orden de llegada (Lazos y multicelulares). La orden se borra siempre, salga o no, y cada intento cobra el costo de atar (Atar): 0 en las simulaciones de fábrica, 2 en la liga F1.

La presa todavía puede zafar: su baba desvía el intento (.slime — con más de 92 no hay lazo posible) y cada intento, salga o no, le gasta 20 (Defensas).

Qué deberías ver: en la app, una línea fina entre los dos, azulada mientras el lazo está blando. En la memoria del inspector (El inspector): el alimentador con .numties en 1 y .tiepres en 5; la presa, con .tiepres en 1.

Paso 4 · Chuparle la energía

' Presa atada que no es de los mios: leerla y chuparle energia
cond
 *.tiepres 5 =
 *.trefeye *.myeye !=
start
 5 .readtie store
 5 .tienum store
 -1 .tieloc store
 -1000 .tieval store
stop

Cuatro órdenes: .readtie apunta los sentidos del lazo (las celdas tref*) al puerto 5; .tienum elige el lazo 5 para todo lo demás; .tieloc en −1 dice «transferir energía» y .tieval negativo, «sacar». Podés sacar hasta 3000 por ciclo; pedimos 1000, y el motor te lo recorta a lo que le quede a la presa.

La transferencia ocurre en la fase de movimiento de ese mismo ciclo, y al siguiente ya estás comiendo. Lo que medimos contra el blanco quieto:

CicloPresaAlimentador (energía / cuerpo / desecho)
123000 (atada)3000 / 1000 / 0
1320003700 / 1029 / 10
1410004400 / 1058 / 20
150: cadáver5100 / 1087 / 30

Cada ciclo la presa pierde 1000 y vos ganás 700 de energía, 29 de cuerpo y 10 de desecho (.waste): el 30 % restante se pierde en el camino. La condición con .trefeye es la misma prueba de especie, ahora mirando al atado en vez de al visto.

Paso 5 · El resorte: fijar la presa

Atar a la carrera tiene su física. El lazo nace con el largo que había al formarse y tolera 20 unidades de diferencia sin hacer nada: fuera de esa zona muerta es un resorte que tira de los dos. Como llegás empujando, el largo queda corto, la presa queda casi pegada y el par sigue deslizando junto unas 200 unidades antes de asentarse — arrastrar funciona igual al revés, cadáver incluido. Eso sí: un vegetal cargado de cloroplastos es muchísimo más masivo que un bot de puro cuerpo (Física).

A los 19 ciclos el lazo se endurece: en la app la línea se vuelve ocre y más gruesa, y los dos bots pasan a ser multicelulares (.multi vale 1 en los dos). Para entonces podés mandarle geometría: .fixlen fija el largo y .fixang el ángulo, y la presa pasa a colgarte de un brazo corto, frente a la nariz.

' Lazo endurecido: llevarla pegada y al frente
cond
 *.multi 1 =
 *.tiepres 5 =
start
 100 .fixlen store
 0 .fixang store
stop

En nuestra corrida, desde el endurecimiento, .tielen bajó de a poco hasta unos 40 de borde a borde y .tieang fue acercándose a 0: la presa quedó a un palmo, muerta adelante. Con una presa chica el banquete dura menos que esos 19 ciclos, así que el gen recién luce con las presas gordas. Ser multicelular con tu propia comida tiene efectos laterales —los costos se dividen y tus disparos pegan más (Lazos y multicelulares)— y es, exactamente, el mecanismo que Un multibot usa para bien.

Paso 6 · Soltar cuando se seca

La presa seca no desaparece: queda como cadáver y sigue atada, y un bot que no suelta vive arrastrando su despensa vacía. El gen que falta:

' La presa se seco: soltarla
cond
 *.tiepres 5 =
 *.trefbody 0 >
 *.trefnrg 100 <
start
 5 .deltie store
stop

.trefnrg es la energía del atado, leída por el lazo con un ciclo de atraso. Con menos de 100 no queda nada que chupar: .deltie corta el lazo 5 y el bot queda libre. La condición con .trefbody evita un falso positivo: en el primer ciclo del lazo las celdas tref* todavía están vacías, y sin ese control el bot cortaría la presa recién atada.

Qué deberías ver: un ciclo después de que la presa llega a 0, los dos quedan con .numties en 0 y el alimentador vira a buscar otra. No vuelve a atar al cadáver: la prueba de .refnrg del paso 2 ya lo deja fuera del menú.

El bot completo

Falta lo de siempre: cuando la energía sobra, hijos. El gen pide un 30 % con .repro a partir de 6000, y solo con las manos libres: el parto necesita lugar libre delante, y mientras comés tenés la presa tapando ese lugar. Este es el bot entero, tal como lo corrimos:

' Un alimentador por lazo
' Busca presa, la ata con el puerto 5, le chupa la energia,
' la suelta cuando se seca y, con la ganancia, tiene hijos.

' Manos libres y lo de enfrente no se come (o es de los mios):
' virar al azar y avanzar
cond
 *.tiepres 5 !=
 *.refnrg 100 <
 *.refeye *.myeye =
 or
start
 314 rnd .aimdx store
 10 .up store
stop

' Manos libres y presa a la vista: apuntarle y acercarse
cond
 *.tiepres 5 !=
 *.refnrg 100 >
 *.refeye *.myeye !=
start
 *.refxpos *.refypos angle .setaim store
 10 .up store
stop

' Presa cerca y enfrente: atarla con el puerto 5
cond
 *.tiepres 5 !=
 *.refnrg 100 >
 *.refeye *.myeye !=
 *.eye5 50 >
start
 5 .tie store
stop

' Presa atada que no es de los mios: leerla y chuparle energia
cond
 *.tiepres 5 =
 *.trefeye *.myeye !=
start
 5 .readtie store
 5 .tienum store
 -1 .tieloc store
 -1000 .tieval store
stop

' Lazo endurecido: llevarla pegada y al frente
cond
 *.multi 1 =
 *.tiepres 5 =
start
 100 .fixlen store
 0 .fixang store
stop

' La presa se seco: soltarla
cond
 *.tiepres 5 =
 *.trefbody 0 >
 *.trefnrg 100 <
start
 5 .deltie store
stop

' Energia de sobra y manos libres: un hijo
cond
 *.nrg 6000 >
 *.tiepres 5 !=
start
 30 .repro store
stop

Contra dos blancos quietos, en un campo de 1200×900: vació al primero en diez ciclos (quedó en 5100), tardó unos setenta más en dar con el segundo, lo vació igual, y al ciclo 90 nació el primer hijo — el padre quedó en 5037, el hijo arrancó con 2157 y el mismo ADN. Después los dos vagaron sin encontrar nada: el campo estaba limpio.

En el Bestiario hay alimentadores por lazo de verdad. El Hybrid of a tiefeeder and Alga Chloroplastus es este bot con menos nudos: se ata con .tie a quien no es de su especie, le saca 1000 por ciclo con .tieloc en −1 y corta el lazo si el atado resulta pariente. Lo corrimos contra un blanco quieto: lo vació en unos diez ciclos, pero siguió arrastrando el cadáver. Soltar la presa seca es la mejora que le pusimos nosotros.

Qué probar después