Skip to content

2.6 Verzweigungen

Häufig geht es bei Computerprogrammen nicht um das Abarbeiten von genau festgelegten Befehlen. Je nach Eingaben des Benutzers oder Zuständen des Systems soll sich ein Programm unterschiedlich verhalten. Dafür gibt es bedingte Anweisungen. Eine Verzweigung (bedingte Anweisung) besteht dabei aus einer Bedingung und Anweisungsblöcken, die ausgeführt werden, je nachdem ob die Bedingung erfüllt ist oder nicht.

In Java lässt sich eine Verzweigung mit den Schlüsselwörtern if und else programmieren:

if( Bedingung )
{
   // Anweisungsblock für den Fall,
   // dass die Bedingung erfüllt ist.
}
else
{
   // Anweisungsblock für den Fall,
   // dass die Bedingung nicht erfüllt ist.
}

In der Landschaft mit dem Windrad soll die Animation nun durch Benutzereingaben gesteuert werden: Das Windrad soll sich nur drehen, wenn die rechte Cursortaste gedrückt wird. Die Wolke soll währenddessen aber durchgängig nach rechts verschoben werden.

Der zugehörige Quelltext sieht so aus:

    public void animiere() {
	while(tasti.esc() == false) {
		wolke1.verschiebe(0.5, 0);
		wolke2.verschiebe(0.5, 0);
		
		if( tasti.rechts() == true ) {
			rotor1.dreheUmMittelpunkt(1);
			rotor2.dreheUmMittelpunkt(1);
		}
		
		SGSystem.warte();
	}
}   
            
                    
        

In Zeile 2 wird eine Schleife eingeleitet, die ausgeführt werden soll, solange die Escape-Taste nicht gedrückt wurde. Dazu wird die Methode esc() des SGTastatur-Objekts tasti aufgerufen. Sie liefert true oder false, je nachdem, ob die Escape-Taste gedrückt ist.

In Zeile 3 und 4 werden zuerst die beiden SGKreis-Objekte verschoben. Darauf folgt die Verzweigung: Falls die rechte Cursortaste gedrückt wird (Zeile 6) sollen die beiden Rotoren um 1° um ihren Mittelpunkt gedreht werden (in den Zeilen 7 und 8).

In dieser Verzweigung findet sich kein else-Block: Wenn es keine Anweisungen gibt, die ausgeführt werden sollen, wenn die Bedingung nicht erfüllt ist, kann der else-Block auch weggelassen werden.

WindradLinksRechtsDrehen

Im Struktogramm gibt es für Verzweigungen ebenfalls eine besondere Darstellungsform:

Wenn die Bedingung zutreffend (wahr) ist, wird der Anweisungsblock 1 durchlaufen (if); trifft die Bedingung nicht zu (falsch), wird der Anweisungsblock 2 durchlaufen (else). Anweisungsblock 2 kann auch keine Anweisungen enthalten.

strukto_verzweigungn

Aufgaben

Aufgabe 1: Windrad-Linksdreh und Wolkenzug
Ergänze in dem Projekt zum Windrad zwei Verzweigungen:

  1. Wenn die linke Cursortaste gedrückt wird, soll sich das Windrad anders herum drehen.
  2. Wenn die x-Koordinate von wolke1 größer als 500 ist, verschiebe wolke1 und wolke2 um 700 Pixel nach links.

Aufgabe 2: Verzweigungen analysieren
Beim folgenden Quelltext befindet sich das SGKreis-Objekt kreis zu Beginn an der Position (0, 0) und hat die Farbe Rot (1,0,0,).

  1. Kommentiere den folgenden Quelltext zeilenweise.
  2. Gib verschiedene Positionen an, an denen er sich im Verlauf der Animation befindet und beschreibe seinen Weg. Gehe dabei auch darauf ein, welche Farbe er jeweils besitzt.
    public void animiere()
{
	while(kreis.gibX() < 200)
	{
		kreis.verschiebe(1,0);
		
		if(kreis.gibX() < 100)
		{
			kreis.verschiebe(0,1);
		}
		else
		{
			kreis.verschiebe(0,-1);
		}
		
		if(kreis.gibY() > 50)
		{
			kreis.setzeFarbe(0,0,1);
		}
	}
}   
            
                    
        

Aufgabe 3: Struktogramme lesen und in Java implementieren
Bei diesem Projekt ist ein SGRechteck mit dem Namen objekt und ein SGMaus-Objekt mit dem Namen mausi gegeben. Im Hintergrund finden sich verschiedenfarbige Felder. Je nachdem, in welchem Feld die Maus ist, soll das Objekt eine andere Aktion ausführen. Das zugehörigen Struktogramm findet du unten.

Übersetze das Struktogramm in Java-Quelltext.

felder-fuehreAus

Aufgabe 4: Autorennen
Bei diesem Projekt handelt es sich um ein einfaches Autorennen. Im Prototypen sind bereits alle wesentlichen Objekte implementiert. Neben der Tastatur (tasti), dem Auto (rotesAuto) und einem Hindernis in der Mitte (block) ist auch ein Textfeld (gameOver) implementiert, um anzuzeigen, dass das Spiel beendet ist.
Die Methode fuehreAus muss noch implementiert werden.

  1. Nutze das untenstehende Struktogramm, um die Bewegung des Autos zu implementieren.
AutofuehreAus
  1. Ergänze den folgenden Quelltext innerhalb der while-Schleife der Methode fuehreAus. Erkläre dann die Bedingung der if-Verzweigung und beschreibe, was die Anweisungen bewirken.
    if( rotesAuto.kollidiertMit(block) == true )
{
	gameOver.setzeSichtbar(true);
	SGSystem.warte(1000);
	SGSystem.beende();
}   
            
                    
        
  1. Ergänze ein blaues Auto (das Bild hat den Dateinamen „CarBlue.png“), das mit den Tasten „WASG“ gesteuert wird. Lies dafür in der Dokumentation der Klasse SGTastatur, wie überprüft werden kann, ob eine bestimmte Taste gedrückt wurde.
AutorennenUML