faecher:informatik:mittelstufe:robot:arbeitsauftraege:ab3:start

Auftrag AB3

In einem anderen Kraftwerk ist ein Feuer ausgebrochen. Deine ersten Erfolge haben sich rumgesprochen. Daher wird deine RoboRescue-Firma angesprochen, ob sie auch in diesem Fall helfen kann. Natürlich bist du sofort bereit… aber wie löscht man ein Feuer?

Die Roboter machen vieles immer wieder...

Wiederholungen in Handlungen erkennen, als SOLANGE-Schleife (while) formulieren und in Programmiersprache umsetzen können. Methoden mit Parametern benutzen können.

Der Roboter AB3 ganz oben links soll den Feuerlöscher, der vor ihm steht aufnehmen, damit vor zum Feuer (nicht auf das Feuer!) gehen und es durch Benutzung des Feuerlöschers löschen. Führe dies zunächst von Hand durch (die Methoden einsVor(), … findest du nun bei Rechtsklick unter "geerbt von Roboter").

Hinweis: Es gibt Methoden, die benötigen eine Zusatzinformation (einen sogenannten Parameter) um korrekt arbeiten zu können. Die Methode benutze(String name) ist so eine. Es wird also der Name des Gegenstandes erwartet, der benutzt werden soll. Dieser ist ein String (=Text). Strings müssen in Anführungszeichen gesetzt werden. Um den Feuerlöscher zu benutzen, muss man also benutze("Feuerloescher"); schreiben.

Vervollständige dann die Methode loesche(), die dies alles automatisch machen soll. Teste deine Methode.

Die weiteren Roboter darunter sollen ihre ersten Feuer in der Reihe auch mit dem Befehl loesche() löschen können. Diese Feuer sind aber in einer anderen Entfernung platziert. Welche Zeilen deiner Methode loesche() Programms müssen überarbeitet werden? Worauf muss der Roboter reagieren können?

Gib jedem Roboter den Auftrag: vorBisFeuer() und beobachte, was sie tun.

Lies danach im Quelltext bei der Methode vorBisFeuer() die Anweisungen und versuche sie zu verstehen.

Hinweis: das Ausrufezeichen bedeutet "nicht".

Rufe diese Methode sinnvoll in der loesche()-Methode auf, indem du den Quelltext durch den Befehl vorBisFeuer(); ergänzt. Teste die nun neue loesche()-Methode mit den vier Löschrobotern.

  • Ergänze die Methode vorBisFeuer so, dass die Roboter danach noch einen Schritt ins Feuer hinein machen. Was passiert dann?
  • Was passiert, wenn du innerhalb der lila Farbhinterlegung (innerhalb der {}-Klammern) noch ein zweites einsVor(); einfügst?

Der Auftrag vorBisFeuer() muss korrekt ausgeführt werden, egal wie weit das Feuer entfernt ist. Daher muss der Roboter prüfen, wie lange er vorwärts gehen muss. Auf die Anfrage: istVorne("Feuer") liefert er die Antwort true bzw. false ("wahr" oder "falsch"). Damit können wir diese bedingte Wiederholung so formulieren:

Normierte Sprache Programmiersprache Flussdiagramm
SOLANGE (vorne kein Feuer ist)
   WDH:
     ein Schritt vor 
   ENDE WDH
   while (!istVorne(''Feuer''))
   { 
     einsVor();
   }
   

Genau so steht es auch im Quelltext. Im runden Klammerpaar hinter dem Schlüsselwort while (…) steht die Bedingung, welche die Wiederholungen steuert. Solange diese Ausführungsbedingung gilt, werden alle Anweisungen im Schleifenblock zwischen { und } wiederholt.

Oder anders ausgedrückt: Die Ausführungsbedingung wird überprüft. Ist sie wahr, so wird jede Anweisung in der Blockklammer zwischen { und } ausgeführt. Da­nach wird wieder überprüft, ob die Ausführungsbedingung immer noch wahr ist. Die Anwei­sungen innerhalb der Blockklammer werden wieder ausgeführt. Und so weiter und so fort. Erst wenn die Aus­führungsbedingung falsch ist, wird die Schleife beendet und die Befehle hinter der schlie­ßenden Klammer } ausge­führt. Innerhalb des wiederholten Vorgangs muss sich die Ausfüh­rungsbedingung verändern, damit die Wiederholungen schließlich aufhören und nicht endlos laufen.

