Teil 5
← C Teil 4: Modularisierung | ● | C Teil 6: Zeiger →
Wir überlegen, wie der Rechner eine C-Anweisung prinzipiell abarbeitet:
- wie z.B. int x = 2 * a + 3 * b; // z.B. mit a=1, b=2
- Anweisungen und deren Evaluierung
- d.h. Abarbeitung der Rechenbefehle einer Anweisung
- Ausdrücke, Operatoren, Operanden
- Evaluierungsreihenfolge nach Operatorpriorität:
- = && || == != + - * / ! ()
- Bei gleicher Priorität Auswertung von links nach rechts
- Mit Ausnahme des Zuweisungsoperators, der von rechts nach links auswertet
- L-value = R-value (siehe im Skript oder auf Wikipedia)
- Ergebnis der Evaluierung ist immer genau ein Wert
- Auch bool’sche Operatoren liefern immer genau einen Wert (0, 1 bzw >0)
- Die Evaluierung einer Funktion liefert daher ebenfalls immer nur genau einen Wert zurück (via return)
- Evaluierungsreihenfolge nach Operatorpriorität:
- Das Ein-Wert-Prinzip der Evaluierung gilt sinngemäß für alle (mir bekannten) Programmiersprachen und ist daher übertragbar!
Praktikum
Im Praktikum zeigen Sie jeweils Ihren aktuellen Fortschritt bei der Umsetzung Ihrer Spieleidee.
Der empfohlene Startpunkt für Ihr Spiel:
- Legen Sie einen Game-Loop in einem Nebenmodul game.cpp/.h an.
- Der Game-Loop soll durch Drücken von ‘q’ beendet werden können.
- Das Hauptmodul enthält dann nur noch die Initialisierung von NCurses und den Aufruf des Game Loops!
- Legen Sie ein Nebenmodul util.cpp/.h an, welches Hilfsfunktionen wie msleep() enthält.
- Definieren Sie einen ersten Teil des Game State, indem sie die vergangene Zeit modul-lokal speichern → elapsed.
- Implementieren Sie entsprechende Getter für den Game-State → get_elapsed().
- Bauen Sie weiterhin als einen Splash-Screen ein, der als Intro den Titel des Spiels zeigt.
- Ergänzen Sie dafür den Game State um die modul-lokale Variable “state” mit den möglichen Enum-Werten GAME_INTRO und GAME_LOOP und dem Anfangswert GAME_INTRO.
- In Abhängigkeit von dieser Variable zeichnen Sie innerhalb des Game-Loops das Intro oder das Spielfeld
- Der Wechsel von GAME_INTRO nach GAME_LOOP soll nach einer Zeit von 3 Sekunden automatisch erfolgen
- Zeigen Sie nach dem Drücken von ‘q’ einen entsprechenden Bye-Bye-Screen an, der eine gewisse Zeit sichtbar bleibt, bevor sich das Programm von selber verabschiedet. Ergänzen Sie dazu den Game State um einen weiteren Enum-Wert GAME_OUTRO.
Das Innere des Game-Loops sollte also in etwa so ausschauen:
{
draw_intro();
if (get_elapsed() > 3) state = GAME_LOOP;
}
else if (state == GAME_LOOP)
{
draw_game();
...
}
else if (state == GAME_OUTRO)
{
...
}
Bitte orientieren Sie Sich hierbei am Game-Loop Grundgerüst und beachten Sie die Best Practices. Als weiteres Beispiel dient der Game-Loop von ASCII-DASH.
Evaluieren Sie die folgenden Ausdrücke bzw. Anweisungen von Hand auf einem Blatt Papier:
int a = 2 + 3 * 4;
int b = 2 + 5 * (2 + 1);
int c = 10 + 5 * 2 == a && a != b;
float d = 1.0/2;
float e = 1/2;
Vergleiche dazu auch das C-Skript zum Thema Operatoren und Operatorpriorität.
Überprüfen Sie Ihr Ergebnis mittels eines entsprechenden Programms!
Protokoll
Beschreiben Sie mit Ihren eigenen Worten die Begriffe Anweisung, Ausdruck, Operator, und Operand in Ihrem Ãœbungsprotokoll!
Dokumentieren Sie das Ergebnis der manuellen Evaluierung und deren Überprüfung!
Fragen fürs Protokoll:
- Wieviele Operanden hat ein Operator normalerweise?
- Was unterscheidet einen L-Value von einem R-Value?
- Was benötigt der ++ Operator als Operand?
- Sortieren Sie die Operatoren
+ ++ * = == || !
anhand ihrer Priorität!
Nehmen Sie in Ihr Protokoll den jeweiligen Fortschritt bei der Entwicklung Ihres Spiels mit auf, d.h. beschreiben Sie taggenau die jeweils umgesetzten Entwicklungsschritte - wenn möglich mit einem Screen-Shot. Bitte dokumentieren Sie ebenfalls Probleme, Aha-Erlebnisse usw.
Wenn Sie mit git oder svn arbeiten, so committen Sie jeweils am Ende des Tages Ihre Programmänderungen und dokumentieren den jeweiligen Fortschritt z.B. mittels der entsprechenden commit logs. Beschreiben Sie kurz die jeweiligen Änderungen - wenn möglich mit einem Screen-Shot.