Home > Informatik > Stufe EF > Folge 2 > Folge 2.3

2.3 Wir programmieren ein Bild, Teil 3

Bild programmieren - Sondierende Methoden - Fallunterscheidungen

Schritt 12 - Wo ist denn die Sonne?

⇒ Öffnen Sie das letzte Projekt und speichern Sie eine Kopie des Projektes unter einem sinnvollen Namen wie zum Beispiel "Zeichnung-nach-Schritt-12" ab.

⇒ Verändern / vereinfachen Sie den Quelltext der neuen Klasse Zeichnung wie folgt (überflüssige Attribute und Methoden einfach entfernen, das ist ja kein Problem, weil Sie ja noch die alte Version gespeichert haben, so dass Sie jederzeit darauf zurückgreifen können):

public class Zeichnung
{
   Circle sonne;

   public Zeichnung()
   {
      sonne = new Circle();
   }

   public void makeVisible()
   {
      sonne.makeVisible();
   }

   public void draw()
   {
      sonne.changeColor("red");
      sonne.changeSize(100);
      sonne.moveHorizontal(950);
   }
}

Der Konstruktor wurde hier wieder vereinfacht; die Methoden makeVisible() und draw() werden im Konstruktor nicht automatisch aufgerufen, sondern müssen wieder mit der rechten Maustaste aus dem Kontextmenü heraus aktiviert werden. Warum das so ist, werden Sie gleich erfahren.

⇒ Kompilieren Sie nun das Projekt und erzeugen Sie ein Objekt der Klasse Zeichnung, öffnen Sie das Kontextmenü des Zeichnungs-Objektes und rufen Sie zunächst die Methode makeVisible() auf, danach die Methode draw().

Nach dem Ausführen von makeVisible() sehen Sie einen kleinen blauen Kreis in der linken oberen Ecke der Zeichenfläche.

Nach dem Ausführen von draw() sehen Sie aber nicht wie vielleicht erwartet einen größeren roten Kreis am rechten Rand des Fensters, sondern nur eine leere Zeichenfläche. Vielleicht, wenn Sie einen langsamen Computer haben, konnten Sie kurz vorher noch ein gelbes Aufblitzen sehen, weil der Kreis ja seine Farbe geändert hat und größer geworden ist. Danach aber "verschwindet" der Kreis von der Zeichenfläche.

Sie haben den Kreis durch den Aufruf von

sonne.moveHorizontal(950)

um sage und schreibe 950 Pixel nach rechts bewegt. Die Zeichenfläche hat aber gar nicht so viele Pixel, sie ist nur 300 Pixel breit.

Wie können wir nun verhindern, dass der Kreis nach rechts aus der Zeichenfläche verschwindet, wenn man moveHorizontal() so unvorsichtig aufruft, wie wir es gerade gemacht haben?

Schritt 13 - Die Methode moveHorizontal() verbessern

⇒ Doppelklicken Sie auf die Klasse Circle und suchen Sie im Quelltext die Methode moveHorizontal().

Diesen Quelltext hatten wir bereits in der letzten Teilfolge besprochen:

public void moveHorizontal(int distance)
{
	erase();
	xPosition += distance;
	draw();
}

Wir wollen den Quelltext jetzt so verändern, dass der Kreis die Zeichenfläche nicht mehr nach rechts verlassen kann.

⇒ Verändern Sie den Quelltext der Methode folgendermaßen:

public void moveHorizontal(int distance)
{
	erase();
	if (xPosition + distance < 300)
		xPosition += distance;
	draw();
}

⇒ Erzeugen Sie wieder ein Objekt der Klasse Zeichnung und testen Sie die veränderte Methode, indem Sie die makeVisible()- und dann die draw()-Methode des Zeichnung-Objektes aufrufen, welche den Kreis um 970 Pixel nach rechts bewegen soll.

Sie sehen jetzt keinen großen roten Kreis am rechten Rand der Zeichenfläche. Die Methode moveHorizontal() wurde zwar aufgerufen und ausgeführt, aber die Methode hat die Position des Kreis-Objektes nicht verändert.

