====== Eigene Klassen schreiben ====== ===== Beispiel 1: Würfel-Klasse===== Es gibt nicht nur 6-seitige Würfel, sondern auch 8-seitige, 20-seitige usw. \\ Wir schreiben eine Klasse Würfel mit dem Attribut ''seitenzahl'' und einer Methode ''würfle'', die einen Zufallswert zwischen 1 und der Seitenzahl zurückgibt. Damit Du Dir die Bestandteile einer Klasse langsam wieder in Erinnerung rufen kannst, beginnen wir ganz einfach und erweitern die Klasse dann schrittweise. ==== a) Klasse zum Speichern der Seitenzahl ==== Die Zeile public int seitenzahl; **deklariert** das Attribut ''seitenzahl''. Der visibility modifier ''public'' bewirkt, dass der Wert von außerhalb der Klasse aus gelesen und verändert werden kann. ''int'' ist der Datentyp des Attributs, ''seitenzahl'' sein Bezeichner (engl.: //identifier//).
==== b) Methode zum Würfeln ==== public int würfle(){ return Random.randint(1, seitenzahl); } Den Teil ''public int würfle()'' nennt man **Deklaration der Methode**. Hier wird dem Compiler mitgeteilt, dass die Methode den Bezeichner ''würfle'' hat, dass sie einen Wert vom Typ ''int'' zurückliefern soll und dass sie keine Parameterwerte entgegennimmt (daher steht nichts in den '()'). \\ \\ Dahinter folgt in geschweiften Klammern die **Implementierung** der Methode, d.h. das Programm, das ausgeführt wird, wenn die Methode aufgerufen wird. In diesem Fall besteht es aus einer einzigen Anweisung ''return'', die festlegt, welcher Wert zurückgeliefert werden soll.
==== b) Datenkapselung ==== Attribute sollten i.d.R. nicht direkt von außen veränderbar sein, damit die interne Repräsentation der Daten der Klasse geändert werden kann ohne dass alle Programme angepasst werden müssen, die die Klasse nutzen. Wir ändern daher den visibility modifier von ''public'' auf ''private'' und fügen eine Konstruktormethode ("einen **Konstruktor**") hinzu, um den Wert des Attributs ''seitenzahl'' zu setzen. \\ \\ Den Konstruktor erkennt der Kompiler daran, dass er exakt denselben Bezeichner trägt wie die Klasse und dass davor kein Rückgabetyp steht (auch nicht ''void''). Er wird immer dann aufgerufen, wenn ein neues Objekt erzeugt wird, z.B. durch ''new Würfel(6)''.
===== Beispiel 2: Ratespiel ===== Wir schreiben eine Klasse ''Ratespiel'', die eine geheime Zufallszahl ermittelt und speichert. Sie soll eine Methode ''raten(int tipp)'' besitzen, die die übergebene Zahl ''tipp'' mit der geheimen Zahl vergleicht und ausgibt "zu klein", "zu groß" oder "erraten". Zudem besitzt sie eine Methode ''istBeendet()'', die genau dann ''true'' zurückliefert, wenn die Zahl schon erraten wurde.
[[.ratespielloesung:start|Hier geht's zur Lösung!]] ===== Aufgabe: Weihnachtsbaum ===== {{ :wiederholung:pasted:20221128-081823.png}} Erstelle eine Klasse Weihnachtsbaum, die einen Baum wie rechts gezeigt mit ASCII-Art auf den Bildschirm zeichnet. Der Methodenaufruf zum Zeichnen soll so aussehen: Baum b = new Baum(3, 5, 4); // Stammbreite, Stammhöhe, Höhe der Baumkrone b.zeichne(); [[.baum:loesung|Hier geht's zur Lösung.]]
===== Beispiel 3: Fliegende Rechtecke ===== {{ :wiederholung:pasted:20230611-155635.png}} Wir schreiben unser erstes eigenes [[https://en.wikipedia.org/wiki/Particle_system| particle system]]: Die Partikel sind kleine Rechtecke (30 x 50 Pixel groß), die von der Mitte der unteren Zeichenflächenkante aus mit einer zufälligen Anfangsgeschwindigkeit nach oben geschleudert werden. Ihre Geschwindigkeit soll je Zeiteinheit um 0.1 zunehmen, so dass es aussieht, als würden sie durch eine Gravitationskraft nach unten beschleunigt. \\ Sobald ein Rechteck unterhalb der unteren Zeichenflächenkante verschwindet, soll es vernichtet und ein neues erzeugt werden.
**Aufgaben:** \\ * Jedes Rechteck soll eine zufällige Farbe (Tipp: ''Color.getRandomColor()'') und eine zufällige Durchsichtigkeit (Tipp: Methode ''setAlpha'') bekommen. * Jedes Rechteck soll eine zufällige Winkelgeschwindigkeit haben, mit der es sich fortwährend dreht (Tipp: Methode ''rotate''). [[.particleloesung:start|Hier geht's zur Lösung!]] ===== Projekt: Einfaches Weltraumspiel (Variante Jgst. 9) =====
**Aufgaben:** \\ * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite! * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden. * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden. ===== Projekt: Einfaches Weltraumspiel (Variante Jgst. 10) =====
**Aufgaben:** \\ * Die Bullets sind bisher nur einfache Kreise. Schöner wäre ein geeignetes Sprite! * Trifft ein Bullet ein Target, so soll auch das Bullet vernichtet werden. * Ersetze die Explosion der Targets durch ein Particle System (z.B. umherfliegende Dreiecke). Trifft ein Particle das Raumschiff, soll es zerstört werden. * Das Raumschiff soll drei Leben haben. Schön wäre eine Lebensanzeige rechts unten, die aus drei kleinen Raumschiffen besteht... * Es soll verschiedene Gegner geben, die sich verschieden verhalten! * Es soll Powerups geben, die man aufsammeln kann. Sie bewirken, dass das Raumschiff bessere Fähigkeiten bekommt (verschiedene Kanonen, Schild, ...)