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: | 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: | 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:
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.
[wiki=de:Globale Höchstpunktzahlen]Globale Höchstpunktzahlen[/wiki]