Programmieren Sie Pac-Man
Rahmen
Sie spielen als Pac-Man. Sie möchten Pellets, Obst und Kraftpellets vor allen anderen sammeln und dabei Geister ausweichen.
Regeln
- Jeder gültige Pac-Man befindet sich in einem einzigen Labyrinth. Der Spieler mit der höchsten kumulativen Punktzahl nach 10 Spielen gewinnt.
- Ein Spiel ist beendet, wenn alle Pac-Men tot sind, alle Pellets verschwunden sind oder 500 Runden vergangen sind
- Wenn ein Pac-Man stirbt, spielt er weiterhin als Geist
- Wenn du ein Power-Pellet isst, bist du 10 Runden lang unbesiegbar und kannst Geister essen
- Das Essen eines Geistes teleportiert den Geist an einen zufälligen Ort
- Geister können nichts außer Pac-Men essen und bekommen keine Punkte
- Wenn Sie die folgenden Gegenstände als Pac-Man essen, erhalten Sie die folgenden Punkte:
- Pellet: 10
- Kraftpellet: 50
- Frucht: 100
- Geist: 200
Das Labyrinth
Wenn es n Pac-Männer, dann ein Labyrinth von Größe sqrt(n)*10
von sqrt(n)*10
generiert mit Prim-Algorithmus (aufgrund seiner niedrigen Fluss - Faktor), dann vollständig geflochten, bevorzugt zu geben , um bereits bestehende Sackgassen. Darüber hinaus kann dieses Flechten über die Kanten erfolgen, so dass es einige Wege von oben nach unten und von links nach rechts gibt.
Es wird____geben:
2n
Geister4n
Kraftpellets2n
Obstn
Pac-Men an Stellen, an denen verbundene Nachbarfelder leer sind.- Alle verbleibenden leeren Stellen werden mit Pellets gefüllt
Daher sieht eine erste Karte mit 10 Spielern ungefähr so aus (Ghosts = grün, Pellets = aqua, fruit = rot, Pac-Man = gelb):
Input-Output
Zu Beginn des Spiels erhalten Sie eine einzelne Zeichenreihe, die die Wände in jedem Quadrat der Karte darstellt. Für jedes Quadrat, das oben links beginnt, sich nach rechts bewegt und in die nächste Zeile übergeht, erhalten Sie eine hexadezimale Zahl, die die Wandsituation darstellt:
0: No walls
1: North wall
2: East wall
3: East & North wall
4: South wall
5: South & North wall
6: South & East wall
7: Won't occur
8: West wall
9: West & North wall
A: West & East wall
B: Won't occur
C: West & South wall
D: Won't occur
E: Won't occur
F: Won't occur
Einfach ausgedrückt: Nord = 1, Ost = 2, Süd = 4 und West = 8, addiert.
Danach erhalten Sie in jeder Runde Ihre aktuelle Position und die Objekte in Ihrer Sichtlinie (wenn Sie ein Pac-Man sind. Alle Geister erhalten alle Quadrate von -5 bis +5 von ihrer relativen Position). Ihre Sichtlinie richtet sich nach der Richtung, in die Sie zuletzt gefahren sind. Wenn Sie nach Norden gereist sind, werden Ihnen alle Quadrate direkt nördlich, östlich und westlich von Ihnen angezeigt, bis eine Wand Ihre Sicht abschneidet und ein einzelnes Quadrat nordwestlich und nordöstlich, wenn keine Wand Ihre Sicht abschneidet. Wenn Sie sich nicht bewegen, erhalten Sie die Quadrate in alle 8 Richtungen.
Für das Visuelle I
bedeutet "unsichtbar", V
"sichtbar", P
"Pac-Man" (vorausgesetzt, Pac-Man ist nach Norden ausgerichtet):
|I I|V|I|
|I V|V V|
|V V P|I|
|I I|I|I|
Jedes Quadrat wird durch eine Koordinate angegeben, und dann ist es Inhalt. Der Inhalt wird durch die folgenden Zeichen dargestellt:
P
: 1 oder mehr Pac-ManG
: 1 oder mehr Geistero
: PelletO
: KraftpelletF
: Stück ObstX
: Nichts
Wenn sich ein Geist und etwas anderes auf einem Feld befindet, G
wird es zurückgegeben.
Wenn Sie sich also auf einem Platz befinden 23,70
, sind Sie gerade nach Norden gezogen, der Platz über Ihnen ist eine Sackgasse und enthält ein Power-Pellet, und Sie haben auf beiden Seiten Wände. Ihre Eingabe wäre:
23,70X 22,70O
Auf Ihrem aktuellen Feld wird G
ein angezeigt, wenn Sie ein Geist sind, ein, P
wenn sich ein anderer Pac-Man auf Ihrem Feld befindet, andernfalls einX
Anschließend senden Sie folgende Artikel über STDOUT zurück:
Ein einzelnes Zeichen, das eine Richtung darstellt ( N
orth, E
ast, S
outh, W
est oder X
Stay).
Vor dem Übergeben einer Richtung können Sie auch eine beliebige Koordinate als übergeben x,y
, und die Wände dieses Quadrats werden zurückgegeben (wie oben beschrieben).
Das Programm muss so lange ausgeführt werden, bis Q
es über STDIN an das Programm übergeben wird. Die Programme werden für jedes Spiel neu gestartet.
Der Zugriff auf andere Informationen außerhalb dessen, was an STDIN weitergegeben wird (einschließlich anderer Pac-Men's-Daten oder der Daten, die vom Host-Programm gespeichert werden), ist nicht zulässig.
Wenn Sie innerhalb von 1000 ms keine Bewegung zurückgeben, wird das Programm beendet (läuft auf meinem recht ordentlichen Win8-Computer). Sie erhalten 2 Sekunden Zeit, um das anfängliche Labyrinth-Layout zu verarbeiten, wenn es angegeben wird
Der Host wird in Python geschrieben, und der Code zum Testen Ihres Bot ist in Vorbereitung.
Ausnahmefällen
- Wenn mehrere Pac-Men am selben Ort landen, erhält keiner den Inhalt des aktuellen Quadrats, es sei denn, genau einer von ihnen ist unbesiegbar. In diesem Fall erhält der unbesiegbare Pac-Man das Pellet.
- Ein von einem Geist gefressener Pac-Man wird nicht woanders teleportiert. Wenn sich zwei Pac-Men auf einem Feld befinden und einer unbesiegbar ist, wird der Geist teleportiert.
- Als Geist teleportiert zu werden, hindert Sie daran, sich 1 Runde lang zu bewegen. Wenn Sie als Ghost spielen, wird Ihr Zug einfach übersprungen
- Der Versuch, sich durch eine Wand zu bewegen, wird als "Bleiben" interpretiert.
Jeder der anfänglichen Geister erhält eines der 4 Persönlichkeitsmerkmale, wie hier beschrieben , mit der folgenden Modifikation:
- Die beschriebenen Fehler werden nicht dupliziert
- Sie werden alle von Anfang an aktiv sein
- Sie sind nur für den Spieler anfällig, der das Pellet gegessen hat
- Sie wechseln auf unbestimmte Zeit von Streuung zu Verfolgung und haben jeweils eine feste Anzahl von Windungen vor dem Wechsel
- Nach dem Wechsel zu Chase finden sie den nächsten zu jagenden Pac-Man und jagen diesen Pac-Man für die Dauer ihrer Jagd. (Wenn es einen Gleichstand für die Nähe gibt, wird der Pac-Man pseudozufällig ausgewählt.)
- Blinky beschleunigt nicht
- Inky wählt den nächsten Geist aus, um seine Berechnungen nach dem Wechsel zu Chase zu stützen.
- Clyde findet alle Spieler in 8 Feldern Entfernung und folgt dann dem am weitesten entfernten Spieler.
- Alle Geister außer Clyde zielen nicht auf einen Spieler, der weiter als 5 Felder entfernt ist
Ich akzeptiere kompilierbaren Code aus einer Standardsprache oder einer .exe (mit zugehörigem Code).
Programmiertipps
Sie können mit meinem Controller. Sie müssen einen / bots / your_bot_name / -Ordner im selben Verzeichnis wie das Programm ablegen. Innerhalb des Ordners müssen Sie eine command.txt hinzufügen, die einen Befehl zum Ausführen Ihres Programms (zB:) python my_bot.py
und den Ihres Bot enthält.
Der Controller-Code ist auf Github (Python-Code, erfordert Pygame, wenn Sie Grafiken möchten.) Getestet unter Windows und Linux
ERGEBNISSE
Ghostbuster: 72.840 Punkte
Pathisch: 54.570 Punkte
kurzsichtig: 50.820 Punkte
Interaktion vermeiden: 23.580 Punkte
Physiker: 18.330 Punkte
Randomwalk: 7.760 Punkte
Dumbpac: 4.880 Punkte
quelle
Antworten:
GhostBuster - Python
Wählt einen zufälligen Punkt auf der Karte und verwendet den A * -Algorithmus, um den besten Weg vorwärts zu finden. Sobald es sein Ziel erreicht hat, wählt es ein neues aus und fährt fort. Es wird versuchen, Geister zu vermeiden, aber mit dem begrenzten FOV wird es gelegentlich auf sie stoßen. Es wird vermieden, auf bereits besuchten Stellen zu laufen.
Verwendet einen Code von Sparr, danke für die Logik.
Windows 7, Visual Studios mit Python-Tools. Sollte auf Linux-Boxen funktionieren.
quelle
kurzsichtig
Dieser Schritt vermeidet benachbarte Geister, es sei denn, er kann sie essen, bewegt sich auf benachbarte Früchte oder Pellets und geht als letztes Mittel nach dem Zufallsprinzip.
quelle
vermeiden
Vermeiden Sie alle Geister als Pacman und alle Pacmen als Ghost. Versucht, wenn möglich jede eigene Art zu vermeiden, und vermeidet dann, wenn möglich, das Drehen um 180.
quelle
Physiker, Haskell
Der Physiker Pac-Man glaubt, dass Newtons Gesetz der universellen Gravitation ihm helfen kann, das Spiel zu gewinnen. Dann wendet er es einfach auf alle anderen Objekte an, die er während des Spiels kennt. Da der Physiker alt ist und schlechtes Gedächtnis hat, kann er sich nur an 5 Runden erinnern. Hooooly, das schlechte Gedächtnis hilft ihm tatsächlich, besser zu punkten.
Diese Antwort hat zwei Dateien:
Main.hs
, enthält den interessanten Teil.Pacman.hs
, nur ein bisschen langweiliger Code, der das Protokoll handhabt. Sie können es verwenden, um Ihre eigene Haskell-Lösung zu schreiben. Es enthält keinen AI-Code.Oh, warte, wir haben auch eine
Makefile
.Da kommen sie:
Main.hs
Pacman.hs
Makefile
command.txt
quelle
Main' Expected
Pacman '", wenn ich versuche, ihn zu erstellen. Muss ich es auch nur machen, um es auszuführen, oder gibt es einen anderen Befehl, den ich ausführen muss?physicist
ausführbare Datei ausführen.command.txt
Jetzt bearbeitet und hinzugefügt .physicist.hs
inMain.hs
. Ich habe die Antwort aktualisiert.Dummkopf
Dieses Tempo bewegt sich zufällig, ohne Rücksicht auf das Labyrinth-Layout oder Geister oder andere Faktoren.
Perl:
Python:
quelle
zielloser Spaziergang
Dieser Schritt geht nach dem Zufallsprinzip, aber nicht in Wände
quelle
Pathy, Python 3
Dieser Bot nutzt den Weg, um viel zu finden. Bei einer gegebenen Startposition und Endbedingung verwendet es das einfache BFS, um den kürzesten Weg zu finden. Die Wegfindung wird verwendet in:
command.txt
pathy.py
quelle
objects = [(tuple(map(int, x[:-1].split(',')))[::-1], x[-1]) for x in line.split(' ')]
wirft einValueError: invalid literal for int() with base 10: '8o'