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.