Skip to content

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();
    }
}   
            
                    
        
  1. Kommentiere die Methode zeilenweise.
  2. Erläutere, wie es dazu kommt, dass die Ausführung der Methode niemals beendet wird und verbessere den Fehler, der dazu führt.
WolkeZiehen
Balken

Ü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.

2.2 Erste Übungen zu Wiederholungen
2.2 Erste Übungen zu Wiederholungen
    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.

  1. Erstelle die Klasse FolgenderPunkt auf der Grundlage des nebenstehenden UML-Diagramms (im nebenstehenden Prototypen findet sich das Zwischenergebnis).
  2. 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.

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.

  1. Erstelle die Klasse Reaktionstest auf der Grundlage des nebenstehenden UML-Diagramms (im nebenstehenden Prototypen findet sich das Zwischenergebnis).
  2. Die Methode fuehreAus soll die folgende Funktionalität erhalten:
    1. Solange die rechte Maustaste nicht gedrückt wurde, soll die Anweisung SGSystem.warte() ausgeführt werden.
    2. 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.

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.

  1. Kommentiere den Quelltext zeilenweise. Gehe insbesondere auf die Bedingung in der Zeile 5, und die Anweisungen in den Zeilen 8, 11 und 12 ein.
  2. Erkläre anschließend, wie die Animation aussieht, die beim Aufruf der Methode gezeigt wird.
  3. Begründe, warum die innere while-Schleife (Zeile 5 – 10) insgesamt 500 mal durchlaufen wird.
  4. 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);
	}
}   
            
                    
        
VerschachtelteSchleife
2.2 Erste Übungen zu Wiederholungen
2.2 Erste Übungen zu Wiederholungen

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.

  1. Implementiere die Methode feuere() so, dass die Kugel entlang einer geraden Linie fliegt.
  2. 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:
Piratenschiff
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();
	}
}