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
la source
Réponses:
Floodbot
Java
Ce gars est tout au sujet de l'évitement. Il ne se soucie pas d'essayer de piéger l'adversaire, il veut juste vivre. Pour ce faire, il remplit chaque direction d'inondation pour voir quel chemin mènera à la plus grande zone ouverte.
Il pense également que l'ennemi est imprévisible, alors il traite chaque case qui les entoure immédiatement comme étant déjà un mur. Si cela ne mène à aucune direction possible, il revient à la carte "réelle".
la source
BlindSnake
Lot
Ce bot ne regarde que son environnement proche. S'il n'y a pas de mur, il s'y déplace.
Je voulais juste créer un bot en batch ... Et je ne le referai plus jamais
la source
FluidBot
Python 3
Prend le chemin de moindre résistance et tente de prédire l'adversaire
J'ai travaillé dessus pendant environ une heure. ._.
Testé contre AwayBot:
FillUpBot:
EDIT 5 : Plus tourné vers l'avenir; essaie d'éviter de fermer des zones (à moins, bien sûr, que l'adversaire ne s'y trouve).
EDIT 4 : code nettoyé.
EDIT 3 : Fonctionne mieux pour les zones de jeu rectangulaires.
EDIT 2 : code plus propre, l'algorithme est plus logique et prédit certains mouvements dans le futur
EDIT : algorithme plus défensif, ne compte pas le fantôme comme espace vide.
la source
AwayBot
écrit en Ruby (1.9)
Bien nommé, AwayBot essaie de s'éloigner de tout obstacle. Il recherche un carré de 15x15 autour de lui, pondère les directions en conséquence et choisit la direction avec le moins d'obstacles. (Cela signifie également qu'il évite les bords, ce qui est bien pour ne pas s'y coincer.)
Il considère également que les murs plus proches sont plus dangereux. Les murs juste à côté sont plus lestés que les murs éloignés.
Pour votre échantillon d'entrée, il sort
S
. Les poids pour chaque direction de l'entrée d'échantillon sont[["N", 212], ["E", 140], ["S", 0], ["W", 84]]
.Interjection: Je viens de remarquer que l'arène s'enroule. Eh bien, ma technique d'évitement des bords est quelque peu inutile maintenant, mais meh. Je vais peut-être le réparer plus tard.
la source
ARGF.argv[0].chomp
au lieu degets.chomp
la première ligne!FillUpBot
écrit en C ++
Ne pensez pas que je vais gagner, mais voici quand même ma chance:
Votre compilateur C ++ standard devrait être capable de gérer cela.
la source
#include <cstdlib>
aide? (Il suffit de l'insérer en haut comme une nouvelle ligne)Arcbot
Python 3
Joue avec un algorithme basé sur l'agression alors que l'ennemi et les bruteforces répondent avec influence
Cet algorithme est en quelque sorte «basé sur les émotions», je suppose. En développant cela, j'ai réalisé que FluidBot le battait presque à chaque fois. Arcbot n'est pas l'algorithme le plus rapide ni le meilleur, mais il a ses points forts.
Il ne plantage dans les murs. Je ne sais pas pourquoi.
FLUIDBOT EST MIEUX
EDIT : Ajusté les nombres et la formule, il joue mieux maintenant mais perd toujours contre Fluidbot.
EDIT 2 : Oups, j'ai oublié de changer un code.
la source
RandomBot
C #
RandomBot sélectionne au hasard une direction jusqu'à ce que son itinéraire soit libre. S'il n'y a pas de direction sûre, il tape simplement
*
et perd.la source
Fill Up Bot (tourne à 90 degrés dans le sens inverse des aiguilles d'une montre, face à un obstacle
C ++
Dans mon code, les deux joueurs (1 et 2) tentent de déborder. Cela signifie que chaque fois qu'ils font face à un obstacle, ils tournent dans le sens inverse des aiguilles d'une montre.
Rappelez-vous, les lignes en entrée sont séparées par un
space
ounewline
et non par;
la source