Python 4.5 – Coding Challenge – Schere-Stein-Papier Turnier
Herzlich Willkommen zur Abschlusslektion des vierten Moduls in unserem Python-Schnellstart. In dieser Lektion wollen wir das Wissen, das wir uns angeeignet haben, anwenden.
Coding-Challenge - Schere-Stein-Papier Turnier
Im Königreich soll ein Schere-Stein-Papier Turnier stattfinden. Um dich darauf ideal vorzubereiten, möchtest du das Spiel in Python abbilden. Dabei willst du jeweils auswählen dürfen, wie viele Runden das Spiel gehen soll. Der Computer soll seine Wahl zufällig treffen.
Zunächst implementieren wir eine Funktion, die die Abfrage nach der Rundenzahl abbildet.
Hier kannst du deinen Code eingeben:
Erste Aufgabe - Spielrunden definieren
- Definiere eine Funktion abfrage
- Die Funktion soll einen Input haben z.B. "Wieviele Runden möchtest du spielen? "
- Gib den Wert von Input mit return zurück
Erste Aufgabe - Lösung:
Wenn du nicht weiterkommst, findest du hier die Komplettlösung zu der Aufgabe. Du kannst den folgenden Code in den Online-Editor kopieren & einfügen, um ihn zu testen.
[lp_spoiler title="Spoiler - Lösung anzeigen"]
def abfrage_runde():
return input("Wieviele Runden moechtest du spielen? ")
[/lp_spoiler]
Zweite Aufgabe - Computer-Entscheidung
Jetzt implementieren wir eine Funktion, die den Zug des Computers simuliert. Wir haben uns an dieser Stelle dafür entschieden, Schere, Stein und Papier die Zahlen 1, 2 und 3 zuzuordnen.
Es gibt in Python auch erweiterte Techniken, wie man solche Konstanten mit Namen abbilden kann, z.B. über Enumerationen. In diesem einfachen Fall reichen aber Integer völlig aus. Unsere Funktion macht nichts anderes, als eine Zahl zwischen 1 und 3 zu wählen und diese zurückzugeben.
Deine Aufgabe:
- Erstelle die Funktion computer_choice
- Die Funktion soll eine Zufallszahl zwischen 1 und 3 zurückgeben
Zweite Aufgabe - Lösung:
[lp_spoiler title="Spoiler - Lösung anzeigen"]
def computer_choice():
return randint(1,3)
[/lp_spoiler]
Dritte Aufgabe - Sieger der Runde ermitteln
Als nächstes implementieren wir die Logik, wie ein Sieger einer Runde determiniert wird.
Es gibt hierbei drei Fälle, die wir unterscheiden müssen. Unentschieden ist der einfachste Fall und kann ganz einfach über ein einziges if-Statement abgebildet werden. Alle anderen Fälle müssen wir explizit ausprogrammieren. Der Rückgabewert der Funktion drückt aus, wer die Runde gewonnen hat. Wir verwenden dazu erneut Integerkonstanten.
- Unentschieden = 0
- Der Spieler gewinnt = 1
- Der Computer gewinnt = 2
Deine Aufgabe:
- Erstelle eine Funktion determine_winner_round mit den Parametern player_choice und computer_choice
- Erstelle Wenn-Dann Abfragen für die jeweiligen Ausprägungen des Spiels. z.B. Kondition: Spieler wählt Schere = 1, Computer wählt Stein = 2, Ausgabe: Computer gewinnt
- Achte darauf, dass du einen Rückgabewert definierst: Unentschieden = 0, Spieler gewinnt = 1, CPU gewinnt = 2
Tipp: Es gibt insgesamt 7 Ausprägungen, wie das Spiel ausgehen kann.
Dritte Aufgabe - Lösung:
[lp_spoiler title="Spoiler - Lösung anzeigen"]
def determine_winner_round(player_choice, computer_choice):
#0 - Unentschieden
#1 - Spieler gewinnt
#2 - CPU gewinnt
if (player_choice == computer_choice):
print("Unentschieden")
return 0
elif player_choice == 1 and computer_choice == 2:
print("Der Computer gewinnt")
return 2
elif player_choice == 1 and computer_choice == 3:
print("Du gewinnst!")
return 1
elif player_choice == 2 and computer_choice == 1:
print("Du gewinnst!")
return 1
elif player_choice == 2 and computer_choice == 3:
print("Der Computer gewinnt")
return 2
elif player_choice == 3 and computer_choice == 1:
print("Der Computer gewinnt")
return 2
elif player_choice == 3 and computer_choice == 2:
print("Du gewinnst!")
return 1
[/lp_spoiler]
Vierte Aufgabe - Sieger des Spieles ermitteln
Wir brauchen zudem eine Funktion, die den Sieger des Spieles ingesamt ausgibt. Diese Funktion erwartet zwei Parameter, nämlich die Anzahl an gewonnen Runden für jeweils den Spieler und den Computer.
Deine Aufgabe:
- Definiere die Funktion determine_winner_overall mit den beiden Parametern wins_player und wins_cpu
- Definiere über eine If-Abfrage, wie der Gewinner aller Runden ermittelt werden soll (CPU gewinnt, Spieler gewinnt, Unentschieden)
- Gib über den Print-Befehl den jeweiligen Text aus (z.B. "Spieler gewinnt das Spiel" usw.)
Vierte Aufgabe - Lösung:
[lp_spoiler title="Spoiler - Lösung anzeigen"]
def determine_winner_overall(wins_player, wins_cpu):
if (wins_player => wins_cpu):
print("Du gewinnst das Spiel!")
elif (wins_player =< wins_cpu):
print("Der Computer gewinnt das Spiel!")
else:
print("Das Spiel endet unentschieden")
[/lp_spoiler]
Fünfte Aufgabe - Die Hauptlogik implementieren
Jetzt sind wir bereit, die Hauptlogik des Spiels zu implementieren. Wir erstellen zwei Zählervariablen für den Spieler und die CPU. Die Hauptlogik des Spiels wird in einer for-Schleife abgearbeitet.
Nachdem die Schleife abgearbeitet ist, vergleichen wir die beiden Zählervariablen miteinander, um den Sieger zu ermitteln. Wenn der Spieler eine Runde gewinnt, soll
Deine Aufgabe:
- Definiere die Funktion game mit dem Parameter abfrage_runde
- Erstelle zwei Zählervariablen count_wins_player und count_wins_cpu. Setze die Variablen auf den Wert 0
- Erstelle eine for-Schleife für die jeweilige Anzahl der Spielrunden (abfrage_runde)
- Erstelle die Variable zug_spieler und speichere ein Tastatur-Input für den Spieler.
- Erstelle die Variable zug_computer. Rufe hier einfach die computer_choice() Funktion auf.
- Erstelle eine Variable ergebnis und rufe darin die Funktion determine_winner_round mit dem Spielerinput (zug_spieler) bzw. der zufällig generierten Zahl für den Computer (zug_computer) als Parameter auf. Wir befinden uns immer noch in der for-Schleife.
- Da wir jetzt den Gewinner der Runde ermittelt haben, brauchen wir noch eine If-Abfrage, um den Gesamt-Punktestand für den späteren Sieger zu ermitteln. Wenn der Spieler gewinnt soll sich die Variable count_wins_player um +1 erhöhen. Wenn der Computer gewinnt soll sich die Variable count_wins_cpu um +1 erhöhen. Wir befinden uns immer noch in der for-Schleife.
- Rufe die Funktion determine_winner_overall mit den beiden Parametern count_wins_player und count_wins_cpu, außerhalb der for-Schleife auf.
Wie immer brauchen wir noch eine main-Funktion, die lediglich die anderen Funktionen aufruft.
def main():
game(abfrage_runde())
if __name__ == "__main__":
main()
Fünfte Aufgabe - Lösung:
[lp_spoiler title="Spoiler - Lösung anzeigen"]
def game(abfrage_runde):
count_wins_player = 0
count_wins_cpu = 0
print("Wir spielen " + str(abfrage_runde) + " Runden!")
for runde in range(int(abfrage_runde)):
zug_spieler = int(input("Wähle zwischen Schere(1), Stein(2) und Papier(3): "))
zug_computer = computer_choice()
ergebnis = determine_winner_round(zug_spieler, zug_computer)
if (ergebnis == 1):
count_wins_player = count_wins_player + 1
elif (ergebnis == 2):
count_wins_cpu = count_wins_cpu + 1
determine_winner_overall(count_wins_player, count_wins_cpu)
Wie immer brauchen wir noch eine main-Funktion, die lediglich die anderen Funktionen aufruft. Du kannst diesen Code kopieren:
def main():
game(abfrage_runde())
if __name__ == "__main__":
main()
[/lp_spoiler]
(Optionale) Erweiterungen:
- Lass statt einem Spieler zwei Computerspieler gegeneinander antreten.
- Wenn das Spiel unentschieden endet, soll eine Entscheidungsrunde gespielt werden.
Komplettlösung der Challenge
Wenn du dir die Komplettlösung anschauen möchtest, klicke hier:
[lp_spoiler title="Komplette Lösung anzeigen" class="da"]
from random import randint
def abfrage_runde():
return input("Wieviele Runden moechtest du spielen? ")
def computer_choice():
return randint(1,3)
def determine_winner_round(player_choice, computer_choice):
#0 - Unentschieden
#1 - Spieler gewinnt
#2 - CPU gewinnt
if (player_choice == computer_choice):
print("Unentschieden")
return 0
elif player_choice == 1 and computer_choice == 2:
print("Der Computer gewinnt")
return 2
elif player_choice == 1 and computer_choice == 3:
print("Du gewinnst!")
return 1
elif player_choice == 2 and computer_choice == 1:
print("Du gewinnst!")
return 1
elif player_choice == 2 and computer_choice == 3:
print("Der Computer gewinnt")
return 2
elif player_choice == 3 and computer_choice == 1:
print("Der Computer gewinnt")
return 2
elif player_choice == 3 and computer_choice == 2:
print("Du gewinnst!")
return 1
def determine_winner_overall(wins_player, wins_cpu):
if (wins_player >= wins_cpu):
print("Du gewinnst das Spiel!")
elif (wins_player <= wins_cpu):
print("Der Computer gewinnt das Spiel!")
else:
print("Das Spiel endet unentschieden")
def game(abfrage_runde):
count_wins_player = 0
count_wins_cpu = 0
print("Wir spielen " + str(abfrage_runde) + " Runden!")
for runde in range(int(abfrage_runde)):
zug_spieler = int(input("Wähle zwischen Schere(1), Stein(2) und Papier(3): "))
zug_computer = computer_choice()
ergebnis = determine_winner_round(zug_spieler, zug_computer)
if (ergebnis == 1):
count_wins_player = count_wins_player + 1
elif (ergebnis == 2):
count_wins_cpu = count_wins_cpu + 1
determine_winner_overall(count_wins_player, count_wins_cpu)
def main():
game(abfrage_runde())
if __name__ == "__main__":
main()
[/lp_spoiler]
Zusammenfassung
Wir haben in dieser Lektion vieles von unserem Wissen angewendet und stellen dabei fest, dass wir bereits sehr mächtige Programme schreiben können. Insbesondere Schleifen und Entscheidungen helfen immens dabei, deinen Programmen mächtige Funktionalitäten hinzuzufügen.
Wir hoffen, du hattest Spaß mit unserem Ratgeber und wir konnten dich für Python begeistern. Unsere anderen Kurse werden dir tiefergehendes Wissen vermitteln.