Python Tutorial
- jetzt Python programmieren lernen

Übung: Spiel Zahlenraten

Wir haben im letzten Kapitel die while-Schleife in Python kennen gelernt. Wie können wir daraus ein kleines Spiel basteln? Lustigerweise benötigen wir die while-Schleife so gut wie immer in vielen Programmen. Aber langsam mit den Pferden.

Unser Zahlenraten-Spiel: der Computer bestimmt durch Zufall eine Zahl zwischen 0 und 100. Wir haben 7 Versuche, exakt diese Zahl zu erraten. Bei jedem Rateversuch bekommen wir eine der folgenden 3 Möglichen Reaktionen von unserem Spiel:

  • deine gerate Zahl ist zu groß
  • deine gerate Zahl ist zu klein
  • Gewonnen! Die geheime Zahl ist nicht mehr geheim

Zusätzlich müssen wir neben der Zahl auch noch die Anzahl der Runden kontrollieren. Unsere while-Schleife läuft maximal siebenmal durch.

Für diese maximal 7 Durchgänge gibt es 2 verschiedene Möglichkeiten:

Die im letzten Kapitel kennen gelernte Variante:

durchgang = 0
while durchgang < 7:
	print(durchgang)
	durchgang = durchgang + 1
print("nach der Schleife")

Wir benötigen natürlich die Möglichkeit die Schleife vorzeitig zu beenden. Dies können wir über die Anweisung break in einer if-Abfrage erreichen. Im folgenden Beispiel brechen wir bei 3 ab – im Spiel brechen wir ab, wenn der Spiel der Zahl erraten hat.

durchgang = 0
while durchgang < 7:
	print(durchgang)
	durchgang = durchgang + 1
	if (durchgang == 3):
		break
print("nach der Schleife")

die „unendliche“ while-Schleife

Die zweite Möglichkeit von einer while-Schleife ist in den meisten Fällen die bessere Vorgehensweise. Wir wissen bei vielen Anwendungen nicht, wie oft die while-Schleife durchlaufen werden muss. Daher geben wir der while-Schleife nur eine Variable mit dem Wert True mit. Jetzt können wir innerhalb der while-Schleife die Bedingung abfragen.

durchgang = 0
aktiv = True
while aktiv:
    print(durchgang)
    durchgang = durchgang + 1
    if (durchgang == 3):
        aktiv = False
print("nach der Schleife")

Was ist nun der große Vorteil von der zweiten Variante? Ich kann auf Benutzereingaben reagieren und beschränke die Anzahl der Schleifendurchläufe nicht im Vorfeld. Nehmen wir an, der Benutzer kann das Programm beenden mit der Eingabe von „ende“. Somit kontrollieren wir die Benutzereingabe und sobald dieser „ende“ eintippt wir in diesem Schleifendurchgang dann die Variable „aktiv“ auf „False“ gesetzt:

durchgang = 0
aktiv = True
while aktiv:
    print(durchgang)
    durchgang = durchgang + 1
    benutzereingabe = input("Bitte Zahl eingeben: ")
    if (benutzereingabe == "ende"):
    	aktiv = False
print("nach der Schleife")

Wichtig ist, dass wir hier Python3 nutzen. Ansonsten bekommen wir eine Fehlermeldung bei Python2.

Aufgabe: Zahlenratespiel

Der Spieler hat 7-mal die Chance die vom Computer durch Zufall festgelegte Zahl zu erraten. Als Rückmeldung bekommt er nur:

  • deine gerate Zahl ist zu groß
  • deine gerate Zahl ist zu klein
  • Gewonnen! Die geheime Zahl ist nicht mehr geheim

Wenn der Spieler gewonnen hat, kommt eine entsprechende Meldung. Hat der Spieler die Zahl nicht erraten, kommt als Nachricht: „Schade – verloren. Einfach nochmals probieren“.

Bitte erst selber eine Lösung probieren, bevor die folgende Lösung kommt. Alle benötigen Python-Befehle wurden in den vorherigen Kapiteln vorgestellt.

Lösung: Zahlenratespiel

Sehr oft wird man am Anfang beim Programmieren über die Umwandlung von den Inhalten der Variablen stolpern. Wir wollen einen Vergleich machen zwischen der Nutzereingabe und einer Zahl. Also müssen wir eine Umwandlung über int machen. Wenn wir am Spielende die vom Computer erstellte Zahl ausgeben wollen, müssen wir die Zahl für die Ausgabe dann umwandeln anhand von var.

Hier nun eine mögliche Lösung. Und immer daran denken: es gibt mehr als einen Weg nach Rom:

import random
durchgang = 0
aktiv = True
ratezahl = random.randint(0,100)

while aktiv:
    durchgang = durchgang + 1
    print()   # für Abstand (nur Optik)
    print(durchgang)
    benutzereingabe = int (input("Bitte Zahl eingeben: "))
    
    if benutzereingabe == ratezahl:
        print("Gewonnen! Die geheime Zahl ist nicht mehr geheim")
        aktiv = False
    elif benutzereingabe > ratezahl:
        print("deine gerate Zahl ist zu groß")
    else:
        print("deine gerate Zahl ist zu klein")
        
    if (durchgang == 7):
        print("Schade – verloren. Einfach nochmals probieren")
        print("Es war die Zahl " + str(ratezahl))
        aktiv = False
print("Ende des Spiels")