#08: "Pong"
Typ: Spezial
Deadline: 07.09.2008
Abgabe: contest@spieleprogrammierer.de
Bitte beachten:
- Ablauf und Regeln
Aufgabenstellung:
Da die Art der bisherigen Aufgaben teilweise kritisiert wurde, habe ich mir für den 8. Contest etwas Anderes überlegt.
Ihr sollt eine KI für das altbekannte Pong-Spiel schreiben. Am Ende wird jeder gegen jeden spielen (3 Punkte für Sieg, 1 Punkt für Untentschieden), und derjenige mit den meisten Punkten gewinnt.
Die Funktion, die ihr implementieren müsst, sieht wie folgt aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
// >>> DEINE FUNKTION - BITTE IMPLEMENTIEREN! <<<
int my_pong(const GameState& gs, // Spielzustand
uint me) // Welcher Spieler bin ich? (0 oder 1)
{
// Rückgabewert:
// -1: nach oben bewegen
// 0: nicht bewegen
// 1: nach unten bewegen
return 0;
}
|
Der GameState-Parameter "gs" enthält alle wichtigen Spielinformationen wie die Position der beiden Schläger und ihre Geschwindigkeit, die Position und die Geschwindigkeit des Balls, die Punktzahl, die aktuelle Zeit und die Namen der Spieler.
Der Parameter "me" enthält den Index des Spielers, der von der KI gesteuert wird. Das kann 0 (KI ist Spieler 1, also links) oder 1 (KI ist Spieler 2, also rechts) sein. Spieler 1 ist immer bei x = 0, Spieler 2 ist immer bei x = FIELD_WIDTH.
In diesem Contest sind statische Variablen erlaubt.
Es gibt keine festes Zeitlimit für die Funktion, aber sie sollte sich im Rahmen halten und das Spiel nicht unnötig abbremsen.
Weiterhin gibt es noch ein paar globale Konstanten, wie die Größe des Spielfelds und der Schläger, die Beschleunigung und die Dämpfung der Schlägerbewegung. Wie sich diese auswirken, entnehmt ihr am besten dem Quellcode. Diese Konstanten werden auch bei der Auswertung dieselben Werte haben. Ihr könnt sie also benutzen oder direkt mit den Zahlwerten arbeiten. Beachtet, dass die Bewegung der Schläger die Abprallrichtung des Balls beeinflusst!
Eine sehr simple Referenz-KI ist bereits gegeben, sowie eine Funktion, die ein Spiel zwischen zwei KIs austrägt, falls erwünscht auch mit Visualisierung.
Für die Visualisierung habe ich eine Win32- und eine X11-Version programmiert. Die X-Version habe ich aber nur in einer Virtual Machine getestet, und ich habe praktisch keine Erfahrung mit X. Wenn also jemand von euch noch Verbesserungen vornehmen möchte, dann soll er das bitte tun.
Mit den Plus- und Minus-Tasten (bei X11 nur auf dem Numpad) kann man die Geschwindigkeit regulieren. Wird das Fenster geschlossen, wird das Spiel in maximaler Geschwindigkeit zu Ende gespielt, und das Ergebnis wird auf der Konsole ausgegeben.
Paket hier herunterladen
Das Paket enthält ein Code::Blocks-Projekt mit 4 Build-Targets: Win32 Debug, Win32 Release, X11 Debug und X11 Release. Wählt bitte das für euer Betriebssystem passende Target!
Bei Fragen oder Problemen - die bestimmt auftauchen werden - einfach hier melden.
Viel Spaß!