Informatik

Stapel: Kisten schieben und zurücknehmen

Bisher stehen die Kisten nur im Weg. Jetzt kann der Spieler sie schieben, bis sie an eine Wand oder eine andere Kiste stoßen. Damit entstehen Rätsel: Eine Kiste versperrt den Gang zur Münze, und schiebt man sie falsch, kommt man nicht mehr vorbei.

Deshalb braucht das Spiel eine Taste zum Zurücknehmen. Drückt man sie, wird der letzte Schiebezug rückgängig gemacht, beim nächsten Drücken der davor, und so weiter. Was zuletzt passiert ist, wird zuerst zurückgenommen. Das ist ein Stapel.

So sieht es aus

Starte das Beispiel. Laufe gegen eine Kiste, um sie zu schieben. Mit der Taste Z nimmst du Schiebezüge zurück, einen nach dem anderen.

Was dazugekommen ist

Die Kiste ist keine Wand mehr

Kiste erbt jetzt direkt von Kachel, nicht mehr von Wand. Sonst würde der Spieler an ihr abprallen, statt sie zu schieben. Dafür bekommt sie eine Methode, die sie verschiebt und prüft, ob das erlaubt war:

public boolean schiebe(double pDx, double pDy) {
    this.changePosition(pDx, pDy);
    if (this.getTouchingSprite(Wand.class) != null || this.getTouchingSprite(Kiste.class) != null) {
        this.changePosition(-pDx, -pDy);
        return false;
    }
    return true;
}

Ein Zug ist ein Datensatz

Um einen Schiebezug zurückzunehmen, muss man wissen, wie es vorher aussah: welche Kiste, wo sie stand und wo der Spieler stand. Genau das hält ein Objekt der Klasse Zug fest. Es ist keine Figur, sondern nur ein Datensatz mit Gettern.

Die Welt führt den Stapel

private Stack<Zug> zuege = new Stack<Zug>();
 
public void merke(Zug pZug) {
    zuege.push(pZug);
}
 
public void whenKeyPressed(KeyCode pTaste) {
    if (pTaste == KeyCode.Z && !zuege.isEmpty()) {
        Zug letzter = zuege.top();
        zuege.pop();
        letzter.getKiste().setPosition(letzter.getKisteX(), letzter.getKisteY());
        spieler.setPosition(letzter.getSpielerX(), letzter.getSpielerY());
    }
}

whenKeyPressed wird bei jedem Tastendruck einmal aufgerufen. Anders als isKeyPressed in run() meldet es eine gedrückt gehaltene Taste also nicht 60-mal in der Sekunde.

Der Spieler schiebt

In run() des Spielers steht eine Kiste im Weg, dann wird sie mitgeschoben. Ein neuer Zug wird nur gemerkt, wenn der Spieler im letzten Bild noch nicht geschoben hat. Sonst läge für jedes einzelne Bild ein Zug auf dem Stapel, und Z würde die Kiste jedes Mal nur um 3 Pixel zurücksetzen.

Warum ein Stapel? Zurückgenommen wird immer der jüngste Zug zuerst: LIFO. Nur so passt der Zustand danach zusammen. Würde man einen älteren Zug zuerst zurücknehmen, stünde eine Kiste plötzlich dort, wo inzwischen eine andere steht.

In deinem Spiel

Aufgabe 1: Schiebende Kisten

Übernimm das Schieben in dein Spiel, unten in deiner Werkstatt. Du brauchst die neue Kiste, die Klasse Zug, die geänderte run()-Methode im Spieler und in der Welt den Stapel, merke und whenKeyPressed. Achte darauf, dass spieler in der Welt jetzt ein Attribut ist.

Aufgabe 2: ein Kistenrätsel

Baue einen Raum, in dem man eine Münze nur erreicht, wenn man die Kisten in der richtigen Reihenfolge schiebt. Lass jemanden aus deiner Klasse das Rätsel lösen.

Aufgabe 3: Was der Stapel noch kann

a) Zeige an, wie viele Züge man noch zurücknehmen kann. Der NRW-Stapel hat keine Methode dafür. Wie kommst du trotzdem an die Zahl?

b) Eingesammelte Münzen bleiben eingesammelt, auch wenn man einen Zug zurücknimmt. Warum lässt sich eine Münze nicht einfach wieder auf die Bühne setzen? Was müsste man stattdessen in einem Zug speichern?

Tipp zu Aufgabe 3

a) Zähle selbst mit: eins mehr bei jedem merke, eins weniger bei jedem Zurücknehmen.

b) Eine Figur, die mit remove() von der Bühne genommen wurde, lässt sich nicht wieder hinzufügen. Speichere deshalb, wo die Münze lag, und erzeuge beim Zurücknehmen eine neue Münze an dieser Stelle. Auch die Punkte müssen dann wieder sinken.

Weitere Ideen mit dem Stapel

Überall, wo das Letzte zuerst zurückkommen soll, passt ein Stapel:

Idee Was auf dem Stapel liegt
Rückweg: Die Figur läuft ihre Spur rückwärts ab. die Plätze, an denen sie war
Räume zurück: Eine Taste führt in den Raum, aus dem man gekommen ist, und nochmal in den davor. die besuchten Räume
Ziehstapel: Karten, Zaubersprüche oder Hinweise liegen verdeckt, man zieht immer die oberste. die Karten
Kistenturm: Kisten werden aufeinandergestellt, abheben kann man nur die oberste. die Kisten

Deine Werkstatt

Hier arbeitest du an deinem eigenen Spiel weiter. Es ist derselbe Arbeitsbereich wie auf allen anderen Seiten der Werkstatt.

Stapel: Kisten schieben und zurücknehmen

Teilbare URL erstellen

Abschnitte auswählen