Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Pong

Hier soll das Spiel Pong Schritt für Schritt implementiert werden. Die Anzeige des Spielfelds soll durch ASCII-Zeichen realisiert werden, sodass das Spiel in einem Terminal laufen kann. Ein Beispiel-Screenshot könnte so aussehen:

         1                     2
+----------------------------------------+
|                                        |
|                                        |
|#                                       |
|#                                       |
|#                                       |
|            *                           |
|                                        |
|                                       #|
|                                       #|
|                                       #|
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
+----------------------------------------+

Leider ist es nicht ganz einfach, einzelne Tasten einzulesen, wie sie gebraucht werden, wenn der Benutzer den Schläger bewegen möchte. scanf arbeitet gepuffert und gibt die Eingabe erst nach Betätigung der Enter-Taste an das Programm. Wir verwenden deswegen die C-Programmbibliothek curses, die uns entsprechende Funktionen zum Abfragen eines Tastendrucks liefert.

Aufgabe

curses initialisieren

Erstmal müssen wir das Headerfile für curses includen:

 #include <curses.h> 

Schreibe jetzt eine Funktion void init(), die für das Initialisieren von curses zuständig wird. Sie enthält folgende Befehle:

  • initscr();
    aktiviert curses
  • noecho();
    damit Buchstaben der getippten Tasten nicht im Terminal erscheinen
  • cbreak();
    deaktiviert das Puffern der Terminalzeile
  • keypad(stdscr, TRUE);
    aktiviert spezielle Tasten, wie die Pfeiltasten
  • halfdelay(1);
    damit die Funktion, die später auf einen Tastendruck wartet, nach einer Zehntel Sekunde beendet wird

Jetzt folgt die main-Funktion. Sie enthält als ersten Aufruf unsere init-Funktion. Unser Programm sollte beim Beenden curses vernünftig deaktivieren, weswegen als letzter Aufruf in der main-Funktion folgender sein sollte:

 endwin(); 

Wenn die Quelltextatei pong.c heißt, kann sie ab jetzt mit folgendem Befehl kompiliert werden:

 gcc -lcurses pong.c 

Variablen für den Zustand des Spiels

Zuerst überlegen wir uns, wie groß unser Spielfeld und die Schläger sein sollen. Diese Werte sollten als Präprozessor-Befehle angegeben werden. Ein kleines, aber feines Feld bekommt man z.B. mit einer Breite von 40, einer Höhe von 15 und einer Schlägerhöhe von 3.

Jetzt führen wir die Variablen ein, die den Spielzustand repräsentieren sollen. Wir brauchen je eine y-Positionen für die beiden Schläger. Dazu kommt x- und y-Position des Balls. Diese Positionsvariablen sind vom Typ int. Damit wir wissen, in welche Richtung sich der Ball gerade bewegt, brauchen wir x- und -y-Richtung. Dafür eignet sich auch int; welche die Werte 1 und -1 annehmen können sollen, je nachdem, ob es nach rechts/links bzw. nach unten/oben gehen soll. Jetzt brauchen wir noch zwei Variablen für den Punktestand, die wir auch gleich mit 0 initialisieren können.

Die Funktion void place_paddles() soll die Schläger mittig platzieren. Die Funktion void place_ball() soll den Ball in der Mitte platzieren. Die x- und y-Reichtung können wir erstmal mit 1 belegen. Beide Funktionen sollten jetzt in der main aufgerufen werden.

Ausgeben des Spielfelds

Verarbeiten der Tastendrücke

Kollisionen des Balls erkennen

Erkennen, wenn der Ball nicht vom Schläger getroffen wurde

alles in ein rundenbasiertes Spiel stecken

Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)