Der Highscore
Stell dir vor, du hast die perfekte Runde Snake gespielt. Oder du willst einfach mal Daten speichern, dein Programm schließen und deine Daten noch haben. Mit unseren normalen Variablen und Listen ist das schlicht weg nicht möglich, denn der Computer vergisst den gesamten Inhalt der Variablen. Aber natürlich gibt es dafür in Python3 das Shelve-Modul. Mit diesem können wir mit Hilfe einer .txt-Datei persistente Daten abspeichern. Heißt, wir können sie speichern, das Programm schließen und wenn wir sie dann wieder aufrufen, sind sie wieder da.
highscore.py
import shelve
regal = shelve.open('score.txt')
def updateScore(neuerScore):
if('score' in regal):
score = regal['score']
if(neuerScore not in score):
score.insert(0, neuerScore)
score.sort()
ranking = score.index(neuerScore)
ranking = len(score)-ranking
else:
score = [neuerScore]
ranking = 1
print(score)
print(ranking)
regal['score'] = score
return ranking
neuerScore = int(input("Neuer HighScore: \n"))
updateScore(neuerScore)
Wenn du das Programm zum ersten Mal öffnest, kannst du einen neuen Highscore in das Terminal eingeben und du erhältst zuerst die gesamte Highscore-Liste und dann das Ranking des neuen Eintrags.
Schritt für Schritt
In Zeile 1 importieren wir die benötigte shelve
Bibliothek. In Zeile 3 rufen wir diese auf und geben mit .open('score.txt')
auch an, in welcher Datei alles gespeichert werden soll. Wir haben uns in diesem Fall für die score.txt
entschieden. Diese wird automatisch von der Bibliothek erstellt. Wenn du die Datei löschst, löschst du damit auch die Highscore-Liste.
In Zeile 5-21 erstellen wir unsere eigene Funktion mit dem Namen updateScore()
. Mit dieser werden wir die Score-Daten verändern. Als Parameter wird der neue Score übergeben und das Ranking des neuen Scores wird zurückgegeben.
In der Funktion prüfen wir zuerst in Zeile 6, ob es die Liste score
schon in der Datei gibt. Dafür benutzen wir 'score' in regal
. Das sagt frei übersetzt Folgendes aus: wenn es eine Variable mit dem Namen x in y gibt, dann gib ‚Wahr‘ aus. Das genaue Gegenteil ist: ’not in‘ also nicht in. Das brauchen wir, denn wenn wir etwas zum ersten Mal wegspeichern, müssen wir nicht erst darauf achten, welche Werte schon gespeichert werden. Zuerst speichern wir alles aus der shelve
in die Variable score
. Das tun wir, damit wir besser mit den Daten arbeiten können. In Zeile 8 prüfen wir dann, ob es schon einen Highscore mit dieser Punktzahl gibt. Wenn das nicht der Fall ist, wird der neuerScore
zu der Liste hinzugefügt. Jetzt müssen wir noch das Ranking herausfinden. Dafür wird die Liste score
mit der Funktion .sort()
der Reihe nach sortiert. Mit der Funktion .index()
können wir herausfinden, wo sich ein bestimmtes Element innerhalb einer Liste befindet. Damit dieser Wert auch wirklich dem Ranking entspricht, rechnen wir dieses in Zeile 13 gegen die Länge der Liste. len()
gibt die Länge einer Liste zurück.
In Zeile 15 und 16 wird der Fall behandelt, wenn es noch keinen gespeicherten score
gibt. Dann erstellen wir einfach nur die Liste score
und speichern darin den Parameter newScore
.
Damit wir nachvollziehen können, was passiert, wird die Variable score
und die Variable ranking
vorher noch ausgegeben.
In Zeile 20 erfolgt jetzt wieder das Speichern. Dazu müssen wir einfach nur die Variable regal['score']
den neuen Inhalt von score
speichern lassen. In Zeile 21 wird dann noch das ranking
ausgegeben.
In Zeile 23 wird zuerst die Variable neuerScore
durch die Eingabe über das Terminal gespeichert. Diese wird in Zeile 24 an die Update-Funktion übergeben.
In Snake einbauen
Ein Highscore ohne Anwendungsfall ist ein wenig langweilig. Wir können es aber in Spiele wie Snake einbauen. Dafür musst du zuerst in der highscore.py die Zeilen 18, 19, 23 und 24 entfernen.
In snake.py musst du erstmal in Zeile 5 die Datei und die Funktion importieren:
from highscore import updateScore
In Zeile 60 und 61 kommen folgende Zeilen hinzu:
ranking = updateScore(punkte)
matrix.show_message(str(ranking))
Du kannst beide auch einfach herunterladen mit: wget cw42.de/p/snake.py
Natürlich kannst du das gleiche System auch benutzen, um bei anderen Spielen den Punktestand zu speichern.