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).