Aus Das deutschsprachige Scratch-Wiki

(☁ Variable) Dieser Artikel oder diese Sektion benutzt Cloud Daten. Benutzer, die noch den Neuer Scratcher Status haben oder den Offline-Editor, benutzen, können keine Projekte mit Cloud Daten erstellen oder sie in Projekten anderer Benutzer verwenden. Um Cloud-Daten zu verwenden, ist es erforderlich, den Online-Editor mit Status Scratcher zu benutzen.

In diesem Artikel geht es um globale Höchstpunktzahlen, wobei der Schwerpunkt auf der Kodierung und Dekodierung liegt. Für die reine Kodierung und Dekodierung siehe hier.

Mit der neuen Cloud-Variablen-Funktion in Scratch 2.0 können globale Highscore-Listen innerhalb eines Projekts erstellt werden. Diese Highscore-Listen, die in einer Cloud-Variablen gespeichert sind, können innerhalb von Sekunden aktualisiert werden. In diesem Tutorial wird erklärt, wie man eine voll funktionsfähige globale Highscore-Liste programmiert, damit die Daten der Benutzer für ein bestimmtes Projekt gespeichert werden können.

Information icon.png Information: Obwohl der Schwerpunkt hier auf Punktzahlen liegt, können diese Informationen auch für alle vom Benutzer gespeicherten Daten relevant sein.


Einfacher Highscore

Für eine einfache Methode, die die höchste Punktzahl anzeigt, werden zwei Variablen verwendet:

  • (Punktzahl)
  • (☁ Höchstpunktzahl)

Das folgende Skript wird verwendet:

Wenn die grüne Flagge angeklickt
wiederhole fortlaufend 
  falls <(Punktzahl) > (☁ Höchstpunktzahl)> , dann 
    setze [☁ Höchstpunktzahl v] auf (Punktzahl)
  end
end


Information icon.png Information: Dieses Skript zeigt nur die höchste Punktzahl an, nicht aber den Benutzernamen der Person, die sie erreicht hat.


Automatisches Zurücksetzen der Punktezahl

Wenn man möchte, dass der globale High Score eines Spiels nach einem bestimmten Zeitraum automatisch zurückgesetzt wird, damit jeder eine Chance hat, kann man ein Skript wie dieses verwenden:


Wenn die grüne Flagge angeklickt
verstecke Variable [☁ Zurücksetzung v]
wiederhole fortlaufend 
  falls <([abrunden v] von (Tage seit 2000)) > (☁ Zurücksetzung)> , dann 
    setze [☁ Zurücksetzung v] auf (([abrunden v] von (Tage seit 2000)) + [Zeitraum in Tagen, nach dem zurückgesetzt wird])
    setze [☁ Höchstpunktzahl v] auf [0]
  end
end

Bestenliste

