Auftrag AB9: Methoden mit Parametern

Ein Platz für ein neues Endlager ist gefunden! In einem Bergwerk soll dies geschaffen werden. Sprengarbeiten müssen vorgenommen und Brennstäbe eingelagert werden. Eine Aufgabe wie gemacht für unsere Roboter … Ein Einsatzleiter wurde bestimmt, die anstehenden heiklen Arbeiten zu koordinieren.

Ziel: Du kannst Probleme mit Hilfe von flexibel einsetzbaren Methoden lösen. Diese Metho­den enthalten Parameter, mit denen sich das Verhalten der Roboter flexibel steuern lässt.

Bei manchen Einsätzen müssen Roboter situationsgerecht agieren können. So legt beispielsweise ein Roboter über den Methodenaufruf ablegen(…) eine Schraube, ein anderer einen Brennstab ab. Welchen Gegenstand der einzelne Roboter ablegen soll, bekommt er als sogenannten Parameter innerhalb der Parameterklammer ( ) mitgeteilt. So bewirkt ablegen(„Schraube“) etwas anderes als ablegen(„Brennstab“). Das kennst du schon seit AB3 Aufgabe 1. Als Parameter wird der Methode ablegen(…) ein String, also ein Text mitgegeben. Dieser Text muss, wie du schon gelernt hast, in Java immer in Anführungszeichen geschrieben werden.

Als weitere Methoden mit Parametern hast du beispielsweise schon diese aufgerufen:

benutze(„Feuerloescher“)

istVorne(„Fass“)

istAufGegenstand(„Brennstab“)

Um den Robotern diese Variabilität beizubringen, muss der Kopf der Methoden­be­schreibung (oder auch Signatur der Methode genannt) wie folgt lauten:

public void ablegen(String name) { ... }

Das Schlüsselwort String in der Para­meterklammer hinter dem Methodenna­men besagt, dass bei Befehls­erteilung ein Text anzuge­ben ist, damit der Be­fehl ausge­führt werden kann.

Es wird also der Name des Gegenstandes erwartet, der abgelegt werden soll. Wenn du keinen Text eingibst, weiß der Roboter nicht, welchen Gegenstand er ablegen soll. Es erscheint eine Fehlermeldung. Eine Fehlermeldung erscheint ebenfalls, wenn der Eingabewert nicht vom Typ String, also z.B. nicht in Anführungszeichen geschrieben ist.

Als Parameter sind alle Variablentypen denkbar. So erwartet beispielsweise die Methode mit der Signatur public void macheWasXMal(int anzahl) einen Integer, also eine Ganzzahl. Bei der Befehlserteilung ist also eine Zahl anzugeben, damit der Befehl ausgeführt werden kann. Gültige Methodenaufrufe wären beispielsweise macheWasXMal(7) oder macheWasXMal(1234). Sogar macheWasXMal(-3) wäre erlaubt, nach einem Sinn müssten wir jedoch suchen .

Manchmal ist es auch erforderlich mehrere Parameter anzugeben. So hat die Methode

int berechneFlaeche(int breite, int hoehe)

zwei Parameter vom Typ int, die zur Flächenberechnung genutzt werden. Der Methodenaufruf berechneFlaeche(3, 5) würde somit den Wert 15 als Methodenergebnis liefern (siehe Bilder).

Beim Methodenaufruf der Methode melde(String text, boolean istWichtig) wird an erster Position die Eingabe eines Textes erwartet, an zweiter Position die Eingabe eines Wahrheitswertes true oder false, je nachdem, ob die Meldung besonders wichtig ist oder nicht.

Aufgaben:

Aufgabe 1

Markiere im untenstehenden Bild alle Methoden, die beim Aufruf eine Eingabe verlangen.

Welche Methode hat die längste Parameterliste?

Woran erkennst du, ob eine Methode einen Wert zurück gibt?

Welche zwei Methoden haben sowohl Parameter, als auch einen Rückgabewert?

Aufgabe 2

Du bist jetzt in Greenfoot im Level „AB9 – Methoden mit Parametern“. Alle Roboter haben (in der Klasse Roboter) schon einige Methoden mit Parametern implementiert.

Teste an einem AB9 die drei unten markierten Methoden (indem du bei einem Roboter rechts klickst und auf geerbt von Roboter → Weitere Methoden gehst).

Beschreibe jeweils kurz, welche Aufgabe die jeweilige Methode erfüllt.

Im Bergwerk bringt ein Aufzug die Roboter in das richtige Stockwerk. Durch einen „Schalter“ kann der Aufzug in das oberste Stockwerk gerufen werden. Dafür gibt es schon die Methode holeAufzug().

Aufgabe 3

Drehe Roboter: Vervollständige die Methode

public void dreheRoboter(int richtung)

, die den Roboter in die angegebene Richtung dreht (0=Blick nach rechts, 90=Blick nach unten, …). Mit getRotation() kann man die aktuelle Richtung erfragen. Tipp1: Drehe den Roboter so lange, bis richtung erreicht ist.

Wie du schon richtig erkannt hast, schauen wir nun nicht mehr auf die Roboterwelt von oben, sondern wir betrachten einen Querschnitt eines Bergwerks. Hier spielt – wie im wirklichen Leben – die Schwerkraft eine wichtige Rolle. Pass auf, dass deine Roboter nicht in den Aufzugschacht fallen.

Aufgabe 4 Bombe sichern

Vervollständige die Methode

public void holeBombeUndKehreZurueck (int xPos, int yPos)

die bei übergebenen x- und y-Werten an die (x|y)-Positon springt, dort die Bombe aufnimmt (falls dort überhaupt eine liegt) und anschließend wieder zu seinem Ausgangspunkt zurückkehrt. Teste deine Methode.