Die logische Bedingung (xPosition + distance < 300) war nämlich nicht erfüllt.

Die ursprüngliche xPosition hatte den Wert 20, dazu wurde dann eine Distanz von 950 addiert, also hatte die Summe xPosition + distance den Wert 970. Der Wert 970 ist mit Sicherheit nicht kleiner als der Wert 300.

logische Bedingung

if-else-Bedingung

Zu diesen beiden wichtigen Themen gibt es je einen Lernbaustein, den Sie sich unbedingt anschauen sollten, selbst dann, wenn Sie in der Sekundarstufe I schon eine andere Programmiersprache wie zum Beispiel Scratch oder JavaScript kennengelernt haben. Anschließend können Sie die Aufgabe 2.3-1 bearbeiten und lösen.

Aufgabe 2.3-1

Begründen Sie, welche der folgenden if-Anweisungen falsch sind. Die Variable x ist dabei immer vom Typ int, also eine ganze Zahl.

if (x + 3) x++;
if (x >= 12) x--;
if (x+y*3 = 20) y=12;
if (x == true) x=12;
if (true) x = 12;

Zu den Lösungen... / Lösungen für Schüler(innen))

Zurück zu unserem Graphik-Projekt.

⇒ Verändern Sie den Quelltext der Methode draw() jetzt folgendermaßen:

public void draw()
{
	sonne.changeColor("red");
	sonne.changeSize(100);
	sonne.moveHorizontal(270);
}

Man sieht jetzt nur noch einen ganz kleinen Zipfel der großen roten Sonne am rechten Rand der Zeichenfläche, der größte Teil der Sonne ist verschwunden:

Beschreibung siehe folgenden Text

Der rote Kreis ist kaum zu sehen

Warum ist das so?

Anfangs hatte das Attribut xPosition des Objektes sonne einen Wert von 20. Dann wurde durch

sonne.moveHorizontal(270);

der Wert 270 dazu addiert. Der neue Attributwert ist jetzt also 290. Das heißt, die linke obere Ecke des Objektes befindet sich an der xPosition 290. Der rechte Rand des Fensters hat aber die Position 300. Also sieht man quasi nur 10 Pixel des Kreises, der größte Teil des Kreises - 90 Pixel - befindet sich außerhalb des Fensters.

Aufgaben und Übungen

Übung 2.3-2

Verändern Sie die Methode moveHorizontal() so, dass beim Überprüfen, ob der rechte Rand erreicht wird, auch der Durchmesser des Kreises berücksichtigt wird. Ein großer Kreis erreicht den rechten Rand nämlich eher als ein kleiner Kreis.

Achtung:
Das Attribut xPosition definiert nicht die X-Koordinate des Kreis-Mittelpunktes, sondern die X-Koordinate des linken Randes des Kreises.

Beschreibung siehe folgenden Text

Die Koordinaten eines Kreises in Java
Autor: Ulrich Helmich, Lizenz: siehe Seitenende

Ein Kreis mit xPosition = 20 und diameter = 100 erstreckt sich also horizontal von x = 20 bis x = 120.

Zu den Lösungen... / Lösungen für Schüler(innen))

Übung 2.3-3

Ergänzen Sie die Klasse Circle um eine sondierende Methode

public boolean atRightBorder()

welche den Wert true zurückliefert, wenn der Kreis den rechten Rand berührt. Wenn sich zum Beispiel ein Kreis mit dem Durchmesser 50 an der X-Position 250 befindet, müsste die Methode true zurückliefern. Hat der Kreis nur einen Durchmesser von 49, dann müsste die Methode dagegen false liefern, weil ja noch 1 Pixel frei ist zwischen dem rechten Rand des Kreises und dem rechten Rand des Fensters.

Zu den Lösungen... / Lösungen für Schüler(innen))

Fallunterscheidungen

Wenn Sie mehr über Fallunterscheidungen wissen möchten (also über if-else-Bedingungen) - es gibt einen neuen Lernbaustein "Fallunterscheidungen", der sich speziell an Anfänger(innen) richtet.

Seitenanfang -
Weiter mit der Folge 3...