Zum Inhalt springen
BetaEN
Lektion 18 von 35Python

Python · Lektion 18 · 45 Minuten

Projekt: Ratespiel mit Highscore

Das lernst du

  • Ein Spiel mit while-Schleife und break bauen
  • Einen Rekord in einer Datei speichern und wieder laden
  • Eine fehlende Datei mit try/except abfangen

Ein Spiel, das sich erinnert

Bisher vergisst jedes Programm alles, sobald es endet. Ein echtes Spiel merkt sich aber deinen Rekord – auch nach dem Neustart. Dafür speichert es ihn in einer Datei. Hier baust du ein Ratespiel, das genau das kann.

Die Spielschleife mit break

Beim Raten weißt du vorher nicht, wie viele Runden es gibt. Deshalb läuft die Schleife „für immer“ – bis break sie beendet:

geheim = 7
versuche = 0
while True:
    try:
        tipp = int(input("Zahl von 1 bis 10: "))
    except ValueError:
        print("Bitte eine Zahl eintippen.")
        continue
    versuche += 1
    if tipp == geheim:
        wort = "Versuch" if versuche == 1 else "Versuchen"
        print(f"Treffer nach {versuche} {wort}!")
        break
    print("Leider nicht.")

Den Rekord speichern und laden

Mit open(name, "w") schreibst du in eine Datei, mit open(name) liest du sie. Dateien enthalten immer Text – deshalb str() beim Schreiben und int() beim Lesen:

with open("rekord.txt", "w") as datei:
    datei.write(str(5))

with open("rekord.txt") as datei:
    rekord = int(datei.read())

print("Gespeicherter Rekord:", rekord)
print("Doppelt so gut wäre:", rekord // 2)

Gut zu wissen: Hier im Browser bleibt die Datei erhalten, bis du die Seite neu lädst. Auf deinem eigenen Computer bleibt sie für immer – dort ist dein Rekord also wirklich gespeichert.

Wenn die Datei fehlt

Beim allerersten Spiel gibt es noch keine Datei. open() würde dann mit einem FileNotFoundError abbrechen. Mit try/except fängst du das ab:

try:
    with open("gibt_es_nicht.txt") as datei:
        rekord = int(datei.read())
except FileNotFoundError:
    rekord = None

if rekord is None:
    print("Noch kein Rekord – du bist der Erste!")
else:
    print("Rekord:", rekord)

None bedeutet „nichts“. Mit rekord is None prüfst du, ob es schon einen Rekord gibt.

Echter Zufall

In der Aufgabe steht die geheime Zahl fest, damit die Prüfung funktioniert. Für das echte Spiel nimmst du das Modul random:

import random

geheim = random.randint(1, 100)
print("Psst, die Zahl ist", geheim)

Weiterbauen: Wenn deine Aufgabe klappt, ersetze geheim = 42 durch random.randint(1, 100). Speichere zusätzlich den Namen des Rekordhalters (zum Beispiel als zweite Zeile in der Datei) oder baue Schwierigkeitsstufen mit unterschiedlich großen Zahlenbereichen.

Deine Aufgabe

Jetzt bist du dran

Programmiere ein Ratespiel mit Rekord. Frag mit input("Dein Tipp: ") so lange nach einer Zahl, bis sie stimmt. Antworte mit Zu klein! oder Zu groß!, bei einem Treffer mit Richtig! Versuche: 3. Lade danach den Rekord aus der Datei DATEI (gibt es sie noch nicht, gibt es auch noch keinen Rekord). Brauchst du weniger Versuche als der Rekord – oder gibt es noch keinen –, gib Neuer Rekord! aus und speichere deine Versuche in der Datei. Sonst gib Rekord: 2 Versuche aus (mit dem echten Rekord).

DATEI = "highscore.txt"
geheim = 42  # später: geheim = random.randint(1, 100)
versuche = 0

# 1. Raten lassen, bis die Zahl stimmt

# 2. Rekord laden, vergleichen und vielleicht speichern

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

DATEI = "highscore.txt"
geheim = 42  # später: geheim = random.randint(1, 100)
versuche = 0

while True:
    tipp = int(input("Dein Tipp: "))
    versuche += 1
    if tipp < geheim:
        print("Zu klein!")
    elif tipp > geheim:
        print("Zu groß!")
    else:
        print(f"Richtig! Versuche: {versuche}")
        break

try:
    with open(DATEI) as datei:
        rekord = int(datei.read())
except FileNotFoundError:
    rekord = None

if rekord is None or versuche < rekord:
    print("Neuer Rekord!")
    with open(DATEI, "w") as datei:
        datei.write(str(versuche))
else:
    print(f"Rekord: {rekord} {'Versuch' if rekord == 1 else 'Versuche'}")