Da Cloud-Listen abgelehnt werden, kann die Programmierung dieser Funktion recht schwierig sein. Die Daten der Benutzer müssen in Cloud-Variablen gespeichert werden, wobei es eine Einschränkung gibt: Es können nur Zahlen gespeichert werden. Das Scratch-Team lässt derzeit aus Sicherheitsgründen keine Buchstaben in Cloud-Variablen zu. Daher werden Skripte benötigt, um die Daten in Zahlenfolgen zu kodieren und zu dekodieren. Dieses Tutorial erfordert die Verwendung von:

  • Drei Listen
    • Buchstaben::list reporter
    • Benutzer::list reporter
    • Punktzahl::list reporter
  • Neun Variablen
    • (Punktzahl)
    • (Buchstabe#)
    • (Buchstaben erkennung)
    • (Listen Eintrag)
    • (index)
    • (☁ Bestenliste)
    • (v1)
    • Element::variables reporter
    • Charaktäre::variables reporter

Kodierung

Die Kodierung ist der Prozess, bei dem die Nutzer und ihre Daten in eine Zahlenfolge in der Cloud-Variablen "☁ Bestenliste" formatiert werden. Betrachten wir zunächst die folgenden Listen:

Data Compare.png

Die Daten jedes Nutzers sind mit seiner Punktzahl verknüpft. Die numerische Platzierung der Punkte kann durch Skripte außerhalb der Kodierung und Dekodierung erreicht werden. Mithilfe dieser Datenverknüpfung kann der Cloud-Variablen-Codierer jeden Benutzernamen und jeden Punktestand im Zahlenformat einzeln zur "☁ Bestenliste" hinzufügen.

Während des Kodierungsvorgangs wird jedes Zeichen oder jede Zahl in einem Listenelement durch eine zweistellige Zahl dargestellt. Zum Beispiel wäre "a" die Ziffer "01" und "b" die Ziffer "02". Die Liste "Zeichen" speichert bis zu 99 zu kodierende Zeichen. Wenn es 100 oder mehr Zeichen gäbe, die vom globalen Highscore-System gelesen werden können, müsste jedes Zeichen durch einen dreistelligen Wert dargestellt werden. Die Reihenfolge der Zeichen in dieser Liste spielt keine Rolle; sie müssen nur während des gesamten Kodierungsprozesses konsistent sein. Die Liste kann auch so erstellt werden:

lösche alles aus [Buchstaben v]
setze [Zeichen v] auf [� !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0123456789]
setze [Element v] auf (1)
wiederhole (Länge von (Zeichen)) mal 
  füge (Zeichen (Element) von (Zeichen)) zu [Buchstaben v] hinzu
  ändere [Element v] um [1]
end

Jedes Listenelement (d. h. ein Benutzer und seine Punktzahl) wird durch "00" getrennt, da die Liste Buchstaben mit 01 anfängt.

Nachdem die Liste mit den verfügbaren Computerzeichen ausgefüllt ist, kann das Skript für die Kodierung der Cloud-Variable erstellt werden.

Definiere Kodiere Element (text) // Ohne Bildschirmaktualisierung
  setze [Buchstaben# v] auf [1]
  wiederhole (Länge von (text)) mal
    setze [Buchstabe Code v] auf (Nummer von (Zeichen (Buchstaben#) von (text)) in [Zeichen v])
    falls <(Buchstabe Code) < [10]> , dann // Nummer wird zweistellig hinzugefügt
      setze [v1 v] auf (verbinde (v1) und (verbinde [0] und (Buchstaben Erkennung)))
    sonst
      setze [v1 v] auf (verbinde (v1) und (Buchstabe Code))
    end
    ändere [Buchstaben# v] um (1)
  end
  setze [v1 v] auf (verbinde (v1) und [00]) // Trennzeichen


Definiere Kodiere // Ohne Bildschirmaktualisierung
setze [Listen Eintrag v] auf [1]
setze [v1 v] auf []
wiederhole (Länge von [Benutzer v]) mal 
  Kodiere Element (Element (Listen Eintrag) von [Benutzer v])
  Kodiere Element (Element (Listen Eintrag) von [Punktzahl v])
  ändere [Listen Eintrag v] um (1)
end
setze [☁ Bestenliste v] auf (v1)

Dekodieren

Die Dekodierung ist der Prozess, bei dem die numerisch kodierten Daten dekodiert, d. h. aus dem Zahlenformat herausgenommen und wieder in den beiden Listen zusammengestellt werden. Bei der Dekodierung wird geprüft, ob zwischen den Listenelementen während der Kodierung eine "00" steht, um festzustellen, wann zum nächsten Listenelement übergegangen werden soll. Nach Abschluss des Prozesses sind die Listen so angeordnet, wie sie vor der Kodierung waren.

Hinweis: Mit Scratch 3.0 wurde eine Cloud-Aktualisierung im 1/10-Sekunden-Takt eingeführt.


Definiere Dekodiere Element // Ohne Bildschirmaktualisierung
  setze [v1 v] auf []
  wiederhole bis <(verbinde (Zeichen (Buchstabe#) von (☁ Bestenliste)) und (Zeichen ((Buchstabe#) + (1)) von (☁ Bestenliste))) = [00]> 
    setze [Buchstabe Code v] auf (verbinde (Zeichen (Buchstabe#) von (☁ Bestenliste)) und (Zeichen ((Buchstabe#) + (1)) von (☁ Bestenliste)))
    setze [v1 v] auf (verbinde (v1) und (Element (Buchstabe Code) von [Buchstaben v]))
    ändere [Buchstabe# v] um (2)
  end
  ändere [Buchstabe# v] um (2)


Definiere Dekodiere // Ohne Bildschirmaktualisierung
setze [Buchstabe# v] auf [1]
lösche alles aus [Benutzer v]
lösche alles aus [Punktzahl v]
wiederhole bis <(Buchstabe#) > (Länge von (☁ Bestenliste))>
  Dekodiere Element
  füge (v1) zu [Benutzer v] hinzu
  Dekodiere Element
  füge (v1) zu [Punktzahl v] hinzu
end

Hinzufügen und Ersetzen von Punktzahlen

Beim Hinzufügen und Ersetzen der Punktzahlen in den Listen wird eine Variable benötigt, um die Liste bis zur richtigen numerischen Platzierung zu durchlaufen. Um den aktuellen Highscore eines Benutzers durch einen neuen zu ersetzen, muss zunächst der aktuelle Highscore gelöscht werden. Dann kann der neue Highscore zur Liste hinzugefügt werden, indem die Liste mit einer Variablen so lange abwärts iteriert wird, bis der Highscore größer ist als der zu analysierende. Dadurch bleibt die Liste immer absteigend sortiert. Das folgende Skript führt diese Funktion aus:


Definiere Aktualisiere Bestenliste (Punkte) // Ohne Bildschirmaktualisierung
Dekodiere :: custom // Lädt die Liste aus der Cloud-Variable
setze [index v] auf (Nummer von (Benutzername) in [Benutzer v]) // Wenn der Benutzer nicht in der Liste enthalten ist, ist index 0 und es wird nichts gelöscht
falls <(Punkte) < (Element (index) von [Punktzahl v])>, dann
  stoppe [dieses Skript v] // Die neue Punktzahl ist kleiner als die bereits eingetragene
end
lösche (index) aus [Benutzer v]
lösche (index) aus [Punktzahl v]
setze [index v] auf [1] // Die Punktzahl wird an der richtigen Stelle eingefügt, sodass die Liste absteigend sortiert ist
wiederhole bis <<(index) > (Länge von [Punktzahl v])> oder <(Punkte) > (Element (index) von [Punktzahl v])>>
  ändere [index v] um (1)
end
füge (Benutzername) bei (index) in [Benutzer v] ein
füge (Punkte) bei (index) in [Punktzahl v] ein
Kodiere :: custom // Die Liste wird wieder gespeichert

Dann verwendet man folgendes:


Wenn die grüne Flagge angeklickt
setze [Meine Punkte v] auf (0)
wiederhole fortlaufend
  setze [Mein Highscore v] auf (Meine Punkte)
  warte bis <(Meine Punkte) > (Mein Highscore)>
  Aktualisiere Bestenliste (Meine Punkte) :: custom
end

Vermeidung von Störungen

Beim Kodieren (Speichern) der in den Listen gespeicherten Daten kann die Aktualisierung der Cloud-Variablen bei schlechter Internetverbindung etwas dauern. Wenn mehrere Personen gleichzeitig kodieren, kann es zu Störungen kommen, die dazu führen, dass die Daten überschrieben werden. Außerdem können gestörte Daten im Kodierer manchmal eine Endlosschleife im Dekodierer verursachen, was jedoch durch Skripte verhindert werden kann. Diese Probleme treten vor allem bei einem sehr populären Projekt mit einer großen Menge an zu kodierenden Daten auf. Ein Skript, das dies verhindert, kann erstellt werden, braucht aber Zeit, wenn es eine geringe Fehlertoleranz haben soll. Erstelle einen benutzerdefinierten Block mit dem Namen "Warten und kodieren" und eine weitere Cloud-Variable: (☁ Warteschlange)


Definiere warte und kodiere
wiederhole bis <(☁ Warteschlange) = (0)> 
  warte bis <(☁ Warteschlange) = [0]>
  warte (Zufallszahl von (1.) bis (5)) Sekunden
end
setze [☁ Warteschlange v] auf (1)
Kodiere :: custom
warte (0.1) Sekunden // Die Cloud-Variable braucht etwas Zeit zum Aktualisieren
setze [☁ Warteschlange v] auf (0)

Je höher die zweite Grenze der zufälligen Wartezeit ist, desto geringer ist der Fehlerbereich. Es können zwar immer noch zwei Benutzer gleichzeitig versuchen zu kodieren, aber die Wahrscheinlichkeit ist geringer.


Code zum Einbinden ins Forum:
[wiki=de:Globale Höchstpunktzahlen]Globale Höchstpunktzahlen[/wiki]
Cookies helfen uns bei der Bereitstellung von Das deutschsprachige Scratch-Wiki. Durch die Nutzung von Das deutschsprachige Scratch-Wiki erklärst du dich damit einverstanden, dass wir Cookies speichern.