Remarquer
Ce défi est terminé et ne sera pas réévalué, mais n'hésitez pas à poster des réponses et à tester votre programme par rapport aux autres avec le programme de contrôle!
Le but de ce défi est de faire une IA pour gagner un combat contre une autre AI en dessinant stratégiquement un mur sur une grille 25x25 pour bloquer l'adversaire.
Contribution
25 lignes séparées par et se terminant par ;
comme argument de ligne de commande. Cela comprendra:
- Espaces vides
.
- Des murs
#
- Joueurs
1
et2
(L'adversaire est toujours2
)
Exemple
###############..........;..............#..........;..............#..........;..............#..........;..............#..........;...........1###..........;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;...................###...;...................#.##..;2..................#..#..;#..................##.#..;#...................#.###;....................#####;
qui représente la carte suivante:
###############..........
..............#..........
..............#..........
..............#..........
..............#..........
...........1###..........
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...................###...
...................#.##..
2..................#..#..
#..................##.#..
#...................#.###
....................#####
Production
Une chaîne écrite sur la console commençant par le caractère représentant la direction dans laquelle l'IA souhaite tourner. C'est sensible à la casse!
- Nord
N
- est
E
- Sud
S
- Ouest
W
- Abandonner (rien d'autre)
Exemple
W
Regles du jeu
- Au fur et à mesure que les IA se déplacent, elles laisseront une traînée solide de murs derrière elles.
- Les joueurs commencent dans les coins supérieur gauche et inférieur droit
- Le jeu dure jusqu'à ce qu'une IA frappe un mur ou que les IA se percutent.
- Une IA gagne si son adversaire plante en premier
- Il n'y a pas de gagnant ou de perdant si les IA perdent en même temps.
- Si une IA sort d'un bord de la grille, elle continue dans la même direction de l'autre côté.
Classements
1ère place - FloodBot (Java, 12 victoires)
2e place - FluidBot (Python, 9 victoires)
3e place - FillUpBot (C ++, 8 victoires)
4e place - AwayBot (Ruby, 5 victoires)
5e place - ArcBot (Python, 4 victoires)
6e place - BlindSnake (lot, 2 victoires)
6e place - RandomBot (C #, 2 victoires)
Programme de contrôle (testé pour Python 3.3.3)
Le programme est exécuté avec des arguments des deux commandes et un seul argument ( ""
si non requis) pour les IA par exemple. Control.py "ruby" "AwayBot.rb" "FillUpBot.exe" ""
. Il peut être téléchargé ici .
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