Aus Das deutschsprachige Scratch-Wiki

Beim Daten speichern werden eine Variable oder eine Liste in einem Scratch Projekt dazu genutzt, Informationen aus dem Projekt zu sichern, um sie zu einem späteren Zeitpunkt wieder verwenden zu können.

Solche Daten können zum Beispiel Spielstände oder Einstellungen sein, welche man gerne später noch einmal verwenden oder mit anderen teilen möchte.

Daten in Listen speichern

Schon seit Scratch 1.3 können Daten in Listen gespeichert und von dort in der Bearbeiten-Ansicht mit Rechtsklick auch in einer Textdatei auf dem eigenen Rechner gespeichert werden.

Vorteile

Die Möglichkeit, Spielstände und andere Daten zu speichern und zu laden kann aus vielen Gründen nützlich sein:

  • Ein Spiel kann unterbrochen und später an derselben Stelle fortgesetzt werden.
  • Jeder kann eigene Spiel-Elemente (z.B. Karten) erstellen und in das Spiel einbauen.
  • Entwickler können ihre Projekte leichter anpassen und erweitern.
  • Spieler können Spiel-Vorgaben einfacher nach ihren Wünschen anpassen

Nachteile

Obwohl die Speicher- und Lade-Funktion sehr nützlich ist, kann sie auch Probleme verursachen:

  • Falls die Skripte nicht gut geschrieben sind, kann das Laden von Daten zu unerwarteten Ergebnissen und zu Programmfehlern führen.
  • Spieler können die gespeicherten Daten verändern und Spiele auf diese Art "hacken".
  • Spieler können Spiele auf eine Art verändern, die vom Entwickler nicht gewünscht ist.
  • Unerfahrene Spieler könnten die Speicher-Funktion nicht verstehen und das Projekt deshalb zu kompliziert finden.

Probleme vermeiden

Einige der oben genannten Nachteile können durch gute Vorbereitung vermieden werden:

  • Teste die Lade- und Speicherfunktion oft und gründlich, und stelle sicher, dass sie in jeder Situation des Spiels funktioniert.
  • Lasse dein Skript vor dem Laden prüfen, ob die Daten in Ordnung sind, also zum Beispiel die richtige Länge haben und an den richtigen Stellen Zahlen stehen.
  • Erkläre den Nutzern ausführlich, wie das Laden und Speichern in deinem Projekt funktioniert, und was sie tun müssen.
  • Lade und speichere deine Daten "verschlüsselt", um das Hacken zu erschweren, außerdem kannst Du eingegebene Codes auf ihre Gültigkeit untersuchen und ungültige Codes ignorieren, so dass ein eventueller Hacker den Aufbau des Codes genau verstanden haben muss.

Anleitung

Mit den folgenden Skripten kannst du auf einfache Art Werte in Listen speichern und wieder laden.

Sämtliche Daten werden in einer einzigen Textvariablen gespeichert, welche später wieder ins Projekt geladen werden werden kann.

Zunächst brauchst du eine Liste für die zu speichernden Werte. Im folgenden Beispiel heißt sie „Speicherdaten“. Danach kannst du mit einem eigenem Block deine Daten in diese Liste schreiben:

Definiere speichere (Wert)
füge (verbinde (Wert) [;]) zu [Speicherdaten v] hinzu

Jetzt kannst du mit einem Skript beliebige Werte zur Speicherdaten-Liste hinzufügen:

speichere (x-Position) :: custom
speichere (Leben) :: custom
speichere (Gold) :: custom

Als nächstes gibst du den Speichercode an den Nutzer weiter. Dazu legst du zunächst eine Variable namens „Code“ an. Wenn der Spieler dann zum Beispiel die „s“-Taste drückt, schreibst du alle Werte der Speicherdaten-Liste in die Code-Variable, ersetzt die gesamte Liste durch den Code und zeigst sie dem Nutzer, damit er den Wert kopieren kann. Das gesamte Speicher-Skript kann dann zum Beispiel so aussehen:

Wenn Taste [s v] gedrückt
lösche (alles v) aus [Speicherdaten v]
speichere (x-Position) :: custom
speichere (Leben) :: custom
speichere (Gold) :: custom
setze [Code v] auf [] //Die Code-Variable muss am Anfang komplett leer sein 
wiederhole bis <(Länge von [Speicherdaten v]) = [0]>
setze [code v] auf (verbinde (code) (Element (1 v) von [Speicherdaten v]))
lösche (1 v) aus [Speicherdaten v]
end
füge (code) zu [Speicherdaten v] hinzu
zeige Liste [Speicherdaten v]

Der Nutzer kann den Code dann kopieren oder die Liste exportieren und auf seinem Rechner speichern.

Jetzt muss der Nutzer die Daten nur noch wieder laden können. Lege eine Variable „Zeichen-Zähler“ an, eine Variable "Aktueller Wert", und dazu den folgenden Block:

Definiere lade (Daten)
lösche (alles v) aus [Speicherdaten v]
setze [Zeichen-Zähler v] auf [1]
wiederhole bis <(Zeichen-Zähler) > (Länge von (Daten))>
setze [Aktueller Wert v] auf [] //Stelle sicher, dass der Wert zunächst leer ist
wiederhole bis <(Zeichen (Zeichen-Zähler) von (Daten)) = [;]>
setze [Aktueller Wert v] auf (verbinde (Aktueller Wert) (Zeichen (Zeichen-Zähler) von (Daten)))
ändere [Zeichen-Zähler v] um (1)
end
füge (Aktueller Wert) zu [Speicherdaten v] hinzu
ändere [Zeichen-Zähler v] um (1)
end

Jetzt kannst du die gespeicherten Daten in derselben Reihenfolge auch wieder laden. Zuerst fragst du den Nutzer nach seinem Speichercode, dann lädst du die Daten, und dann speicherst du sie wieder in den ursprünglichen Variablen, also zum Beispiel als x-Position, als Leben und als Gold. Das Skript dafür kann zum Beispiel so aussehen:

Wenn Taste [l v] gedrückt
frage [Speichercode?] und warte
lade (Antwort) :: custom
setze x auf (Element (1 v) von [Speicherdaten v])
setze [Leben v] auf (Element (2 v) von [Speicherdaten v])
setze [Gold v] auf (Element (3 v) von [Speicherdaten v])



Code zum Einbinden ins Forum:
[wiki=de:Daten speichern]Daten speichern[/wiki]