Wie implementiere ich ein Karten-Undo für einen Spielzug?

Melden
  1. Grundidee eines Undo-Mechanismus
  2. Speichern des Spielzustands vor einem Zug
  3. Wie kann ein Zustand gespeichert werden?
  4. Speicherung mehrerer Spielzüge
  5. Beispielhafte Implementierung in JavaScript
  6. Wichtige Hinweise zur Umsetzung
  7. Fazit

Grundidee eines Undo-Mechanismus

Ein Undo ermöglicht es, den letzten Spielzug rückgängig zu machen. Bei einem Kartenspiel bedeutet das, dass die Karten wieder in den Zustand vor dem letzten Zug zurückversetzt werden. Um dies zu realisieren, muss man vorher den Zustand des Spiels speichern, bevor der Zug ausgeführt wird. So kann man bei Bedarf den vorherigen Zustand wiederherstellen.

Speichern des Spielzustands vor einem Zug

Vor jedem Spielzug wird der aktuelle Zustand aller relevanten Komponenten gespeichert. Dazu gehört zum Beispiel die Hand der Spieler, die Karten auf dem Tisch, der Ablagestapel sowie eventuelle Zähler für Punkte oder Runden. Dieses Speichern kann durch eine Kopie der Datenobjekte erfolgen. Wichtig ist, dass tiefere Datenstrukturen (z.B. Arrays von Karten) nicht nur oberflächlich kopiert, sondern vollständig dupliziert werden, um Modifikationen am aktuellen Zustand nicht rückwirkend auf den gespeicherten Zustand zu übertragen.

Wie kann ein Zustand gespeichert werden?

Ein einfacher und oft genutzter Weg ist, den Zustand als JSON zu serialisieren und zu speichern oder mit Techniken wie structuredClone eine tiefe Kopie zu erstellen. Alternativ können eigene Funktionen zum Klonen der Objekte geschrieben werden, wenn diese Methoden nicht verfügbar sind oder wenn eine spezifischere Behandlung nötig ist.

Speicherung mehrerer Spielzüge

Wenn mehrere Undo-Schritte möglich sein sollen, werden die gespeicherten Zustände in einem Stack (Stapel) abgespeichert. Jeder gespeicherte Zustand wird einfach oben auf den Stapel gelegt, bevor ein neuer Zug ausgeführt wird. Beim Undo wird der oberste Zustand vom Stapel genommen und der Spielzustand auf diesen Wert zurückgesetzt.

Beispielhafte Implementierung in JavaScript

// Beispiel für einen Spielzustandlet currentState = { playerHands: , ], tableCards: , discardPile: , currentPlayer: 0};// Stack zum Speichern der Zuständelet undoStack = ;// Funktion zum tiefen Kopieren des Zustandsfunction cloneState(state) { return JSON.parse(JSON.stringify(state));}// Vor einem Spielzug Zustand speichernfunction saveState() { undoStack.push(cloneState(currentState));}// Beispiel für einen Spielzugfunction playCard(playerIndex, card) { saveState(); // Zustand sichern bevor wir den Zug ausführen // Karte aus der Hand entfernen const hand = currentState.playerHands ; const cardIndex = hand.indexOf(card); if (cardIndex === -1) { console.log(Karte nicht in der Hand); return; } hand.splice(cardIndex, 1); // Karte auf den Tisch legen currentState.tableCards.push(card); // Nächster Spieler ist an der Reihe currentState.currentPlayer = (playerIndex + 1) % currentState.playerHands.length;}// Undo durchführenfunction undo() { if (undoStack.length === 0) { console.log(Kein Spielzug zum Zurücknehmen vorhanden.); return; } currentState = undoStack.pop();}// Beispielablaufconsole.log(Vor dem Spielzug:, currentState);playCard(0, Herz 7);console.log(Nach dem Spielzug:, currentState);undo();console.log(Nach Undo:, currentState);

Wichtige Hinweise zur Umsetzung

Das hier gezeigte Beispiel ist stark vereinfacht. Ein reales Kartenspiel hat oft noch weitere Daten wie Punkte, Spezialeffekte, Animationszustände usw., die ebenfalls mitgesichert und wiederhergestellt werden müssen. Außerdem sollte man beachten, dass das Speichern und Klonen großer Zustände Performance kosten kann. In komplexeren Anwendungen kann ein differenzierter Ansatz (z.B. Zustand nur in Teilbereichen speichern oder Kommandos anstatt kompletter Zustände) sinnvoller sein.

Fazit

Ein Karten-Undo lässt sich durch das Zwischenspeichern des kompletten Spielzustands vor jedem Zug implementieren. Beim Undo wird einfach der vorherige Zustand wiederhergestellt. Dabei ist das tiefe Kopieren des Zustands ein zentraler Punkt, um spätere Änderungen nicht mit dem gespeicherten Zustand zu vermischen. Dieses Prinzip lässt sich mit einfachen Datenstrukturen oder auch mit Frameworks und State-Management-Lösungen umsetzen.

0

Kommentare