Sensoren

5.1 Aktuelles Feld:
5.1.1 platz_belegt
Zuerst wollen wir mal wieder zum Sinn von NIKI zurückkehren. NIKI soll Gegenstände auf dem Arbeitsfeld aufsammeln. Dazu nutzen wir den Befehl nimm_auf. Aber zuerst wollen wir ja wissen, ob überhaupt das Feld mit einem Gegenstand belegt ist oder nicht. Dazu gibt es die Abfrage platz_belegt. Also wollen wir solange aufnehmen, wie Gegenstände da liegen. Wie das genau geht, erfahren wir in 5.3.1, wo wir Sensoren in Schleifen einbauen. Wir können auch abfragen, ob der Platz nicht belegt ist, und zwar durch NOT platz_belegt, Womit wir wieder bei den logischen Operatoren sind.

5.2 Angrenzende Felder:
5.2.1 vorne_frei, links_frei, rechts_frei
Jetzt knüpfen wir an das letzte Kapitel wieder an, da wir jetzt die Werte kennen lernen, die für die angrenzenden Felder von NIKI zuständig sind. NIKI kann nämlich herausfinden, ob vor ihm, links von ihm und/oder rechts von ihm eine Wand ist oder nicht. Das geht dann mit den Abfragen vorne_frei, links_frei und rechts_frei. Natürlich gehören wie oben auch die Unterstriche (_) zur Abfrage dazu. Leerzeichen würde der Compiler als Fehler anerkennen. Natürlich gibt es auch hier die Negation mittels NOT.
Aber wie kann man denn nun damit arbeiten? Am Besten wäre es doch, wenn man das Ganze in eine Schleife einbauen könnte. Schauen wir doch mal, ob das möglich wäre:

WHILE { Bedingung } DO { Anweisung }

Offensichtlich brauchen wir für eine Schleife eine Bedingung. Nun ist zufällig z.B. vorne_frei eine Bedingung. Also freuen wir uns!!!

5.3 Arbeit mit Sensoren:
5.3.1 Sensoren in Schleifen
Wir haben jetzt also eine Bedingung kennen gelernt. Die Anweisungen können wir ja selbst einbauen. Wollen wir uns doch einmal ansehen, ob wir alles aufnehmen können, egal wie viele Gegenstände auf dem aktuellen Feld herumliegen:

WHILE platz_belegt DO nimm_auf

Somit haben wir die Sicherheit, dass, egal, wie viele Gegenstände auf dem Feld liegen, NIKI alles aufnimmt. Was wäre aber, wenn wir das hier machen würden:

REPEAT nimm_auf UNTIL NOT platz_belegt

In diesem Fall müssten wir uns 100%-ig sicher sein, dass auf dem aktuellen Feld mindestens ein Gegenstand zum Aufnehmen liegt. Andernfalls würde es einen Fehler geben und NIKI würde sich abschalten. Auch mit den Sensoren für angrenzende Felder können wir Schleifen schmücken. Ein beliebtes Beispiel für eine Prozedur wäre:

PROCEDURE gehe_zur_wand;
BEGIN
 WHILE vorne_frei DO vor;
END;


Und dann kann man im Programm immer wieder diese Prozedur aufrufen, wenn man bis zur nächsten Wand will. Man kann aber auch Schleifen verschachteln, z.B.:

PROCEDURE gehe_zur_wand_und_nimm_alles_mit;
BEGIN
 WHILE vorne_frei DO
 BEGIN
  WHILE platz_belegt DO nimm_auf;
  vor;
 END;
END;


Jetzt kann man sich auch fragen, warum ich hier nicht AND verwendet habe. Das ist ganz einfach: So würde NIKI ja nur solange vor gehen, wie sowohl vorne frei als auch der Platz belegt wäre. Würde eine dieser Bedingungen nicht stimmen, wäre die Schleife beendet. Auch OR würde eine Gefahr für den korrekten Funktionsverlauf darstellen, da dann auch aufgenommen würde, wenn vorne frei ist. Daher ist eine Verschachtelung der beiden Schleifen hier angebracht und sinnvoll.
Ach noch was: der kryptische Prozedurname ist eigentlich kein gutes Beispiel und zeigt normalerweise einen schlechten Programmierstil. Alles über Stil beim Programmieren erfahren wir in Kapitel 9.

5.3.2 Boolsche Werte (Boolean)
Hilfe! Schon wieder ein Fremdwort!!! Und es steht auch nicht im Wörterbuch! Keine Panik, boolsche Werte, oder auch boolean genannt, sind einfach nur Sachen wie vorne_frei oder platz_belegt. Boolsche Werte können nur zwei "Zustände" annehmen: wahr und falsch bzw. true und false. Es kann also entweder wahr sein, dass vorne frei ist, oder eben falsch. Ein anderer Zustand ist unmöglich (wie z.B. "Da ist zwar 'ne Wand, aber die kann man überspringen"). Also merken wir uns: ein boolscher Wert hat entweder den Status true oder den Status false. Auch eine Mischung aus beidem ist unmöglich.
Eigentlich ist das für NIKI nur eine mehr oder minder wichtige Information, aber wenn man mal wirklich programmieren will, muss man boolsche Werte kennen. In Delphi z.B. kann man boolsche Variablen definieren, das sieht dann so aus:

var vorne_frei: Boolean;

Aber das ist wieder ein anderes Thema. In NIKI kann man übrigens keine Variablen definieren, was eigentlich auch nicht dringend notwendig ist (aber manchmal die Sachen vereinfachen würde).