Methoden im Spiel
Im Kapitel Methoden und Modularisierung hast du gelernt, Anweisungen unter einem Namen zusammenzufassen. Dein Konstruktor ist inzwischen vermutlich lang geworden. Viermal dieselben Zeilen für einen Stein, dreimal fast dieselben für einen Baum. Wer darin etwas sucht, muss lange suchen.
Die Leitfragen für dein Spiel:
- Welche Zeilen schreibst du immer wieder, nur mit anderen Zahlen? Daraus wird eine Methode mit Parametern.
- Welche Frage stellt dein Spiel immer wieder? Daraus wird eine Methode mit Rückgabewert.
Die MVPs sind kleine, eigenständig lauffähige Beispiele. Starte ein Beispiel mit ▶ und klicke für die Tastensteuerung in seine Ausgabe. Im Reiter Beispiel.java steht die jeweilige Idee. Falls ein Reiter Baukasten.java dabei ist, enthält er vorbereitete Hilfen für Figuren, Texte und Steuerung. Probiere zuerst die angegebene Änderung aus und übertrage dann die Idee in deine Werkstatt.
Mechaniken
Hier geht es weniger um neue Dinge im Spiel als um besseren Code. Am Ende soll dein Spiel genauso funktionieren wie vorher, aber du sollst es lesen können. Such dir mindestens zwei Ideen aus.
Bausteine für die Landschaft
Im Spiel: nichts Neues, aber jeder Stein und jede Pflanze ist nur noch eine Zeile.
Dahinter steckt: eine Methode mit Parametern für alles, was sich unterscheidet.
/// Setzt einen Stein an die Stelle (pX, pY).
private void setzeStein(double pX, double pY) {
Hindernis stein = new Hindernis();
stein.addCostume("stein", "assets/backgrounds/tilesets/tileset-dungeon.png", 128, 48, 16, 16);
stein.setPosition(pX, pY);
this.add(stein);
}
this.setzeStein(-360, 192);
this.setzePflanze(32, 0, 140, -40); // eine Tanne
Aufwand: ★☆☆
MVP zum Ausprobieren: Ändere das Kostüm in setzeStein. Beide Steine ändern sich.
In dein Spiel übertragen: Bündele den Bau eines Objekts in einer Methode mit Koordinaten als Parametern.
Mauern mit beliebiger Länge
Im Spiel: Mauern, Zäune und Hecken in jeder Länge, waagerecht oder senkrecht.
Dahinter steckt: eine Methode mit Schleife, setzeMauer(double pX, double pY, int pAnzahl). Mit Überladen gibt es eine zweite Methode desselben Namens mit einem weiteren Parameter für die Richtung.
Aufwand: ★★☆
MVP zum Ausprobieren: Ändere die Anzahl und den letzten Parameter des zweiten Aufrufs.
In dein Spiel übertragen: Nutze eine überladene Methode für die Standardrichtung und eine mit Richtungsparameter.
Der Konstruktor als Inhaltsverzeichnis
Im Spiel: wieder nichts Neues. Aber wer deinen Code öffnet, versteht sofort, wie die Welt entsteht.
Dahinter steckt: Modularisierung. Der Konstruktor ruft nur noch Methoden auf, und jede erledigt eine Teilaufgabe.
public Welt() {
this.baueRahmen();
this.pflanzeWald();
this.verteileMuenzen();
this.bereiteAnzeigeVor();
this.stelleHeldAuf();
}
Aufwand: ★★☆
MVP zum Ausprobieren: Öffne die aufgerufenen Methoden und ergänze eine Methode verteileSchatz.
In dein Spiel übertragen: Gib den Abschnitten deines Weltaufbaus eigene sprechende Methodennamen.
Fragen mit Rückgabewert
Im Spiel: Die Bedingungen in run() lesen sich wie Sätze.
Dahinter steckt: Methoden, die einen Wahrheitswert liefern, wie istGerade im Lernpfad.
private boolean istGewonnen() {
return punkte == anzahlMuenzen;
}
if (this.istGewonnen()) {
Aufwand: ★☆☆
MVP zum Ausprobieren: Drücke dreimal Leertaste. Ändere danach die Gewinnbedingung in istGewonnen.
In dein Spiel übertragen: Formuliere wiederkehrende Bedingungen als boolean-Methoden.
Eine Uhr mit Minuten
Im Spiel: Statt „Zeit: 75“ steht „Zeit: 1:15“ in der Anzeige.
Dahinter steckt: eine Methode zeitText(int pSekunden), die einen String liefert. Die Minuten bekommst du mit / 60, die restlichen Sekunden mit % 60. Vorsicht bei „1:5“: Unter zehn Sekunden fehlt eine Null.
Diese Methode kannst du sogar testen, wie im Abschnitt Methoden mit Tests prüfen: Was muss bei 0, bei 59, bei 60 und bei 605 herauskommen?
Aufwand: ★★☆
MVP zum Ausprobieren: Prüfe die Ausgaben für 0, 59, 60, 65 und 605 Sekunden.
In dein Spiel übertragen: Rufe zeitText mit den ganzen Sekunden deiner Spielzeit auf.
Eine Methode fürs Spielende
Im Spiel: Gewinnen, Verlieren und vielleicht weitere Enden laufen alle gleich ab: Das Spiel steht, die Figur bleibt stehen, eine Meldung erscheint.
Dahinter steckt: eine Methode beende(String pMeldung). Statt dreimal dieselben drei Zeilen steht in run() nur noch this.beende("Gewonnen!");.
Aufwand: ★☆☆
MVP zum Ausprobieren: Pfeiltasten bewegen die Figur. G gewinnt, V verliert.
In dein Spiel übertragen: Rufe beende mit passender Meldung aus allen Endbedingungen auf.
Deine eigene Idee
Gehe deinen Code von oben nach unten durch. Wo wiederholt sich etwas? Wo müsstest du einen Kommentar schreiben, damit du verstehst, was passiert? Beides sind Stellen für eine Methode, und der Kommentar wird zu ihrem Namen.
Fürs Tagebuch: Wähle eine deiner Methoden aus. Wie viele Zeilen hat sie dir gespart? Was müsstest du ändern, wenn alle Steine eine andere Farbe bekommen sollen, einmal mit und einmal ohne die Methode?
Checkpoint
Der Checkpoint nach diesem Kapitel kann dasselbe wie der nach den Kontrollstrukturen, ist aber in Methoden zerlegt: baueRahmen, setzeStein, setzePflanze, setzeMuenze, istGewonnen und beende. Wie du ihn lädst, steht auf der Startseite der Werkstatt.
Checkpoint: Methoden (Online-IDE)
Weiterbauen kannst du in deiner Werkstatt.