Die Feuer des 3. und 4. Roboters bestehen aus mehreren Flammen hintereinander. Um diese zu löschen muss man immer wieder löschen, dann einen Schritt gehen, dann wieder löschen usw. Das wiederholt man so lange, wie nach dem Schritt noch ein Feuer vor einem ist.

Implementiere eine Methode loescheReihe(), die diese Aufgabe löst. Verwende dazu eine while-Schleife. Rufe diese Methode anschließend in deiner loesche-Methode auf.

Mit einem Feuerlöscher kommt man nicht weit. Die sind recht schnell leer. Schreibe eine Methode testeReichweite(), bei der der Roboter unten links den ersten Feuerlöscher einsammelt, zur Feuerspur darunter geht und dort so viel Feuer wie möglich löscht.

Verwende eine while-Schleife um zu überprüfen, ob der Feuerlöscher noch nicht leer ist. Hinweis: Die Ausführungsbedingung getAnzahl("Feuerloescher")>=1 testet, ob der Roboter noch mindestens einen Löscher hat. Wenn er leer ist, wirft er ihn automatisch weg.

Für ein großes Feuer braucht man mehrere Feuerlöscher. Vor dem Roboter unten links ist ein Gang, mit vielen Feuerlöschern in den Nischen (drücke ggf. unten auf den Reset-Knopf). Er soll nach vorne bis zur Wand laufen und dabei die Löscher einsammeln. Das soll funktionieren, egal auf welchem roten Feld er startet.

  • Implementiere eine Methode sammleLoescher(), die zunächst den Roboter bis zur Wand laufen lässt, ohne die Löscher einzusammeln. (Die Methode istVorneFrei() testet, ob vor dem Roboter keine Wand ist).
  • Ergänze die Methode dann so, dass er die Löscher einsammelt.
  • Teste verschiedene Startpositionen (irgendwo auf einem roten Feld).

(Tipp: über den Geschwindigkeitsregler unten rechts kannst du die Ausführungs­geschwindigkeit anpassen!)

Lasse den Roboter rechts unten in die Sackgasse (Wand vorne, links und rechts) laufen. Verwende dazu mehrere Aufrufe von einer Methode laufeBisWand(), die du auch implementieren musst.

Implementiere laufeBisSackgasse(), indem du zunächst laufeBisWand() aufrufst und dann eine while-Schleife verwendest, um zu testen, ob du noch mal bis zur Wand laufen musst oder schon in der Sackgasse angekommen bist. Dies erkennst du, indem du testet, ob links keine Wand ist (!istWandLinks() - das ! steht für "nicht")

"Oh mein Gott, im Kernkraftwerk ist ein Feuer ausgebrochen. Sie müssen unbedingt helfen! Wenn das Feuer nicht schnell gelöscht wird, gibt es eine Katastrophe. Unsere Arbeiter können wir nicht mehr rein schicken. Die Gefahr ist einfach zu groß!

Wenn man reinkommt, gibt es gleich links eine Reihe von Nischen, in der die Feuerlöscher hängen. Sammeln Sie am besten alle ein. Wir wissen nicht, wie groß das Feuer schon ist.

Gehen Sie dann in die große Halle. Löschen Sie dort das Feuer. Es ist in der linken unteren Ecke ausgebrochen. Wie weit es sich inzwischen ausgebreitet hat, müssen Sie selbst herausfinden 1).

Rechts unten befindet sich ein Schutzraum (mit Portal), in das sich der Roboter am Ende begeben muss. Schaffen Ihre Roboter das?

Ach so, der Weg ist übrigens weit – nutzen Sie die Akkus, die der Roboter für die Mission bei sich hat!"

Tipps:


<<< Zurück zu Level 2 Level 3 Weiter zu Level 4 >>>


FilenameFilesizeLast modified
02_ablauf_von_schleifen.odp1.8 MiB29.09.2021 19:41
02_ablauf_von_schleifen.pdf268.5 KiB29.09.2021 19:41
ab3_01.png143.8 KiB04.12.2019 12:55
ab3_02.png12.9 KiB04.12.2019 12:55
ab3_03.png11.9 KiB04.12.2019 12:55
ab3_04.png160.9 KiB08.10.2023 19:07
ff.png12.5 KiB04.12.2019 12:55

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.


1)
Hinweis: in jeder Zeile ist direkt vor der Wand mindestens eine Flamme und es gibt keine Lücken im Feuer
  • faecher/informatik/mittelstufe/robot/arbeitsauftraege/ab3/start.txt
  • Zuletzt geändert: 19.10.2023 10:13
  • von Frank Schiebel