Aufgabe 5: Sprengkommando

Nun soll ein AB9-Roboter einen Bereich im Bergwerk sprengen. Schreibe dazu die Methode

public void sprenge (int xPos, int yPos)

die den Roboter auf die übergebene (x|y)-Position setzt, mit benutze(„Bombe“) die Bombe zündet und ihn wieder auf seine Startposition in Sicherheit bringt. Teste deine Methode. (Zwei der drei Sprengroboter in der Mitte tragen Bomben mit sich – wie viele kannst du ja ablesen …)

Aufgabe 6: Stollen füllen

Die (gesprengten) Stollen im Endlager sollen mit Brennstäben belegt werden. Auf jedes freie Feld kann problemlos ein Brennstab abgelegt werden. Jedes rote Feld (=Kontaktplatte) birgt Risiken beim Ablegen. Schreibe eine Methode

public void legeBrennstab(int x, int y, boolean aufKontaktplatte)

die einen AB9-Roboter zur Position (x|y) schickt. Steht er auf einer Kontaktplatte, soll er nur dann einen Brennstab ablegen, wenn der übergebene Wert für die Variable legeAufKontaktplatte „true“ ist, sonst nicht. Ob er auf einer Kontaktplatte steht oder nicht, kann er mit dem Befehl if (istAufGegenstand(„Kontaktplatte“)) überprüfen. Teste deine Methode.

Aufgabe 7: Stollen füllen und räumen

Ändere die gerade geschriebene Methode public void legeBrennstab(int x, int y, boolean aufKontaktplatte) so ab, dass bevor ein Brennstab abgelegt wird, der Roboter überprüft, ob ein Akku oder eine Schraube auf dem Feld liegt. Falls ja, soll er den Gegenstand vorher aufnehmen.

Nun kommt der Einsatzleiter ins Spiel. Das ist das kleine Männchen oben rechts. Der Einsatzleiter kennt die vier Roboter. Der erste ganz links heißt legeRoboter, der rechts daneben sprengRoboter1, dann sprengRoboter2 und sprengRoboter3.

Im Folgenden muss der Einsatzleiter jeweils Methoden bei einem der vier Roboter aufrufen. Im Quelltext schreibt man dazu beispielsweise folgenden Befehl:

sprengRoboter2.legeBrennstab(2,7,false);

Man schreibt also den Namen des Roboters, gefolgt von einem Punkt. Drückt man danach die Tastenkombination STRG+Leertaste, so bekommt man eine Liste aller Methoden, die man bei diesem Roboter aufrufen kann, u.A. legeBrennstab(int xPos, int yPos, boolean aufKontaktplatte). Nun muss man nur noch konkrete Werte für x-Position, y-Position und true/false eingeben. Das darfst du nun selber mal testen:

Aufgabe 8: Anweisung 1

Öffne die Klasse EinsatzLeiter und vervollständige die Methode public void holeBombeUndSprenge (int bx, int by, int sx, int sy). Dabei sind (by|by) die Koordinaten, wo sich eine Bombe befindet und (sx|sy) die Koordinaten des zu sprengenden Schachtes (entweder (2|4) oder (3|9)). Gib dazu dem sprengRoboter1 die passenden Befehle! (Wie das geht, siehst du im Quelltextbeispiel).

Aufgabe 9: Ablegen

In dem freigesprengten Quadrat sollen nun Brennstäbe abgelegt werden. Verändere die Methode public void legeQuadratUndSammleBatterie(int startX, int startY) beim AB9, die ein aus 9 Feldern bestehendes Quadrat mit Brennstäben belegt. Auf Kontaktplatten dürfen keine Brennstäbe gelegt werden. Wenn auf einem Feld eine Batterie liegt, soll diese vorher aufgenommen werden.

Aufgabe 10: Anweisung 2

Damit der EinsatzLeiter fit ist für den Einsatz 9, musst du ihm noch beibringen, wie er mit einem Methodenaufruf einen Bereich sprengen lässt und dieser anschließend mit Brennstäben belegt wird.

Die Methode soll den sprengRoboter2 nutzen, um den Schacht (2|4) oder (3|9) zu sprengen. Der legeRoboter soll anschließend den gesprengten Bereich mit Brennstäben belegen. Für die Kontaktplatten und Batterien gilt das gleiche wie in Aufgabe 8. Benenne die Methode sinnvoll und teste sie.

Einsatz 9

Nun übernehmen Sie die Verantwortung – Herr Einsatzleiter! Im Folgenden soll dein Einsatzleiter den Einsatz im Endlager koordinieren. Die AB9-Roboter haben alles gelernt, was sie für diesen Einsatz benötigen:

Sie können in einem Schacht Sprengarbeiten vornehmen und einen freigewordenen Bereich mit Brennstäben belegen. Aber Achtung, die Ressourcen sind knapp – sowohl die Anzahl der Sprengsätze, als auch die Energie der Roboter. Die Arbeit unter Tage ist nicht nur für Menschen anstrengend … Deine Aufgabe ist es nun dem Einsatzleiter klare Anweisungen zu geben, so dass die drei Sprengroboter (die jeweils eine Bombe mit sich tragen), die drei Schächte mit den Koordinaten (2|5), (6|7) und (11|8) sprengen und danach auf den Rücktransport nach oben warten, indem sie auf ein Portal stehen. Der legeRoboter soll anschließend all seine Brennstäbe (Anzahl variiert) in den frei gewordenen Schachtplätzen ablegen. Hoffentlich geht ihm dabei nicht die Puste aus. Auch der legeRoboter soll nach beendeter Arbeit auf seinen Rücktransport warten.

<<< Zurück zu Level 8 | Level 9 | Weiter zu Level 10 >>>

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.