Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

1

16.08.2008, 13:30

#08: "Pong", Spezial, 07.09.2008

#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ß!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

16.08.2008, 13:53

die idee gefällt mir sehr, da ich gegen 0 erfahrung KI habe. da werd ich mich 100pro ntran versuchen, super David!

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

3

16.08.2008, 13:58

Sehr coole Sache. Ist da nicht ein Fehler drin:

C-/C++-Quelltext

1
2
3
4
if(gs.player_y[i] - 0.5f * PADDLE_SIZE < 0.0f)
   gs.player_y[i] = 0.5f * PADDLE_SIZE, gs.player_vy[i] = 0.0f;
else if(gs.player_y[i] + 0.5f * PADDLE_SIZE > 1.0f)
   gs.player_y[i] = 1.0f - 0.5f * PADDLE_SIZE; // Geschwindigkeit ebenfalls auf 0 setzen?!?
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

16.08.2008, 14:10

Ja. Danke!
Hab's korrigiert.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

5

16.08.2008, 14:25

Noch eine Frage zu den Regeln / Festlegungen:

Das Ganze spielt sich ja im Rahmen von x=0<->2, y=0<->1 ab. Befindet sich Spieler 0 immer bei x=0, Spieler 1 immer bei x=2? Und hat das Feld immer die Breite 2? Wenn diese Umstände miteinbezogen werden dürfen, sollten sie sich noch in den Konstanten oder in Gamestate (player_x) wiederfinden - wenn nicht, sollte das vielleicht noch explizit erwähnt werden. :-)

Außerdem:

Die Update-Funktion akzeptiert beliebige Integer-Werte, weshalb nicht ganz klar ist, ob die Werte nun nur 1,0 und -1 sein dürfen oder auch darüber / darunter.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

6

16.08.2008, 14:28

Die Aufgabe ist doch mal klasse!

Werde sicher mitmachen, wenn ich Zeit finde.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Atlan123

1x Contest-Sieger!

  • Private Nachricht senden

7

16.08.2008, 14:51

Super Aufgabe! Wenn der Job es zuläßt, bin ich dabei! :)
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." (Bjarne Stroustrup)

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

16.08.2008, 14:54

Soll die KI für beide Seiten funktionieren oder nur für die Rechte?

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

16.08.2008, 15:01

Ich habe das Paket aktualisiert!

@BlazeX:
Für beide Seiten.
Aber mit ganz wenig Aufwand kannst du den Spielzustand so ändern, dass du es nur für eine der beiden Seiten machen musst.

@CodingCat:
Danke für den Hinweis.
Man darf nur -1, 0 oder 1 liefern. Alle anderen Werte werden jetzt wie 0 behandelt.
Spieler 1 ist immer bei x = 0.
Spieler 2 ist immer bei x = FIELD_WIDTH.

Die Konstanten FIELD_WIDTH, FIELD_HEIGHT, PADDLE_SIZE usw. werden auch bei der Auswertung dieselben Werte haben. Ihr könnt sie also benutzen oder direkt mit den Zahlwerten arbeiten. Die Visualisierung berücksichtigt die Konstanten nicht (da ich sie nachträglich eingebaut habe und jetzt auf die Schnelle keine Lust hatte, das zu ändern).

10

16.08.2008, 15:52

Hat "Typ: Kuerze des Codes" eine Bedeutung hier oder zaehlt einfach die bessere KI?

Werbeanzeige