Python 3.6 – Coding Challenge – Das Zahlen-Orakel

Herzlich willkommen zur 3. Coding-Challenge: Das Zahlen-Orakel.

In dieser Lektion wollen wir das Wissen, das wir im 3. Modul gelernt haben, anwenden.

Deine Challenge:

Als König willst du mit deinem Orakel ein kleines Spiel spielen.

Das Ganze geht so: Dein Spielpartner denkt sich eine Zahl aus und du rätst so lange, bis du erraten hast, um welche Zahl es sich handelt. Dein Spielpartner gibt dir für jeden Rateversuch Rückmeldung, ob du zu hoch oder zu niedrig geraten hast, oder ob dein Rateversuch stimmt. Damit du auch allein spielen kannst, soll die Zahl zufällig ausgewählt werden.

Wie immer teilen wir große Aufgaben in mehrere Funktionen auf.

Hier kannst du deinen Code eingeben, wenn du die unten stehenden Aufgaben gelesen hast:

Erste Aufgabe - Zufallszahl 1 bis 100

Zuerst programmieren wir die Funktion, die eine Eingabe annimmt und diese dann zurückgibt.

  1. Definiere eine Funktion eingabe.
  2. Deine Funktion soll eine zufällige Zahl von 1 bis 100 zurückgeben. Hinweis: randint()    😉

Erste Aufgabe - Lösung:

Wenn du nicht weiterkommst, findest du hier die Lösung zu der ersten Aufgabe. Du kannst den folgenden Code in den Online-Editor kopieren & einfügen, um ihn zu testen.

[lp_spoiler title="Spoiler - Lösung anzeigen"]

from random import randint

def eingabe():
    return randint(1,100)

In dieser Funktion haben wir den Rückgabewert von

randint

nicht zuerst in einer Variable gespeichert, sondern direkt zurückgegeben. Diese Funktionalität ist sehr überschaubar und lohnt sich eigentlich nicht, explizit in einer Funktion gekapselt zu werden. Dennoch kann eine derartige Implementierung empfehlenswert sein, da die Funktion später gegebenenfalls erweitert wird.

[/lp_spoiler]

Zweite Aufgabe - Hauptfunktionalität des Zahlenratens

Als Nächstes implementieren wir die Hauptfunktionalität des Zahlenratens.

  • Dazu brauchen wir eine Schleife (solange....bis) und
  • eine Entscheidung (wenn...dann).

Wir verlassen die Schleife, sobald keine unserer Bedingungen mehr eintritt - das bedeutet, dass unser Rateversuch weder zu hoch, noch zu niedrig ist.

Deine Aufgabe:

  1. Definiere eine Funktion z.B. game mit dem Parameter number. Diesen Zahlenwert aus der Variable number prüfen wir im Hauptspiel später gegen die geratene Zahl.
  2. Erstelle eine Variable namens guess (die Ratezahl) und setze den Wert auf 0.
  3. Erstelle eine while-Schleife mit der Kondition: guess ist nicht gleich number. Durch diese Kondition bleiben wir so lange in der Schleife, bis wir die richtige Zahl erraten haben.
  4. Erstelle eine Tastatureingabe für den Spieler mit dem input-Befehl und speichere den Wert in der guess Variable. Achtung: Denk daran, dass du die Tastatureingabe in den Datentyp Integer konvertierst, da alle "inputs" standardmäßig den Datentyp "String" enthalten.
  5. Erstelle eine If-Abfrage mit if und elif. Die If-Kondition prüft, ob die geratene Zahl größer als die Zufallsnummer ist. Die elIf-Kondition prüft, ob die geratene Zahl kleiner als die Zufallsnummer ist.
  6. Wenn die jeweilige Kondition eintrifft, soll ein Text über den print-Befehl ausgegeben werden z.B. "Du hast zu niedrig geraten" bzw. "Du hast zu hoch geraten".
  7. Sollte keine der beiden If-Konditionen eintreffen, gib den Text "Du hast richtig geraten!" aus.

Nach Schritt 7 bist du fertig. Alles, was noch fehlt, ist der Aufruf der Funktionen in der Hauptfunktion main. Diesen Code kannst du einfach kopieren:

def main(): 
    game(eingabe()) 

if __name__ == '__main__':
    main() 

[lp_spoiler title="Spoiler - Lösung anzeigen"]

def game(number):
    guess = 0

    while (guess != number):

        guess = int(input("Gib eine Zahl zwischen eins und hundert ein: "))
        if (guess > number):
            print("Du hast zu hoch geraten")
        elif (guess < number):
            print("Du hast zu niedrig geraten")
        else:
            print("Du hast richtig geraten!")

Wieder verwenden wir hier das Prinzip der Funktionen-Verkettung: Das Ergebnis der input-Funktion muss noch in eine Integerzahl umgewandelt werden. Wir wenden daher die Funktion int auf den Rückgabewert der Funktion input. Dies entspricht exakt der folgenden Funktionalität:

guess = input("Gib eine Zahl zwischen eins und hundert ein: ")
guess = int(guess)

Die Verkettung von Funktionen ist in Hinsicht auf die Übersichtlichkeit sehr nützlich. Alles, was jetzt noch fehlt, ist eine Hauptfunktion:

def main():

    game(eingabe())

if __name__ == '__main__':
    main()

[/lp_spoiler]

Erweiterungen: 

  1. Lasse dem Benutzer den Bereich selbst wählen, aus dem die Zufallszahl gewählt wird.
  2. Der Benutzer soll nun nur noch zehn Versuche haben, die Zahl richtig zu raten. Beim elften Versuch endet das Spiel mit der Niederlage des Spielers.

Zusammenfassung:

Wir haben die Funktionalitäten Schleife und Entscheidung effektiv eingesetzt, um einen zufälligen Wert bis zum Erreichen einer Kondition immer wieder mit einem Zufallswert zu vergleichen. Diese Konstrukte sind die Basis fast aller Programme.