HARALD MELCHER

Startrek in C

Long Range Scan

Unser Spiel lernt das Kommando lrs (“Long Range Scan” ). Dazu

  • erweitern wir parse_command() um lrs
  • erweitern wir unsere Hauptschleifen-switch um einen eventuellen Aufruf von do_lrs()

In der galaxy.h

  • definieren wir einen neuen Typ lrs_entry als struct mit drei Werten: der Zahl der Klingonen, der Zahl der Sonnen und der Zahl der Starbasen
  • definieren wir einen neuen Typ lrs_result als 3×3-Array von lrs_entrys

galaxy.c erhält die neue Funktion void galaxy_lr_scan(lrs_result scan), die in ein mitgeliefertes Ergebnisarray die Scans des aktuellen Quadranten und seiner 8 Nachbarn einträgt.
Hier hilft die bereits geschriebene Funktion quadrant_id(), die Ids der jeweiligen Quadranten zu finden. (Tipp: die um eine Quadrantenbreite verschobenen Positionswerte des Schiffs liegen im Nachbarquadranten).
Eine doppelte Schleife füllt dann schnell das 3×3-Array mit den Werten der zu schreibenden lrs_entry lr_scan_one_quadrant(int quadrant_to_scan).

rs_entry lr_scan_one_quadrant(int quadrant_to_scan) bereitet einen leeren lrs_entry vor und initialisiert ihn!

  • geht durch alle Units und schaut, ob sie im fraglichen Quadranten liegen
  • falls das zutrifft, schaut sie nach dem Typ der Unit und zählt entweder Klingonen, Sterne oder Sternbasen mit
  • liefert den gefüllten lrs_entry zurück (Wertetyp)

Die Funktion do_lrs() in main.c soll das Long-Range-Scan-Ergebnis anfordern und anzeigen. Dazu

  • Richtet sie eine Variable vom Ergebnistyp ein – glücklicherweise sieht der einfacher als, weil es dazu ein typedef gibt
  • übergibt diese Variable der Funktion galaxy_lr_scan()
  • findet nach deren Beendigung den Ergebnistyp gefüllt mit den Zahlen der Units in den umliegenden Quadranten
  • zeigt diese in zwei verschachtelten Schleifen an

Hierbei könnte (muss aber nicht) eine Funktion char* lr_symbol_of(lrs_entry entry, char *buffer) den jeweiligen Eintrag formatiert in einen übergebenen Ergebnisbuffer schreiben. Dies verkleinert den Code und verbessert seine Lesbarkeit. Die Funktion liefert einen Zeiger auf den Buffer zurück.
(Warum liefert sie den Zeiger auf den Buffer zurück, die aufrufende Funktion kennt doch ihren Buffer?)

Und so könnte der Long-Range-Scan dann aussehen: