7tes Aufgabenblatt

Es geht hier um Zeiger und Arrays.

PrÀliminÀrien:

Wir verwenden dieses Rahmenprogramm main.cpp innerhalb der Bibliothek ASCII-Gfx. Das Programm stellt ein Spielfeld (scrollable area) bereit, das wir im Folgenden verwenden werden. Noch ist das Spielfeld allerding leer.

Erzeugen Sie die Dokumentation (doxygen), und schauen Sie nach, welche Funktionen das Modul scrollarea.h prinzipiell anbietet.

Rechenaufgabe R1:

Es sei folgender Code gegeben:

int x = 0, y = 1, *u = &x, *v = &y, **w = &v;

Evaluieren Sie von Hand die folgenden Anweisungen der Reihe nach. Welche Werte haben dann jeweils x und y?

  • *u = 1;
  • *v = 0;
  • v = u;
  • *v = 1;
  • *w = &y;
  • *v = 2;
  • *w = 0;
  • *v = 0; Achtung: Fangfrage!

Hinweis: Die obige Aufgabe ist so zu verstehen, dass sie mit einem gedachten Debugger die obigen Anweisungen jeweils eine nach der einanderen ausfĂŒhren und die aktuellen Werte kontrollieren.

Tipp: Eine Visualisierung der jeweiligen Situation mit Hilfspfeilen auf einem Blatt Papier ist in der Regel hilfreich ;-)

Programmieraufgabe P2:

  • Wie allozieren Sie 1000 int Elemente dynamisch?
  • Wie greifen Sie auf das 100ste Element zu (2 Möglichkeiten)?
  • Wie vertauschen sie den Inhalt des 100sten und 200sten Elementes?
  • Wie geben sie den Speicher wieder frei?
  • Wie geben sie einen int Wert in einer Funktion zurĂŒck?
  • Wie geben sie drei int Werte in einer Funktion zurĂŒck?

Programmieraufgabe P3:

Wir lassen nun die Lok aus der letzten Aufgabe herumfahren.

Dazu ist ein gewisses VerstÀndnis der API des Moduls scrollarea.h notwendig. Wenn im Folgenden aus dieser API Funktionen angesprochen werden wie z.B. render_print_format(), dann kann man sich diese Funktion in der Dokumentation und deren Implementierung in scrollarea.cpp anschauen, was das VerstÀndnis dieser Funktionen erleichtert (RTFC).

Wir zeichnen die Lok zunĂ€chst in das Spielfeld, d.h. wir verwenden denselben Zeichen-Code wie in der vorhergehenden Übung, wir ersetzen jedoch Aufrufe von mvaddch(y, x, …) durch entsprechende Aufrufe von set_cell(x, y, …).

Dann wandeln wir das gezeichnete Bild der Lok in einen sog. Sprite um, indem wir zuerst den entsprechenden Bereich bzw. ein Teilbild aus dem Spielfeld auslesen (get_cell_area) und als Array abspeichern (Zeiger).

Sie können zur Kontrolle einzelne Zeichen aus diesem Array ausgeben (via render_text_format, funktioniert wie printf).

Nun kann man mit diesen Daten die Textur eines Sprites definieren (enable_sprite, set_sprite_data). Schließlich kann man den Sprite als Overlay ĂŒber dem Spielfeld positionieren (set_sprite_position).

Programmieraufgabe P4:

Indem wir innerhalb des Game Loops von Frame zu Frame die Position verĂ€ndern (nochmal set_sprite_position), bewegt sich nun die Lok z.B. von links nach rechts und wieder zurĂŒck.

Dokumentieren Sie Ihre Animation dadurch, dass Sie einen Screenshot von Ihrem konkreten Game Loop zusammen mit der Darstellung machen.

Optionale Programmieraufgabe P5:

Die Lok ist nicht durchsichtig, so dass der umgebende Bereich den Hintergrund verdeckt. Machen Sie die Lok transparent. Transparenz wird im Kontext von Sprites als ASCII Zeichen −1 reprĂ€sentiert, d.h. tauschen Sie in den Sprite-Daten (d.h. dem Array) jeweils alle Vorkommen von ' ' durch −1 aus.

Optionale Programmieraufgabe P6:

Man könnte nun noch ein paar Schienen einzeichnen etc.

Checkliste

  • Was haben Sie am Ende des Programms vergessen? Wie heisst der entsprechende Fachbegriff, der diese Situation bezeichnet?
  • Was fĂŒr Werte werden in Zeigervariablen gespeichert?
  • Welche zwei komplementĂ€ren Operatoren gibt es bei der Benutzung von Zeigern?
  • Welche zwei komplementĂ€ren Aufrufschemata gibt es?
  • In welcher Reihenfolge werden die Daten beim Auslesen des Bereichs des Spielfelds abgelegt?
  • An welcher Position (Index) in einem Bereich mit der GrĂ¶ĂŸe 10×10 befindet sich die Zelle der 3ten Zeile und 5ten Spalte?


Options: