Beachten
Diese Herausforderung ist beendet und wird nicht neu bewertet. Sie können jedoch gerne Antworten posten und Ihr Programm mit dem Kontrollprogramm gegen die anderen testen!
Das Ziel dieser Herausforderung ist es, eine KI dazu zu bringen, einen Kampf gegen eine andere KI zu gewinnen, indem strategisch eine Wand auf einem 25x25-Gitter gezogen wird, um den Gegner zu blockieren.
Eingang
25 Zeilen, die durch ;
ein Befehlszeilenargument getrennt sind und mit enden . Dies beinhaltet:
- Leere Räume
.
- Wände
#
- Spieler
1
und2
(Der Gegner ist immer2
)
Beispiel
###############..........;..............#..........;..............#..........;..............#..........;..............#..........;...........1###..........;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;.........................;...................###...;...................#.##..;2..................#..#..;#..................##.#..;#...................#.###;....................#####;
welches die folgende Karte darstellt:
###############..........
..............#..........
..............#..........
..............#..........
..............#..........
...........1###..........
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
...................###...
...................#.##..
2..................#..#..
#..................##.#..
#...................#.###
....................#####
Ausgabe
Eine Zeichenfolge, die in die Konsole geschrieben wird und mit dem Zeichen beginnt, das die Richtung darstellt, in die sich die KI drehen möchte. Dies ist Groß- und Kleinschreibung!
- Norden
N
- Osten
E
- Süd
S
- Westen
W
- Gib auf (alles andere)
Beispiel
W
Spielregeln
- Wenn sich die AIs bewegen, hinterlassen sie eine feste Spur von Mauern.
- Die Spieler beginnen in der oberen linken und unteren rechten Ecke
- Das Spiel dauert so lange, bis eine KI gegen eine Wand stößt oder die KIs ineinander stoßen.
- Eine KI gewinnt, wenn ihr Gegner zuerst abstürzt
- Es gibt keinen Gewinner oder Verlierer, wenn beide AIs gleichzeitig verlieren.
- Wenn eine KI eine Kante des Gitters verlässt, geht sie von der anderen Seite in dieselbe Richtung weiter.
Ranglisten
1. Platz - FloodBot (Java, 12 Siege)
2. Platz - FluidBot (Python, 9 Siege)
3. Platz - FillUpBot (C ++, 8 Siege)
4. Platz - AwayBot (Ruby, 5 Siege)
5. Platz - ArcBot (Python, 4 Siege)
6. Platz - BlindSnake (Batch, 2 Siege)
6. Platz - RandomBot (C #, 2 Siege)
Steuerungsprogramm (getestet für Python 3.3.3)
Das Programm wird mit Argumenten der beiden Befehle und einem einzelnen Argument ( ""
falls nicht erforderlich) für die AIs ausgeführt, z. Control.py "ruby" "AwayBot.rb" "FillUpBot.exe" ""
. Es kann hier heruntergeladen werden .
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
quelle
Antworten:
Floodbot
Java
Bei diesem Typen dreht sich alles um Vermeidung. Er will nicht versuchen, den Gegner zu fangen, er will nur leben. Dazu füllt er jede Richtung mit Flut, um zu sehen, welcher Weg zum größten offenen Bereich führt.
Er hält den Feind auch für unvorhersehbar und behandelt jedes Feld, das ihn unmittelbar umgibt, als bereits eine Mauer. Wenn dies zu keiner möglichen Richtung führt, greift er auf die "tatsächliche" Karte zurück.
quelle
BlindSnake
Stapel
Dieser Bot beobachtet nur seine nahe Umgebung. Wenn es keine Mauer gibt, bewegt sie sich dorthin.
Ich wollte nur einen Bot im Batch erstellen ... und werde es nie wieder tun
quelle
FluidBot
Python 3
Nimmt den Weg des geringsten Widerstands und versucht, den Gegner vorherzusagen
Ich habe ungefähr eine Stunde daran gearbeitet. ._.
Getestet gegen AwayBot:
FillUpBot:
EDIT 5 : Zukunftsbewusster; versucht zu vermeiden, Bereiche zu schließen (es sei denn, der Gegner befindet sich darin).
EDIT 4 : Bereinigter Code.
EDIT 3 : Funktioniert besser für rechteckige Spielbereiche.
EDIT 2 : Saubererer Code, Algorithmus ist logischer und sagt einige Schritte in die Zukunft voraus
EDIT : Defensiverer Algorithmus, zählt Ghost Self nicht als leeren Raum.
quelle
AwayBot
geschrieben in Ruby (1.9)
Passend benannt, versucht AwayBot, sich von Hindernissen zu entfernen. Es sucht ein 15x15-Quadrat um sich herum, gewichtet die Richtungen entsprechend und wählt die Richtung mit der geringsten Anzahl von Hindernissen. (Dies bedeutet auch, dass die Kanten vermieden werden, was gut ist, damit es nicht in ihnen eingeklemmt wird.)
Es betrachtet auch Wände in der Nähe als eine größere Gefahr. Wände direkt daneben sind viel schwerer als weit entfernte Wände.
Für Ihre Probeneingabe wird ausgegeben
S
. Die Gewichte für jede Richtung der Probeneingabe sind[["N", 212], ["E", 140], ["S", 0], ["W", 84]]
.Interjektion: Ich habe gerade bemerkt, dass sich die Arena umhüllt. Nun, meine Technik zur Kantenvermeidung ist jetzt etwas sinnlos, aber meh. Vielleicht werde ich es später beheben.
quelle
ARGF.argv[0].chomp
nichtgets.chomp
in der ersten Zeile!FillUpBot
geschrieben in C ++
Ich glaube nicht, dass ich gewinnen werde, aber hier ist mein Ziel:
Ihr Standard-C ++ - Compiler sollte dies verarbeiten können.
quelle
#include <cstdlib>
? (Arcbot
Python 3
Spiele mit aggressivem Algorithmus als Feind und Bruteforces antworten mit Einfluss
Dieser Algorithmus basiert auf Emotionen, denke ich. Bei der Entwicklung wurde mir klar, dass FluidBot es fast jedes Mal schlug. Arcbot ist weder der schnellste noch der beste Algorithmus, aber es hat seine Stärken.
Es stößt gegen Wände. Keine Ahnung warum.
FLUIDBOT IST BESSER
EDIT : Die Zahlen und die Formel wurden angepasst, es spielt sich jetzt besser, verliert aber immer noch gegen Fluidbot.
EDIT 2 : Hoppla, ich habe vergessen, einen Code zu ändern.
quelle
RandomBot
C #
RandomBot wählt zufällig eine Richtung aus, bis die Route frei ist. Wenn es keine sichere Richtung gibt, tippt es einfach
*
und verliert.quelle
Füllen Sie den Bot auf (dreht sich um 90 Grad gegen den Uhrzeigersinn, wenn Sie einem Hindernis gegenüberstehen
C ++
In meinem Code versuchen die beiden Spieler (1 und 2) zu fluten. Das heißt, wenn sie auf ein Hindernis stoßen, drehen sie sich gegen den Uhrzeigersinn.
Denken Sie daran, dass die eingegebenen Zeilen durch ein
space
odernewline
und nicht durch getrennt sind;
quelle