2.2 Erste Übungen zu Wiederholungen
Übung 1: Schiefe Bahn
Öffne das Projekt „2-3 Schiefe Bahn Prototyp“. Hier soll eine Murmel auf einer schiefen Bahn animiert werden. Es muss nur die Methode fuehreAus
implementiert werden. Je nachdem, mit welcher Klasse du arbeitest, erhältst du zusätzliche Hilfen oder nicht:SchiefeBahn
: Die Methode fuehreAus
ist leer und enthält keine helfenden Kommentare. Du musst komplett eigenständig programmieren.SchiefeBahnMitHilfe
: Die Methode fuehreAus
enthält einige Kommentare, die dir weiterhelfen können.SchiefeBahnMitPseudocode
: Die Methode fuehreAus
enthält die Lösung bereits in Pseudocode, der nur noch in Java-Code übersetzt werden muss.

Übung 2: Die unendliche Geschichte
In der nebenstehenden Szene siehst du eine Wolke, die sich nach rechts aus dem Bild bewegt. Allerdings findet sich in der Methode ein Fehler, der dazu führt, dass sie niemals beendet wird. Dies zeigt das Programmfenster von BlueJ mit dem Balken unten rechts an. Solange sich dieser hin- und herbewegt, wird die Methode noch ausgeführt.
Der Quelltext der Methode sieht wie folgt aus:
public void lasseWolkeZiehen()
{
while(wolke1.gibX()>0)
{
wolke1.verschiebe(1,0);
wolke2.verschiebe(1,0);
SGSystem.warte();
}
}
- Kommentiere die Methode zeilenweise.
- Erläutere, wie es dazu kommt, dass die Ausführung der Methode niemals beendet wird und verbessere den Fehler, der dazu führt.


Übung 3: Spaß mit Flaggen reloaded
In der nebenstehenden Szene soll die Fahne so animiert werden, dass sie langsam nach oben gezogen wird. Die Methode lasseFahneSteigen()
wurde von Schülerinnen und Schülern unterschiedlich implementiert.
Beschreibe die Unterschiede zwischen den beiden Quelltexten und wie sich dies auf die Animation auswirken wird. Entscheide dann, welche Implementation sinnvoller ist.


public void lasseFahneSteigen()
{
while(schwarz.gibY()>50)
{
schwarz.verschiebe(0, -2);
SGSystem.warte();
}
while(rot.gibY()>75)
{
rot.verschiebe(0, -2);
SGSystem.warte();
}
while(gold.gibY()>100)
{
gold.verschiebe(0, -2);
SGSystem.warte();
}
}
public void lasseFahneSteigen()
{
while(schwarz.gibY()>50)
{
schwarz.verschiebe(0, -2);
rot.verschiebe(0, -2);
gold.verschiebe(0, -2);
SGSystem.warte();
}
}
Maussteuerung
In den folgenden Aufgaben werden die Methoden, die einem SGMaus
-Objekt zur Verfügung stehen, genutzt, um Bedingungen für while-Schleifen zu konstruieren. Lies daher die Dokumentation zur Klasse SGMaus
.
Übung 4: Follow me!
Im Projekt „Folgender Punkt“ soll ein SGKreis
-Objekt fortlaufend so positioniert werden, dass es sich unterhalb des Mauszeigers befindet.
- Erstelle die Klasse
FolgenderPunkt
auf der Grundlage des nebenstehenden UML-Diagramms (im nebenstehenden Prototypen findet sich das Zwischenergebnis). - Die Methode
fuehreAus
soll die folgende Funktionalität erhalten:
Solange nicht mit der rechten Maustaste geklickt wurde, führe die folgenden Anweisungen aus:- Die x-Koordinate des Objekts
verfolger
wird auf die x-Koordinate der Maus gesetzt. - Die y-Koordinate des Objekts
verfolger
wird ebenfalls auf die y-Koordinate der Maus gesetzt. - Die Ausführung des Programms wird kurz unterbrochen.
- Die x-Koordinate des Objekts
Zusatzaufgabe
Beim Testen des Programms fällt auf, dass nicht der Mittelpunkt des Kreises auf die Mausposition gesetzt wird. Überlege dir, wie der Wert, den die Abfrage der Mausposition liefert, verändert werden muss, damit die Maus genau über dem Mittelpunkt des Kreises schwebt.

