Abschnitt 7-5 - von Ulrich Helmich

Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Workshop (fakultativ)
7.5 Mit bunten Kreisen spielen
In diesem fakultativen Workshop wollen wir mit Objekt-Arrays arbeiten. Sie erinnern sich an die Klasse Kreis,
die wir in der Folge 5 konstruiert hatten. Kreis-Objekte sind Graphik-Objekte, die beispielsweise von einem
Applet aufgerufen und auf der Zeichenfläche dargestellt werden können.
Schritt 1
Betrachten Sie das folgende Java-Applet:
import java.awt.*;
import javax.swing.*;
public class MeinApplet extends JApplet
{
Kreis[] k;
public void init()
{
k = new Kreis[10];
for (int i=0; i<10; i++)
k[i] = new Kreis(50+i*40,150,20,new Color(i*25,0,0),Color.BLACK,3);
}
public void paint(Graphics g)
{
for (int i=0; i<10; i++)
k[i].paint(g);
}
}
So sieht das Ergebnis der paint()-Methode aus:
1 Die zehn erzeugten Kreise
Seite 1 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Schritt 2 - Zufallskreise
Betrachten Sie das folgende Applet
2 Ein Java-Applet mit zehn Städten
Die Abbildung soll zehn Städte eines Landkreises darstellen. Jede Stadt hat eine X-Koordinate und eine YKoordinate. Wie kann man zehn solcher Städte speichern?
Es gibt hier mehrere Möglichkeiten, von denen einige recht elegant sind, andere weniger. Da wir aber schon die
Klasse Kreis entwickelt haben und gesehen haben, wie man Kreis-Objekte in ein Applet einbindet, sollte die
Implementation eines entsprechenden Applets für Sie kein Problem sein. Das einzig Neue an dieser Aufgabe ist
die Verwendung eines Zufallsgenerators für die Festlegung der Positionen der zehn Städte.
Übung 7.5 - 1 (3 Punkte)
Verändern Sie die init()-Methode des Applets aus Schritt 1 so, dass zehn gleich große rote Kreise mit
schwarzem Rand zufällig über das Applet verteilt werden. Die Kreise müssen sich vollständig innerhalb des
Applets befinden, den Rand des Applets dürfen sie nicht berühren.
Seite 2 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Schritt 3 - Bewegliche Kreise
Wenn Sie die Folge 6 mit der "Robotersteuerung" durchgearbeitet haben, sollte die nächste Übung für Sie
überhaupt kein Problem sein. Sie müssen nur wissen, wie man einen Button in ein Applet einbaut und durch
welchen Trick man die Ausgabe eines Applets komplett bzw. teilweise löschen kann - der Button sollte besser
nicht gelöscht werden.
Übung 7.5 - 2 (4 Punkte)
Ergänzen Sie das Applet aus Übung 7.5 - 1 um einen Button, den Sie mit "Bewegen" oder "Move" beschriften.
Jedes Mal, wenn der Benutzer auf diesen Button klickt, sollen für jeden der zehn Kreise die Koordinaten neu
berechnet werden. Und zwar soll der x-Wert um einen kleinen Zufallsbetrag zwischen -10 und +10 erhöht
werden, und der y-Wert ebenfalls. Nach der Neuberechnung der Koordinaten sollen die zehn Kreise erneut
gezeichnet werden (Löschen der alten Kreise nicht vergessen!).
Übung 7.5 - 3 (4 Punkte)
Verändern Sie das Applet aus Übung 7.5 - 2 so, dass die Kreise das Applet nicht verlassen können, wenn der
Button angeklickt wurde. Wenn ein Kreis den Rand des Applets erreicht, soll er seine zufälligen Bewegungen
nicht einstellen, sondern sich weiter bewegen - allerdings nicht über den Rand hinaus!
Lösungshinweis zur Übung 7.5 - 3
Angenommen, der Kreis mit dem Index 4 hat die x-Koordinate 20 und die y-Koordinate 160. Durch Klicken auf
den "Move"-Button wird die x-Koordinate jetzt auf 4 und die y-Koordinate auf 170 verändert. Mit einem Radius
von 10 würde der Kreis den linken Rand des Applets nicht nur berühren, sondern ein großer Teil des Kreises
würde sogar außerhalb des Applets liegen. Das geht natürlich auf gar keinen Fall. Also muss für die x-Koordinate
eine neue Zufallszahl ermittelt werden - und war so oft, bis der x-Wert in Ordnung ist.
Seite 3 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Schritt 4 - Kreise, die sich vermehren
Wenn Sie einen Array angelegt haben, der 200 Objekte der Klasse Kreis enthält, zwingt Sie niemand, auch
tatsächlich alle 200 Speicherplätze sofort mit Kreis-Objekten zu belegen.
import java.awt.*;
import javax.swing.*;
public class MeinApplet extends JApplet
{
Kreis[] k;
int belegt;
public void init()
{
k = new Kreis[200];
belegt = 10;
for (int i=0; i<belegt; i++)
k[i] = new Kreis(50+i*40,150,20,Color.RED,Color.BLACK,1);
}
public void paint(Graphics g)
{
for (int i=0; i<belegt; i++)
k[i].paint(g);
}
}
In diesem Applet zeigt das Attribut k auf eine Stelle im Arbeitsspeicher, an der bis zu 200 Objekte der Klasse
Kreis gespeichert werden können. In der init()-Methode werden jedoch nur zehn Kreis-Objekte erzeugt und in
dem Array gespeichert. Das Attribut belegt speichert dann die Zahl der tatsächlich belegten Array-Plätze.
Sie können nun jederzeit neue Array-Elemente erzeugen, also Objekte der Klasse Kreis, und diese in den noch
freien Plätzen speichern. Sie müssen nur darauf achten, dass Sie dann auch den Wert von belegt entsprechend
vergrößern.
public void weitererKreis()
{
if (belegt < 200)
k[belegt++] = new Kreis(150,250,20,Color.RED,Color.BLACK,1);
}
Diese Methode ergänzt den Array um einen weiteren Kreis und inkrementiert danach den Wert von belegt.
Zuvor wird überprüft, ob belegt eventuell den maximalen Wert 200 erreicht hat. Dann wird nämlich nichts mehr
gemacht.
Interessant ist hier die Tatsache, dass belegt sofort nach dem Zuweisen des neuen Elementes inkrementiert wird.
Durch k[belegt++] wird zunächst das Element k[belegt] mit einem Objekt verknüpft, anschließend wird
belegt inkrementiert.
Seite 4 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Experten-Übung 7.5 - 4 (5 Punkte)
Nehmen Sie das Applet aus den letzten Übungen, verändern Sie es so, dass von den 200 möglichen Kreisen
erst zehn belegt sind (Attribut belegt nicht vergessen). Beim Start des Applets werden also nur 10 rote
Kreise angezeigt.
Beim Anklicken des Buttons sollen sich die Kreise bewegen (siehe Übung 7.5 - 2) und das Applet nicht
verlassen können (siehe Übung 7.5 - 3).
Jetzt kommt die neue Aufgabe für die Experten unter Ihnen:
Immer dann, wenn sich zwei Kreise berühren (hier müssen Sie also eine Kollisionsabfrage
einbauen), soll ein neuer Kreis entstehen und in den Array aufgenommen werden. Sie können die
Kreise also als rote Käfer interpretieren, die sich gelegentlich vermehren.
Experten-Übung 7.5 - 5 (4 Punkte)
Ergänzen Sie das Applet aus Übung 7.5 - 4 derart, dass die neuen Kreise zunächst kleiner dargestellt werden als
die alten Kreise. Bei jedem Klick auf den Button wachsen die kleinen Kreise (die Jungtiere) dann, bis sie den
Wert der alten Kreise (Eltern) erreicht haben (2 Punkte).
Sorgen Sie weiterhin dafür, dass sich nur erwachsene Tiere vermehren können. Wenn also zwei Jungtiere oder
ein Alttier und ein Jungtier zusammenstoßen, passiert nichts weiter (2 Punkte).
Superexperten-Übung 7.5 - 6 (6 Punkte)
Statten Sie das Applet mit zwei Arrays von Kreisobjekten aus: maximal 200 kleine grüne Kreise (Blattläuse)
und maximal 25 größere rote Kreise (Marienkäfer). Die Marienkäfer sollen nun die Blattläuse fressen. Jedes
Mal, wenn zwei erwachsene Marienkäfer zusammenstoßen, entsteht ein neuer junger Marienkäfer (siehe
Übung 7.5 - 5). Jedes Mal, wenn zwei erwachsene Blattläuse zusammenstoßen, entsteht eine neue junge
Blattlaus. Jedes Mal, wenn ein junger oder erwachsener Marienkäfer auf eine junge oder erwachsene Blattlaus
stößt, wird die Blattlaus gefressen (aus dem Objekt-Array gelöscht oder als "gefressen" gekennzeichnet, so
dass sie nicht mehr angezeigt wird).
Dieses PDF-Dokument ist ein Auszug aus meiner alten Buch-Version, die ich an zahlreiche Kollegen und auch
Schüler abgegeben habe. Leider kann ich aus zeitlichen Gründen diese Buchversion nicht mehr weiter pflegen, es
macht einfach zu viel Arbeit, die Buchversion immer aktuell zu halten. Mit der Webversion ist das viel einfacher,
daher werde ich mich in Zukunft auf die Wartung der Webversion konzentrieren. Gelegentlich werde ich aber die
alte Buchversion "plündern", so wie jetzt mit diesem Abschnitt, um mir die Arbeit mit der Webversion etwas zu
erleichtern.
Ulrich Helmich im März 2016.
Seite 5 von 5