HARALD MELCHER

Startrek in C

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 um short_range_scan.
  • die Funktion parse_command(...) soll das neue Kommando erkennen und das richtige enum zurückgeben.
  • der switch in der Hauptschleife soll auf das neue Kommando mit Aufruf von do_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
spaceunbelegt


Das Ganze könnte dann so aussehen: