Short Range Scan
Es wird ein Kommando mehr geben: “srs” oder “shortrangescan”. Es soll alle Objekte im All “grafisch” anzeigen, die im gleichen Quadranten wie das Raumschiff liegen.
- dazu ergänzt du zunächst das
enum
mit den Kommandos umshort_range_scan
. - die Funktion
parse_command(...)
soll das neue Kommando erkennen und das richtigeenum
zurückgeben. - der
switch
in der Hauptschleife soll auf das neue Kommando mit Aufruf vondo_srs()
reagieren. Diese Funktion führt den eigentlichen Scan-Code aus.
Der Short Range Scan liefert ein Array zurück, das für alle Sectoren im Quadranten des Raumschiffs angibt, was darin enthalten ist. Das sind also 8×8 Elemente – ein zweidimensionales Array. Zur besseren Lesbarkeit dient hier ein enum
:
typedef char srs_result[8][8];
Der Code soll nun die zu schreibende Funktion void galaxy_sr_scan(srs_result)
aufrufen. Da nach Beendigung dieser Funktion der Verbleib der Werte in der Funktion unbestimmt ist, erzeugt das Programm dieses 8×8-Array in der aufrufenden Funktion do_srs()
und übergibt es als Parameter beim Aufruf von galaxy_sr_scan()
.
void galaxy_sr_scan(srs_result)
setzt zunächst alle Positionen im Ergebnisarray auf leer (' '
).
Dann berechnet sie mit int quadrant_id(short x, short y)
eine eindeutige ID für den Quadranten der Position des Schiffs. Hier empfiehlt sich z.B. Spalte * 8 + Zeile des Quadranten. Sicherheitshalber regelt die quadrant_id()
-Funktion auch gleich, was sie mit Parametern macht, die außerhalb des Spielfelds liegen. (Da das Verfahren für x und y das gleiche ist, könnte hier sogar eine Funktion short legalize(short coord)
Code vereinfachen helfen.)
Eine einfache Schleife kann nun durch alle Units gehen und für jede:
- den Quadranten der Unit berechnen
- vergleichen, ob er mit dem Schiffsquadranten übereinstimmt (dann sind Unit und Schiff im gleichen Quadranten)
- gegebenenfalls im Ergebnisarray den Typ auf den der aktuellen Unit setzen (Achtung: Koordinatenumrechnung auf “innerhalb des Quadranten”)
Zurück in der do_srs()
-Funktion braucht diese Funktion nur noch die Scanwerte anzeigen:
- eine Zeile mit Koordinatenwerten und etwas Abstand dazwischen
- dann für jede der 8 Scan-Zeilen eine Zeile mit den 8 Scanwerten aus dieser Zeile. Da die Scanwerte aus einzelnen Buchstaben bestehen, könnte eine Funktion
char* symbol_of(char c)
die Werte mit einem Case-Statement in schöne Strings (s.u.) umrechnen. - und am Ende noch einmal eine Zeile mit Koordinatenwerten zur besseren Orientierung
Als Vorschlag für die Strings:
S | <*> | Schiff |
* | * | Stern |
K | ### | Klingone |
B | >!< | Basis |
space | unbelegt |
Das Ganze könnte dann so aussehen:
