darse cuenta
Este desafío ha finalizado y no se volverá a juzgar, ¡pero siéntase libre de publicar respuestas y probar su programa contra los demás con el Programa de Control!
El objetivo de este desafío es hacer que una IA gane una pelea contra otra IA dibujando estratégicamente un muro en una cuadrícula de 25x25 para bloquear al oponente.
Entrada
25 líneas separadas por y terminando con ;
un argumento de línea de comando. Esto incluirá:
- Espacios vacíos
.
- Paredes
#
- Jugadores
1
y2
(El oponente es siempre2
)
Ejemplo
###############..........;..............#..........;..............#..........;..............#..........;..............#..........;...........1###..........;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;...................###...;...................#.##..;2..................#..#..;#..................##.#..;#...................#.###;....................#####;
que representa el siguiente mapa:
###############..........
..............#..........
..............#..........
..............#..........
..............#..........
...........1###..........
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...................###...
...................#.##..
2..................#..#..
#..................##.#..
#...................#.###
....................#####
Salida
Una cadena escrita en la consola que comienza con el personaje que representa la dirección en la que la IA desea girar. ¡Esto es sensible a mayúsculas y minúsculas!
- norte
N
- Este
E
- Sur
S
- Oeste
W
- Renunciar (cualquier otra cosa)
Ejemplo
W
Reglas del juego
- A medida que las IA se mueven, dejarán un rastro sólido de paredes detrás de ellas.
- Los jugadores comienzan en las esquinas superior izquierda e inferior derecha
- El juego dura hasta que cualquier IA golpea una pared o las IA chocan entre sí.
- Una IA gana si su oponente se estrella primero
- No hay ganador ni perdedor si las IA pierden al mismo tiempo.
- Si una IA se sale de un borde de la cuadrícula, continúan en la misma dirección desde el otro lado.
Rankings
1er lugar - FloodBot (Java, 12 victorias)
2do lugar - FluidBot (Python, 9 victorias)
3er lugar - FillUpBot (C ++, 8 victorias)
4to lugar - AwayBot (Ruby, 5 victorias)
5to lugar - ArcBot (Python, 4 victorias)
6to lugar - BlindSnake (Lote, 2 victorias)
6to lugar - RandomBot (C #, 2 victorias)
Programa de control (probado para Python 3.3.3)
El programa se ejecuta con argumentos de los dos comandos y un único argumento ( ""
si no es necesario) para los AI, por ejemplo. Control.py "ruby" "AwayBot.rb" "FillUpBot.exe" ""
. Se puede descargar aquí .
import sys, subprocess
Program1, Argument1, Program2, Argument2, Player1, Player2, Grid = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], [0, 0], [24, 24], [['.' for y in range(25)] for x in range(25)]
while True:
Str = ''
for x in range(25):
for y in range(25):
if Grid[x][y] == '1' or Grid[x][y] == '2':
Grid[x][y] = '#'
Grid[Player1[0]][Player1[1]] = '1'
Grid[Player2[0]][Player2[1]] = '2'
for y in range(25):
for x in range(25):
Str += Grid[x][y]
Str += ';'
if Argument1 == '':
move = subprocess.Popen([Program1, Str], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
else:
move = subprocess.Popen([Program1, Argument1, Str], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
Lose1 = False
if move == 'N':
if Player1[1] > 0:
Player1[1] -= 1
else:
Player1[1] = 24
elif move == 'E':
if Player1[0] < 24:
Player1[0] += 1
else:
Player1[0] = 0
elif move == 'S':
if Player1[1] < 24:
Player1[1] += 1
else:
Player1[1] = 0
elif move == 'W':
if Player1[0] > 0:
Player1[0] -= 1
else:
Player1[0] = 24
else:
Lose1 = True
if Grid[Player1[0]][Player1[1]] == '#' or Grid[Player1[0]][Player1[1]] == '2':
Lose1 = True
print('Player 1:', move)
if Argument2 == '':
move = subprocess.Popen([Program2, Str.replace('2','3').replace('1','2').replace('3','1')], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
else:
move = subprocess.Popen([Program2, Argument2, Str.replace('2','3').replace('1','2').replace('3','1')], stdout=subprocess.PIPE).stdout.read().decode('ASCII')[0]
Lose2 = False
if move == 'N':
if Player2[1] > 0:
Player2[1] -= 1
else:
Player2[1] = 24
elif move == 'E':
if Player2[0] < 24:
Player2[0] += 1
else:
Player2[0] = 0
elif move == 'S':
if Player2[1] < 24:
Player2[1] += 1
else:
Player2[1] = 0
elif move == 'W':
if Player2[0] > 0:
Player2[0] -= 1
else:
Player2[0] = 24
elif Lose1:
Lose2 = True
else:
Lose2 = True
print('Player 2:', move)
print(Str.replace(';', '\n'))
if Grid[Player2[0]][Player2[1]] == '#':
Lose2 = True
if Lose1 and Lose2:
print('Draw!')
break
elif Lose1:
print('Player 2 wins!')
break
elif Lose2:
print('Player 1 wins!')
break
fuente
Respuestas:
Floodbot
Java
Este tipo tiene que ver con la evitación. No le importa tratar de atrapar al oponente, solo quiere vivir. Para hacer eso, inunda cada dirección para ver qué camino conducirá al área abierta más grande.
También cree que el enemigo es impredecible, por lo que trata cada cuadrado que los rodea inmediatamente como si ya fuera un muro. Si eso no conduce a una dirección posible, recurre al mapa "real".
fuente
Serpiente ciega
Lote
Este bot solo observa sus alrededores cercanos. Si no hay un muro, se mueve allí.
Solo quería crear un bot en lote ... Y nunca lo volveré a hacer
fuente
FluidBot
Python 3
Toma el camino de menor resistencia e intenta predecir al oponente
Trabajé en esto durante aproximadamente una hora. ._.
Probado contra AwayBot:
FillUpBot:
EDITAR 5 : Más consciente del futuro; intenta evitar cerrar áreas (a menos que, por supuesto, el oponente esté en ella).
EDIT 4 : código limpiado.
EDIT 3 : funciona mejor para áreas de juego rectangulares.
EDIT 2 : código más limpio, el algoritmo es más lógico y predice algunos movimientos hacia el futuro
EDITAR : Algoritmo más defensivo, no cuenta al fantasma como espacio vacío.
fuente
AusenteBot
escrito en Ruby (1.9)
Bien llamado, AwayBot intenta alejarse de cualquier obstáculo. Busca un cuadrado de 15x15 a su alrededor, pondera las direcciones en consecuencia y elige la dirección con la menor cantidad de obstáculos. (Esto también significa que evita los bordes, lo cual es bueno para que no quede atrapado en ellos).
También considera que las paredes cercanas son más peligrosas. Los muros justo al lado tienen mucho más peso que los muros que están lejos.
Para su entrada de muestra, sale
S
. Los pesos para cada dirección de la entrada de muestra son[["N", 212], ["E", 140], ["S", 0], ["W", 84]]
.Interjección: Acabo de notar que la arena se envuelve. Pues bien, mi técnica para evitar bordes no tiene sentido ahora, pero meh. Tal vez lo arreglemos más tarde.
fuente
ARGF.argv[0].chomp
lugar degets.chomp
en la primera línea!FillUpBot
escrito en C ++
No piense que voy a ganar, pero de todos modos, aquí está mi intento:
Su compilador estándar de C ++ debería poder manejar esto.
fuente
#include <cstdlib>
Ayuda? (Solo insértela en la parte superior como una nueva línea)Arcbot
Python 3
Juega con un algoritmo basado en la agresión mientras el enemigo y las fuerzas brutas responden con influencia
Supongo que este algoritmo está 'basado en la emoción'. Al desarrollar esto, me di cuenta de que FluidBot lo venció casi siempre. Arcbot no es el algoritmo más rápido ni el mejor, pero tiene sus puntos fuertes.
Se hace chocar contra las paredes. No tengo idea de por qué.
FLUIDBOT ES MEJOR
EDITAR : Ajustó los números y la fórmula, ahora juega mejor, pero aún pierde con Fluidbot.
EDIT 2 : Whoops, olvidé cambiar algún código.
fuente
RandomBot
C#
RandomBot selecciona aleatoriamente una dirección hasta que su ruta esté libre. Si no hay una dirección segura, simplemente escribe
*
y pierde.fuente
Fill Up Bot (gira 90 grados en sentido antihorario, cuando se enfrenta a un obstáculo
C ++
En mi código, los dos jugadores (1 y 2) intentan inundar. Es decir, cada vez que enfrentan un obstáculo, giran en sentido antihorario.
Recuerde, las líneas en la entrada están separadas por a
space
onewline
y no por;
fuente