aBOTcalypse
¡Diseña un bot para competir en un desafío del Rey de la Colina! Aquí hay una repetición de un juego de bot predeterminado.
El tablero es 2D, como un videojuego de desplazamiento lateral (pero sin desplazamiento).
Un bot válido debe aceptar una representación de cadena multilínea de la región del tablero que puede ver, y generar un movimiento para el bot.
Mecánica
Este es un juego de supervivencia. El apocalipsis ha llegado, y solo quedan bots (y un suministro interminable de rocas almacenadas en el espacio martillo ). Cada bot tiene una ubicación de inicio aleatoria, en la elevación 0. En un movimiento dado, un bot puede descansar, moverse, lanzar una piedra o dejar caer una piedra. Los bots pueden compartir espacio con rocas estacionarias, pero un bot que colisiona con otro bot o un meteorito muere, al igual que un bot golpeado por una roca arrojada.
- Gravedad: los robots y las rocas deben descansar sobre el piso del tablero o sobre otra roca; descansar sobre otra cosa (aire, un meteorito, un bot, etc.) deja a uno "sin soporte". Los bots o rocas no compatibles caerán hasta que sean compatibles; una caída de más de un espacio matará a un bot, y un bot debajo de una roca o bot que cae también es asesinado. Esto significa que intentar moverse o desplegarse solo funcionará si el bot comparte actualmente un espacio con una roca (de lo contrario, el bot / roca caerá 1 espacio). Un espacio puede quedar "sin soporte" si la roca debajo de él cae o es destruida por un meteorito o un proyectil .
- Meteoritos: cada turno un meteorito entra al tablero desde la parte superior. Un meteorito tiene una velocidad de magnitud 2, con un ángulo aleatorio elegido uniformemente en el rango [-180,0], y una posición x inicial aleatoria. Los meteoritos caen en línea recta a lo largo de la trayectoria dada hasta que golpean algo, en cuyo punto desaparecen. Tenga en cuenta que el redondeo en el movimiento de un meteorito es hacia 0 (según Python
int()
). - Proyectiles: un bot puede elegir lanzar una roca a cualquier distancia hasta su altura. Una roca arrojada se mueve en línea recta hasta que golpea algo (todo en un turno, a diferencia de un meteorito; las rocas arrojadas no aparecen en el tablero), en una pendiente de
- elevation / max distance
. Tenga en cuenta que las rocas arrojadas comienzan su trayectoria en x + - 1 cuadrado. Por ejemplo, si un bot está a una elevación de 5 y lanza una distancia de 1, la roca comenzará en(x-1,5)
y terminará en(x-2,0)
. La colisión solo se verifica en pasos dedx=1
, ydy
se redondea hacia 0 (según Pythonint()
).
Entrada
Cada bot puede ver un cuadrado de 20 píxeles en cada dirección (distancia de Chebyshev = 20), hasta los límites del tablero. Hay 8 caracteres diferentes en cada cadena de entrada:
'#'
(límite del tablero)'.'
(aire)'@
'(meteorito)'&'
(rock)'e'
/'s'
(un bot enemigo, o en sí mismo)'E'
/'S'
(un bot enemigo, o él mismo, compartiendo un espacio con una roca)
Aquí hay un ejemplo de entrada (los saltos de línea serán \n
):
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............@...............#
.....................E........#
.....................&........#
.....................&........#
.....................&........#
.....................&........#
...........@.........&........#
....................s&........#
###############################
Salida
Hay cuatro acciones que un bot puede tomar cada turno.
rest
(literalmente siéntate y no hagas nada)move <direction>
mueve el espacio uno bot en cualquiera de las cuatro direcciones,up
,down
,left
, oright
. El movimiento hace que el bot caiga si el nuevo espacio no es soportado por el piso o una roca (fall > 1 = bot.kill()
).drop <direction>
coloca ("cae") una roca en la dirección indicada. Dejar caer una piedra hacia arriba (es decir, colocar una piedra en el cuadrado[bot_x, bot_y+1]
) o hacia un lado hace que se caiga hasta que se sostenga (posiblemente caiga sobre el bot durantedrop up
).drop down
coloca una roca en la misma posición que el bot, si aún no hay una roca allí.throw <direction> <distance>
lanza una piedra según la mecánica de "proyectiles" anterior, con la distancia máxima indicada. La distancia máxima es irrelevante para lanzar hacia arriba o hacia abajo: el proyectil choca con el cuadrado de abajo (fordown
) o intenta chocar con el cuadrado de arriba (forup
) y luego con el cuadrado del bot si no golpea nada (matando al bot) .
Un bot en el concurso debe generar una cadena escalar con su acción al recibir la cadena de entrada.
Interfaz
Un bot debe consistir en un solo programa al que se pueda llamar mediante un pitón 2 subprocess
. Cualquier comando debe indicarse y se guardará en un archivo llamado command.txt
; antes de que comience un juego, el controlador ejecutará cada comando en command.txt
orden, y luego el comando final se usará para pasar la entrada al bot a partir de ese momento.
Un bot puede tener un solo archivo de almacenamiento llamado storage.txt
en su carpeta; el bot "Default Thrower" muestra un ejemplo de implementación, usando json para guardar su estado durante varios turnos. Además, siéntase libre de incluir la salida de depuración en un solo escritura errlog.txt
, que pasaré en caso de que su bot falle durante una ejecución. Me aseguraré de ejecutar varias pruebas con cada bot, para tratar de encontrar cualquier error de antemano.
Puntuación
La puntuación total de un bot es igual al número de turnos que sobrevive, acumulados en X juegos de longitud máxima Y. Por el momento X,Y = 10, 500
,; si los bots duran mucho tiempo, aumentaré Y, y si duran poco tiempo, aumentaré X.
El código del controlador se encuentra en controller.py ; muchas gracias a @Nathan Merrill por su DDOS koth del que adapté el código del comunicador.
&&&\n&S&\n###
? Serían invulnerables a la caída de meteoritos.