Bouncing Ball

Curses Library

Mithilfe dieser C-Bibliothek können Programme erstellt werden, die im Terminal eine Art "Pseudo-Grafik" erzeugen. Infos:

Installation: sudo apt update && sudo apt install libncurses6 libncurses-dev

Optional Doku: sudo apt install ncurses-doc ncurses-examples

*-dev beinhalten immer die C-Headerfiles der Bibliothek

Lade eines der Beispielprogramme in deinen Editor und speichere es unter example.c in einem eigenen Ordner Games. Zum Erstellen des lauffähigen Programmes musst du die ncurses-Library hinzulinken:

gcc example.c -o example -lncurses -Wall

Du kannst diese Kommandozeile auch mittels Makefile automatisieren.

Beispielprogramm Ball

bouncing ball

Der folgende Programmcode zeigt ein Beispiel für die Verwendung von ncurses. Kompiliere das Programm und starte es.

#include <ncurses.h>
#include <unistd.h>

// Stores our balls position
typedef struct _Ball {
    int x;
    int y;
} Ball;
// Stores the direction that the ball is moving
typedef struct _Direction {
    int x;
    int y;
} Direction;

int main()
{
    initscr();              // Start ncurses
    nodelay(stdscr, TRUE);  // Don't wait for \n for getch to parse input
    cbreak();               // Switch off input buffering
    curs_set(FALSE);        // Don't place a cursor on the screen

    int height = 0;         // Window height
    int width = 0;          // Window width

    // initialize our ball struct and direction struct
    Ball b = {
        1,1
    };
    Direction d = {
        1,1
    };

    getmaxyx(stdscr, height, width);
    while (getch() == ERR) { 
         // Get terminal window dimensions (rows and characters)
       

        // print ball
        mvprintw(b.y,b.x,"o");

        // move ball for next frame
        b.y += d.y;
        b.x += d.x;

        // Check for ball being outside of our window boundaries
        if (b.x == width - 1 || b.x == 0){
            // change direction
            d.x *= -1;
            b.x += d.x;
        }
        if (b.y == height - 1 || b.y == 0){
            // change direction
            d.y *= -1;
            b.y += d.y;
        }

        refresh();      // Refresh the output
        usleep(50000);  // Sleep to show output (Single frame)
        clear();        // Clear output
    }

    nodelay(stdscr, FALSE);
    nocbreak();
    endwin();
    return 0;

}

Bouncing Ball - objektorientierte Version

Speichere das Beispielprogramm von vorhin unter bouncing.cpp. Es soll nun so umgebaut werden, dass die Vorteile der Programmierung in C++ genützt werden. Erzeuge folgende Klassen:

  • Window:
    • Konstruktor zum Initialisieren der curses-Umgebung
    • Destruktor zum Zurücksetzen des Terminals auf die Ausgangswerte beim Beenden des Programmes.
  • Ball:
    • Konstruktor
    • move (Bewegen des Balles)
    • Membervariablen: shape (Zeichen für den Ball, default "o"), Position (xy, Struktur), Geschwindigkeit (xy), erlaubter Fensterbereich (xy)

Kompiliere das Programm unter Verwendung von g++ analog zur Kommandozeile des C-Programmes. Wenn alles funktioniert, teile den Quelltext so auf mehrere Dateien auf, dass jede Klasse ein *.cpp- und ein *.h - File hat. Erstelle dann ein Makefile zum automatisierten Bauen des Binärfiles.