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
© Copyright 2024 ExpyDoc