|
|
Zeile 1: |
Zeile 1: |
− | <language>Java</language>
| |
− | {{Lernpfad-M|<big>'''Eine Ameisenstraße'''</big>
| |
− | __NOTOC__
| |
− |
| |
− | ''Teil 3 der Lernpfadgruppe: Programmieren mit AntMe!''
| |
− |
| |
− | {{pdf|Krüger_KompetenzaufbauLernpfad3.pdf|Kompetenzaufbau}}
| |
− | }}
| |
− |
| |
− |
| |
− | <div style="border: 1px solid #dfdfdf; background-color:#dfdfdf; font-size:1px; height:8px; border-bottom:1px solid #dfdfdf;"></div>
| |
− | <div style="border:1px solid #dfdfdf; background-color:#FEFEFE; align:center; padding:7px;margin-bottom:10px;">
| |
− | == Ziele des Lernpfads ==
| |
− | * Ameisen kommunizieren auf einfache Art
| |
− | * eigene Objekte in der Wiki-Umgebung erstellen
| |
− | * Was ist die Besonderheit am null-Wert?
| |
− | * Umgang mit vorgegebenen Objekten von ''AntMe!''
| |
− | * eine Ameisenstraße bauen
| |
− | </div>
| |
− |
| |
− |
| |
− | == Die Kommunikation ==
| |
− |
| |
− | {{Aufgabe-Mathe|
| |
− |
| |
− | Löse das Schüttelrätsel!
| |
− |
| |
− | }}
| |
− |
| |
− | <div class="schuettel-quiz">
| |
− | Die Ameisen kommunizieren mit '''Duftwolken''', sie werden auch (Durft-)Markierung genannt. Sie haben zwei Attribute: eine '''Information''' und einen '''Radius'''. Die Information und der Radius sind vom Datentyp '''Integer'''. Je '''größer''' der Radius der Duftmarkierung, desto '''schneller''' verschwindet sie auch.<br />
| |
− | Befindet sich eine '''Ameise''' in einer Duftwolke, so wird die '''Methode''' <tt>RiechtFreund(Markierung markierung)</tt> aufgerufen. Mit <tt>markierung.'''information'''</tt> kann die übermittelte Nachricht ausgelesen werden.
| |
− | </div>
| |
− |
| |
| == Äpfel zusammen tragen == | | == Äpfel zusammen tragen == |
| | | |
Zeile 78: |
Zeile 44: |
| }} | | }} |
| | | |
− | == Der null-Wert ==
| + | {{Lösung versteckt| |
− | | + | <code> |
− | <div class="lueckentext-quiz">
| + | public override void Sieht(Obst obst) |
− | Strukturierte Datentypen werden auch '''Referenz-Datentypen''' genannt, weil man auf sie nur indirekt über einen '''Zeiger''' zugreift - einer Referenz. Diese Referenz kann entweder mit dem
| + | { |
− | * '''Default-Wert''' <tt>null</tt> initialisiert werden oder
| + | if (AktuelleLast == 0 && BrauchtNochTräger(obst) && WanzenInSichtweite == 0) |
− | * durch den Aufruf des <tt>'''new'''</tt> Operators
| + | { |
− | erzeugt werden.<br />
| + | SprüheMarkierung(0, 100); |
− | In der Ameisensimulation AntMe! hatte die Referenz '''Ziel''' den Default-Wert null. Trotzdem sind Initialisierungen mit <tt>null</tt> gefährlich, weil das Objekt existiert, aber seine Komponenten nicht initialisiert wurden.
| + | GeheZuZiel(obst); |
− | | + | |
− | Ein Beispiel ohne Fehlermeldung:
| + | |
− | Object obj1 = new Object();
| + | |
− | Object obj2 = null;
| + | |
− | </div>
| + | |
− |
| + | |
− | | + | |
− | {{Aufgabe-Mathe| | + | |
− | | + | |
− | Hier ist wieder die Programmierumgebung vom Wiki. In ihr schreibst du nach den Kommentaren deinen eigenen Quellcode. Die Objekte werden wie in dem Beispiel erzeugt (siehe unten).<br />
| + | |
− | '''Achtung:''' Das Objekt wird hier <u>ohne</u> <tt>new</tt> erzeugt!
| + | |
− | # Erzeuge ein Objekt ''Ameise'' mit deinem Namen.
| + | |
− | # Initialisiere eine weitere Ameise mit <tt>null</tt>.
| + | |
− | # Was passiert, wenn der Name der 2. Ameise ausgegeben wird?
| + | |
− | | + | |
− | }}
| + | |
− | <code id="4b7becafda7ad" hidden> | + | |
− | public Object Ameise(String name) { | + | |
− | String myname = name;
| + | |
− | | + | |
− | void zeigeNamen() {
| + | |
− | System.out.println("Ich bin eine Ameise und heiße "+myname+".");
| + | |
− | }
| + | |
− | | + | |
− | return this;
| + | |
− | }
| + | |
− | </code>
| + | |
− | <eval id="4b7becafdb750">
| + | |
− | // Beispiel:
| + | |
− | // Object MeineAmeise = Ameise("Tobias");
| + | |
− | // MeineAmeise.zeigeNamen();
| + | |
− | </eval>
| + | |
− | | + | |
− | == Welche Methoden kennen wir bereits? ==
| + | |
− | | + | |
− | {{Aufgabe-Mathe| | + | |
− | | + | |
− | Löse das Kreuzworträtsel mit allen bekannten Methode aus ''AntMe!''.
| + | |
− | | + | |
− | }}
| + | |
− | <div class="kreuzwort-quiz">
| + | |
− | {|
| + | |
− | |-
| + | |
− | | RiechtFreund || Eine Ameise nimmt Geruch von einer Ameise des eigenes Volkes wahr.
| + | |
− | |-
| + | |
− | | GeheZuZiel || Methode schickt die Ameise in eine bestimmte Richtung.
| + | |
− | |-
| + | |
− | | ZielErreicht || Ameise kommt an.
| + | |
− | |-
| + | |
− | | SiehtFeind || Eine Wanze oder gegnerische Ameise ist gesichtet.
| + | |
− | |-
| + | |
− | | WirdAngegriffen || Wenn Gegner die Ameise attackieren, wird diese Methode aufgerufen.
| + | |
− | |-
| + | |
− | | LasseNahrungFallen || Die aktuelle Last wird weggeworfen.
| + | |
− | |-
| + | |
− | | BrauchtNochTräger || Schleppen genügend Ameisen einen Apfel?
| + | |
− | |-
| + | |
− | | Sieht || Eine Ameise erblickt einen Apfel oder Zuckerhut.
| + | |
− | |-
| + | |
− | | Nimm || Eine Ameise hebt einen Zuckerwürfel oder Apfel auf.
| + | |
− | |-
| + | |
− | | GeheZuBau || Ameise läuft zu ihrem Startpunkt.
| + | |
− | |}
| + | |
− | </div>
| + | |
− | | + | |
− | So sollten auch deine Ameisen kommunizieren:
| + | |
− | | + | |
− | [[Bild:Krüger_Kommunikation.gif|600px|center]]
| + | |
− | | + | |
− | Und jetzt bauen wir ...
| + | |
− | | + | |
− | == Eine Ameisenstraße ==
| + | |
− | | + | |
− | {{Aufgabe-Mathe|
| + | |
− | | + | |
− | Wir brauchen dafür neue Methoden und Attribute.<br />
| + | |
− | Ordne den jeweiligen Begriffen die richtige Beschreibung zu.<br />
| + | |
− | Nutze die {{pdf|Krüger_Befehlsliste.pdf|Befehlsliste}}<ref>Quelle: [http://antme.net http://antme.net]</ref> oder die Übersetzung des Begriffs, wenn dir Codefragmente unbekannt sind.
| + | |
− | | + | |
− | }}
| + | |
− | <div class="zuordnungs-quiz">
| + | |
− | {|
| + | |
− | |-
| + | |
− | | <tt>public override void Tick()</tt> || Wird jede Runde bei jeder Ameise aufgerufen
| + | |
− | |-
| + | |
− | | <tt>this.Richtung</tt> || Gibt die Richtung der Ameise an.
| + | |
− | |-
| + | |
− | | <tt>Ziel is Bau</tt> || Überprüft, ob das Ziel der Ameise der Bau ist(Rückgabwert: <tt>true</tt> oder <tt>false)</tt>
| + | |
− | |-
| + | |
− | | <tt>SprüheMarkierung(int information, int groesse)</tt> || Die Ameise verteilt ihre Duftwolke mit einer Information in einer bestimmten Größe.
| + | |
− | |-
| + | |
− | | <tt>this.Richtung + 180</tt> || Gibt die entgegengesetzte Richtung der Ameise an.
| + | |
− | |-
| + | |
− | | <tt>Koordinate.BestimmeRichtung(Startpunkt, Zielpunkt)</tt> || Gibt eine Richtung im Gradmaß zurück. Gemessen wird der Drehwinkel ausgehend vom Startpunkt zum Zielpunkt.
| + | |
− | |-
| + | |
− | | <tt>markierung.Information</tt> || Liest die Information aus einer Duftwolke aus.
| + | |
− | |-
| + | |
− | | <tt>public void DreheInRichtung(int richtung)</tt> || Dreht die Ameise in die angegebene Richtung.
| + | |
− | |}
| + | |
− | </div>
| + | |
− | | + | |
− | | + | |
− | | + | |
− | {| class="wikitable"
| + | |
− | |-
| + | |
− | | '''Ein kurzer Überblick von''' || Beschreibung || Beispiel
| + | |
− | |-
| + | |
− | | Schlüsselwort <tt>this</tt> || Das Schlüsselwort nimmt Bezug auf das aktuelle Objekt. Man nutzt es für nicht eindeutige Aufrufe innerhalb einer Methode. ||
| + | |
− | public class Name {
| + | |
− | private String vorname = "Max";
| + | |
− |
| + | |
− | // gibt den Vornamen Max zurück, nicht Moritz
| + | |
− | public String getVorname() {
| + | |
− | String vorname = "Moritz";
| + | |
− | return this.vorname;
| + | |
| } | | } |
| } | | } |
− | |-
| + | </code> |
− | | Klasse <tt>Koordinate</tt> || In der Klasse <tt>Koordinate</tt> ist z.B. eine Methode <tt>BestimmeRichtung((Startpunkt, Zielpunkt)</tt>. Sie gibt den Winkel im Uhrzeigersinn in der Einheit Grad an.||
| + | |
− | * 0° <math>\hat{=}</math> nach rechts
| + | |
− | * 90° <math>\hat{=}</math> nach oben
| + | |
− | * 180° <math>\hat{=}</math> nach links
| + | |
− | * 270° <math>\hat{=}</math> nach rechts
| + | |
− | |-
| + | |
− | | Objekt <tt>markierung</tt> || Das Objekt hat z.B. ein Attribut <tt>Information</tt>, ähnlich wie bei dem Schlüsselwort <tt>this</tt> ||
| + | |
− | markierung.Information
| + | |
− | oder
| + | |
− | Int64.MinValue //kleinster Integerwert
| + | |
− | |}
| + | |
− | | + | |
− | | + | |
− | {{Aufgabe-Mathe|
| + | |
− | | + | |
− | Löse das Quiz!<br />
| + | |
− | '''Beachte:''' Es können auch mehrere Antwortmöglichkeiten richtig sein.
| + | |
− | <quiz display="simple">
| + | |
− | {Wie muss der Quellcode richtig implementiert werden, damit die Ameisen beim Transport in ihren Bau eine Markierung versprühen?}
| + | |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast != 0 && Ziel is Bau)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(this.Richtung + 180, 10);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>SprüheMarkierung();<br />}</tt></div>
| + | |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>SprüheMarkierung(0, 10);<br />}</tt></div>
| + | |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast > 0 && Ziel != null)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(this.Richtung + 180, 10);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast > 0 && Ziel is Bau)<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(this.Richtung + 180, 10);<br />}</tt></div>
| + | |
− | | + | |
− | {Muss eine weitere Methode geändert werden?}
| + | |
− | - Nein, die Ameisen wissen aus der Information der Markierung was sie machen müssen.
| + | |
− | - An mehreren Stellen müssen noch weitere Veränderungen vorgenommen werden, sonst laufen die Ameisen ziellos über das Gelände.
| + | |
− | + Ja, die Methode <tt>RiechtFreund(Markierung markierung)</tt> muss noch angepasst werden.
| + | |
− | - Mit dieser Idee der Implementierung entsteht nie eine Ameisenstraße.
| + | |
− | | + | |
− | {Mit welcher Methode gehen die Ameisen mit der Information aus der Duftwolke zur Nahrung?}
| + | |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void RiechtFreund(Markierung markierung)<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast == 0 && Ziel == null)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>GeheZuZiel(markierung);<br /><span style="color:#eeeeee">____</span>DreheInRichtung(markierung);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void RiechtFreund(Markierung markierung)<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast == 0 && Ziel == null)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>GeheZuZiel(markierung);<br /><span style="color:#eeeeee">____</span>DreheInRichtung(markierung.Information);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void RiechtFreund(Markierung markierung)<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast == 0 && Ziel == null)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>GeheZuZiel(markierung);<br /><span style="color:#eeeeee">____</span>DreheInRichtung(markierung.ID);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void RiechtFreund(Markierung markierung)<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast == 0 && Ziel == null)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>DreheInRichtung(markierung.Information);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| + | |
− | | + | |
− | {Schau dir das Bild an und vergleiche es mit deiner Implemtierung: [[Bild:Krüger_TragenZuBau.gif|500px|right]]}
| + | |
− | + Einige Ameisen laufen nur nach rechts. Der Quellcode muss weiter angepasst werden.
| + | |
− | - Die Ameisen tragen den Apfel direkt in den Bau. Schneller geht es nicht.
| + | |
− | + Durch eine unbekannte Ursache tragen die Ameisen den Apfel nicht auf dem kürzesten Weg in den Bau.
| + | |
− | - Die Ameisen ignorieren den Apfel und bringen nur Zucker in den Bau.
| + | |
− | </quiz> | + | |
| }} | | }} |
− |
| |
− | [[Bild:Krüger_Aha.png|center]]
| |
− |
| |
− | <div class="lueckentext-quiz">
| |
− | Die Eigenschaft <tt>this.Richtung</tt> aus der Ameisenklasse gibt die '''Blickrichtung''' der Ameise auf dem Spielfeld an. Außerdem bringt die "GeheGeradeaus"-Bewegung der Ameisen in der Simulation eine kleine Ungenauigkeit mit kurzen '''Zickzack-Bewegungen'''. Deshalb ist die Anwendung der Methode '''<tt>BestimmeRichtung'''()</tt> besser geeignet.
| |
− | </div>
| |
− |
| |
− | {{Aufgabe-Mathe|
| |
− |
| |
− | <quiz display="simple">
| |
− | {Welche Methode gibt der Markierung eine verbesserte Richtung für die anderen Ameisen?}
| |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast != 0 && Ziel is Bau)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(Koordinate.BestimmeRichtung(Ziel, this), 20);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast != 0 && Ziel is Bau)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(BestimmeRichtung(Ziel, this), 20);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| |
− | + <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast != 0 && Ziel is Bau)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(BestimmeRichtung(this, Ziel) + 180, 20);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| |
− | - <div style="border: 1px solid blue;border-style:dashed;"><tt>public override void Tick()<br />{<br /><span style="color:#eeeeee">__</span>if (AktuelleLast != 0 && Ziel is Bau)<br /><span style="color:#eeeeee">__</span>{<br /><span style="color:#eeeeee">____</span>SprüheMarkierung(Koordinate.BestimmeRichtung(Bau, hier), 20);<br /><span style="color:#eeeeee">__</span>}<br />}</tt></div>
| |
− | </quiz>
| |
− | }}
| |
− |
| |
− |
| |
− | {{Aufgabe-Mathe|
| |
− |
| |
− | # Implementiere den richtige Quellcode bei deinem eigenen Ameisenvolk!
| |
− | # Erstelle dein individuelles Ameisenvolk! Verbessere die Intelligenz und das Verhalten deiner Ameisen um noch mehr Punkte zu sammeln!
| |
− |
| |
− | }}
| |
− |
| |
− |
| |
− | <div style="border: 1px solid #dfdfdf; background-color:#dfdfdf; font-size:1px; height:8px; border-bottom:1px solid #dfdfdf;"></div>
| |
− | <div style="border:1px solid #dfdfdf; background-color:#FEFEFE; align:center; padding:7px;margin-bottom:10px;">
| |
− |
| |
− | == Das kannst du jetzt ==
| |
− | * eigene Markierung mit den Ameisen versprühen
| |
− | * auf Markierungen reagieren
| |
− | * Objekte in der Wiki-Umgebung erstellen und damit arbeiten
| |
− | * den Unterschied bei der Objektinstanziierung mit dem <tt>new</tt>-Operator und dem <tt>null</tt>-Wert
| |
− | * Ameisenstraßen mit ''AntMe!'' bauen
| |
− | </div>
| |
− |
| |
− |
| |
− | [[Bild:Krüger_Ameisenstrasse.png|600px|center]]
| |
− |
| |
− | [[../|<math>\Leftarrow</math> zurück zum Hauptmenü]]
| |
− |
| |
− | == Quellen ==
| |
− | <references />
| |