Übung 5: Reaktionstest
Im Projekt Reaktionstest soll ein SGKreis
-Objekt fortlaufend nach rechts verschoben werden. Am rechten Bildschirmrand befindet sich eine Wand. Durch einen Mausklick kann die Bewegung des SGKreis
-Objekts beendet werden. Dies soll in möglichst kurzer Distanz zur Wand erfolgen.
- Erstelle die Klasse
Reaktionstest
auf der Grundlage des nebenstehenden UML-Diagramms (im nebenstehenden Prototypen findet sich das Zwischenergebnis). - Die Methode
fuehreAus
soll die folgende Funktionalität erhalten:
- Solange die rechte Maustaste nicht gedrückt wurde, soll die Anweisung
SGSystem.warte()
ausgeführt werden. - Solange die linke Maustaste nicht gedrückt wurde, soll das
SGKreis
-Objekt um 2 Pixel nach rechts verschoben und die Programmausführung kurz unterbrochen werden.
- Solange die rechte Maustaste nicht gedrückt wurde, soll die Anweisung
Zusatzaufgabe
In der Konsole soll der Abstand zur Barriere ausgegeben werden. Die zugehörige Anweisung findet sich unten und muss die letzte Anweisung in der Methode sein.
System.out.println("Abstand: " +
(wand.gibX() - (ball.gibX() + 2*ball.gibRadius()) ) );


Übung 6: Verschachtelte Schleifen
Der untenstehende Quelltext zeigt eine Methode, mit der die nebenstehende Landschaft animiert wird. Der Startzustand der Objekte sonne
und rauch
zu Beginn der Methode findet sich auf den Objektkarten.
- Kommentiere den Quelltext zeilenweise. Gehe insbesondere auf die Bedingung in der Zeile 5, und die Anweisungen in den Zeilen 8, 11 und 12 ein.
- Erkläre anschließend, wie die Animation aussieht, die beim Aufruf der Methode gezeigt wird.
- Begründe, warum die innere
while
-Schleife (Zeile 5 – 10) insgesamt 500 mal durchlaufen wird. - Erläutere, wie oft die innere
while
-Schleife (Zeile 5 – 10) durchlaufen werden würde, wenn sie hinter die Zeile 14 verschoben werden würde. Beschreibe auch, wie die Animation dann aussehen würde.
public void animiere()
{
while(sonne.gibY() < 35)
{
while(rauch.gibTransparenz() > 0)
{
rauch.verschiebe(0.25, -0.75);
rauch.setzeTransparenz(rauch.gibTransparenz() - 0.01);
SGSystem.warte(30);
}
rauch.setzePosition(165,310);
rauch.setzeTransparenz(1.0);
sonne.verschiebe(1.0, 1.0);
}
}


Abstecher in die Mathematik: Piratenschiff
Die nebenstehende Animation zeigt ein Piratenschiff, das eine Kanonenkugel abfeuert. Im zugehörigen Prototypen ist die Szene bereits implementiert und es muss nur noch die Methode feuere()
vervollständigt werden.
- Implementiere die Methode
feuere()
so, dass die Kugel entlang einer geraden Linie fliegt. - Damit die Flugbahn der Kugel eine Kurve beschreibt, darf die Verschiebung in y-Richtung kein fester Wert sein: Bis zum Scheitelpunkt wird der Wert der y-Koordinate verringert, danach wieder vergrößert. Im Folgenden findest du zwei Ansätze, wie dies implementiert werden kann. Erkläre beide Ansätze:
Ansatz 1:
public void feuere()
{
while(kugel.gibX() < 800)
{
kugel.verschiebe(3, -3 + (kugel.gibX()-470)/50);
SGSystem.warte();
}
}
Ansatz 2:
private double vx = 3.0;
private double vy = -3.0;
public void feuere()
{
while(kugel.gibX() < 800)
{
kugel.verschiebe(vx, vy);
vy = vy + 0.06;
SGSystem.warte();
}
}