Lektion 18 von 35Python
Python · Lektion 18 · 45 Minuten
Projekt: Ratespiel mit Highscore
Das lernst du
- Ein Spiel mit
while-Schleife undbreakbauen - Einen Rekord in einer Datei speichern und wieder laden
- Eine fehlende Datei mit
try/exceptabfangen
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 = 42durchrandom.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- Denkanstoß
Nimm
whileTrueund beende die Schleife mitbreak, sobald der Tipp stimmt. Erhöhe versuche bei jedem Tipp um 1. - Welcher Befehl hilft?
Fang die fehlende Datei mit
try/exceptFileNotFoundErrorab und schreib den Rekord mitopen(DATEI, "w").Vergleiche mit versuche
<rekord. Nur dann wird die Datei neu geschrieben. - Lückencode – ergänze die ___
DATEI = "highscore.txt" geheim = 42 # später: geheim = random.randint(1, 100) versuche = 0 while ___: tipp = ___ versuche += ___ if ___: print(___) elif ___: print(___) else: print(___) break try: with ___ as datei: rekord = ___ except FileNotFoundError: rekord = ___ if ___: print(___) with ___ as datei: datei.write(___) else: print(___)
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
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'}")