Den Highscore und andere Sachen wegspeichern

Den Highscore und andere Sachen wegspeichern Titelbild

Folgende Teile braucht ihr für die Anleitung

Spiele Programmieren mit der LED Matrix Produktbild

Spiele Programmieren mit der LED Matrix | 19.95€

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 (englisch: etwas ins Regal stellen). Mit diesem können wir mithilfe 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. Wir haben ein kleines Beispiel an einer Highscore Liste vorbereitet:

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. Das kannst du beliebig wiederholen und du solltest dann auch deine vorherigen Angaben in dieser Liste finden.

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-22 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ückgeben.

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. Dieser 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 Variabel 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. Das Konstrukt ist sehr ähnlich zu dem in Zeile 6. 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, dieser kann aber für string benutzt werden.

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 . Da es sich dabei um den ersten Eintrag handelt, können wir sicher davon ausgehen, dass es sich dabei um das erste Element handelt.

Damit wir nachvollziehen können was passiert, wird die Variable score und die Variable ranking vorher noch ausgegeben. Diese beiden Zeilen können im produktiven Einsatz auch wieder entfernt werden.

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 über die Eingabe über das Terminal gespeichert. Diese wird in Zeile 24 an die Update Funktion übergeben.

Und schon haben wir unser erstes Programm mit shelve fertig geschrieben. Wir haben damit endlich eine neue Möglichkeit, Daten langfristig wegzuspeichern und zu analysieren.

In Snake einbauen

Ein Highscore ohne Anwendungsfall ist ein wenig langweilig. Wir können es aber in Spiele wie Snake einbauen. Damit kann der Spieler dann auch gleich sehen, wie gut er gespielt hat. 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 59 + 60 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 Stand zu speichern.

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!