Ein Notfallprogramm für den Roboter – Wir haben Millionen in die Hardware des Roboters gesteckt und unendlich viel Zeit in die Implementierung der Software und seiner Verbesserungen gesteckt. Daher soll der Roboter ein Notfallprogramm bekommen mit dem er jederzeit den Ausgang wiederfinden kann, wenn er sich in einem zerstörten Kraftwerk befindet und der normale Rückweg plötzlich versperrt ist.
Wir sehen die Roboter in ihrer Welt agieren. Wir sehen auch, wie viel Energie sie noch haben. Mit getEnergie()
können wir das auch abfragen. Dann erhalten wir von ihm eine Zahl als Antwort. Woher weiß dieser Roboter aber, wie viel Energie er noch hat? Wie merkt er sich diese Zahl?
Wenn mehrere Roboter auf der Welt herum laufen, dann gibt jeder auf Nachfrage die für ihn richtige Antwort. Jeder Roboter führt darüber Buch. Jeder Roboter hat sein Gedächtnis. Dazu verwendet er eine Variable: energie
. In dieser Variable merkt er sich die Energie, genauer: den aktuellen Wert der Energie, die ihm verbleibt. Dieser Wert kann immer nur eine positive, ganze Zahl sein. Man sagt der Typ des Attributs ist integer
(engl. für Ganzzahl). In Java wird dafür die Kennzeichnung int
verwendet.
Den Wert kannst du z.B. um 15 verringern, indem du dem Roboter den Befehl verbraucheEnergie(15)
gibst. Damit hat er 15 Energiepunkte weniger, egal wie viele es
vorher waren (jedoch unterschreitet er 0 Energiepunkte nicht).
Den aktuellen Wert kannst du erfragen, indem du ihm die Anfrage getEnergie()
stellst. Er wird dir die Restenergie als Antwort nennen.
Die aktuellen Werte aller Attribute bestimmen den Zustand eines Roboters.
Erprobe an zwei Robotern verbraucheEnergie()
bzw. getEnergie()
und kontrolliere mit INSPECT
(Rechtsmausklick auf den Roboter → Inspizieren)
den Zustand der Energie. Im Bild siehst du einen Roboter und sein INSPECT
-Fenster. Verschiebe das Inspect-Fenster so, dass es nicht mehr über der Roboterwelt liegt.
Notiere, welche weiteren Eigenschaften des Roboters in Attributen gespeichert sind. Nenne jeweils mindestens eine Methode, mit denen Du die Werte der ganzzahligen Attribute ändern kannst.
Bei den Integer-Attributen kann man die Werte direkt sehen. Bei komplexeren Attributen (z.B. inventar) wird nur ein Pfeil angezeigt. Die Attribute sind komplexer und nicht mit einer einzelnen Zahl auszudrücken. Programmieren musst du das noch nicht. Aber durch Klicken auf den Pfeil kannst du dir anschauen, was dahinter steckt. Du kannst beispielsweise erkennen, wo der Roboter speichert, wie viele Gegenstände er in seiner Inventarliste hat.
Lasse dir durch einen Klick auf den Pfeil hinter inventar
anzeigen, wie groß die Inventarliste ist. Versuche herauszufinden, wie groß das Bild (image
) eines Roboters ist. Dazu musst du mehreren Pfeilen folgen.
Jede Variable, die die Werte für eine Eigenschaft speichert, kannst du dir als beschriftete Kiste vorstellen. Vorne steht der Name der Variable, damit die Kiste bzw. ihr Speicherplatz wiedergefunden werden kann. Namen von Variablen beginnen mit einem Kleinbuchstaben. Setzt sich der Name aus mehreren Wörtern zusammen, darf man keine Leerzeichen verwenden, sondern beginnt jedes neue Wort mit einem Großbuchstaben. Das bezeichnet man als Camel-Case.
In der Kiste gibt es zu jedem Zeitpunkt genau einen aktuell gültigen Wert. Mit set‑Methoden (und auch durch andere Methoden) werden neue Werte in die Kiste gebracht; mit der get‑Methode nach dem aktuellen Wert gefragt und dieser Wert dann dem Anfragenden als Ergebnis genannt. Dabei verbleibt der Wert unverändert in der Variable. So wie beim Abhören deines MP3-Players der Musikinhalt ja weiterhin gespeichert bleibt.
Der Typ der Variable legt die Größe der Kiste fest.
int
-Kisten (32 Bit groß) passen z.B. ganze Zahlen zwischen -2.147.483.648 und +2.147.483.647. long
-Kisten (64 Bit groß). Dort passen Zahlen zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 hinein.float
und double
.anzahl
hat den Inhalt 7.anzahl
hat den Wert 7.anzahl
hat 7 Werte. anzahl
ist 7.Schlage sinnvolle Namen für Attribute vor, die speichern
Der Roboter AB6_AB7
hat eine neue Eigenschaft bekommen: Er hat das Attribut Schritte, das zählt wie viele Schritte er schon gemacht hat.
Dazu müssen drei Dinge erledigt werden:
private
, dann folgt der Typ und der Name des Attributsprivate int schritte;
this.schritte = 0;
this.xxx
. Es funktioniert zwar auch ohne this
, kann aber später zur Verwirrung führen. Schöner Nebeneffekt: Wenn man nach this.
Strg-Leerzeichen drückt, bekommt man alle verfügbaren Attribute und Methoden angezeigt.Überprüfe im INSPECT-Fenster, ob der Roboter ordentlich seine Schritte zählt.
Implementiere eine Methode bisWandMitZaehlen()
, die den Roboter bis zur Wand laufen lässt und dabei die Schritte zählt.
Führe ein neues Attribut drehungen
ein (deklariere und initialisiere das Attribut). Dieses soll bei jeder Rechtsdrehung um eins erhöht und bei jeder Linksdrehung um 1 erniedrigt werden (es gibt analog zu ++
auch -
-
). Führe dazu die beiden Methoden dreheLinksMitZaehlen()
und dreheRechtsMitZaehlen()
ein.
Wie bei den anderen Eigenschaften auch, soll der Roboter auch ohne Inspect-Fenster Auskunft darüber geben können, welchen Wert seine Attribute haben. Dazu brauchen wir get
-Methoden. Im letzten Kapitel hast du Methoden kennengelernt, die mit true oder false antworten. Nun möchten wir mit einer Zahl als Ergebnis antworten. Daher muss der Rückgabetyp der Methode int
sein:
/** nennt die gesamten zurück- * gelegten Schritte */ public int getSchritte() { return this.schritte; }
Statt return true
oder return false
, wollen wir nun den Wert des Attributs zurückgeben. Dazu verwenden wir einfach den Namen des Attributs.
getSchritte()
im Roboter AB6_AB7
, so dass die Methode nicht immer 0 zurück gibt, sondern den Wert des Attributs schritte
. Warum kann die Deklaration der Methode dafür nicht lauten: public void …
?bisWandMitZaehlen()
aus Aufgabe 7 keine Zeile, die mit return …
beginnt?
Implementiere eine get
-Methode für die Anzahl der Drehungen. Teste deine get-Methode.
Geht das wirklich? Ja, John Pledge ein 12-jähriger Junge hat entdeckt, wie das geht. Wir müssen dazu nur Drehungen zählen können.
Seine Idee war folgendermaßen: Im Prinzip folgt er permanent einer Wand so, dass seine linke Hand die Wand berührt. Da das aber zu Problemen führt, wenn die linke Hand an einer Säule ist, muss man irgendwann loslassen und geradeaus laufen. Das macht Pledge, wenn er sich genauso oft links wie rechtsrum gedreht hat.
Implementiere den Pledge-Algorithmus als Not-Programm (Methode einsatz6()
). Der Roboter wird dann in einer unbekannten Umgebung ausgesetzt und muss das Portal finden.
Im Bild siehst du ein Flussdiagramm des Pledge-Algorithmus. Es besteht aus ein paar Anweisungen, die du gerade implementiert hast und nur aufrufen musst und einigen while-Schleifen und if-Anweisungen. Überlege dir zunächst, welche der Fragen/Bedingungen zu einer while-Schleife und welche zu einer if-Anweisung gehören. Woran erkennt man den Unterschied?
Level 6
Filename | Filesize | Last modified |
---|---|---|
04_variablen.odp | 5.2 MiB | 30.09.2021 08:47 |
04_variablen.pdf | 1.1 MiB | 30.09.2021 08:47 |
ab601.png | 217.8 KiB | 04.12.2019 12:03 |
ab602.png | 67.8 KiB | 04.12.2019 12:03 |
ab603.png | 21.1 KiB | 04.12.2019 12:03 |
Alle Arbeitsaufträge in diesem Namensraum basieren auf den Materialien von Schaller/Zechnall
zur Informatikfortbildung Baden-Württemberg 2016 und stehen unter einer CC-BY-SA-NC Lizenz.