Python :: Aufgabe #268 :: Lösung #1

2 Lösungen Lösungen öffentlich
#268

Galgenraten (hangman)

Anfänger - Python von JKooP - 18.04.2020 um 12:18 Uhr
Erstelle ein Konsolenspiel in der Form „Galgenraten“.

Spieler 1 gibt verdeckt ein zu erratenes Wort ein.
Regeln: Buchstaben a-z, keine Zahlen, ä = ae, ö = oe, ü = ue, ß = ss

Spieler 2 muss versuchen die richtigen Buchstaben zu erraten.
Dazu wird am Anfang des Spiels jeder Buchstabe des Lösungsworts als „Unterstrich“ dargestellt.
Errät Spieler 2 einen Buchstaben, wird der Unterstrich an allen Positionen an der sich der gefundene Buchstabe befindet durch den jeweiligen Buchstaben ersetzt.
Es sollen am Ende des Spiels die benötigte Zeit und die Anzahl der Versuche ausgegeben werden.
Die Anzahl der Versuche soll ähnlich wie beim Galgenraten begrenzt werden.

Varianten:
Der Spieler 2 kann auch das Lösungswort eingeben. Ist das Wort falsch, wird es als 2 Fehlversuche gewertet.
Als Hilfe könnten die bereits genutzten Buchstaben angezeigt werden.
Aus der Anzahl der benötigten Versuche und der Zeit könnten Gewinnpunkte generiert werden.

Viel Spaß
#1
vote_ok
von satn1241 (3090 Punkte) - 24.04.2020 um 12:58 Uhr
Quellcode ausblenden Python-Code
def choose_game_mode():
    print("Möchtest du gegen den Computer spielen? Drücke (1)")
    print("Möchtest du gegen eine/n Freund/in spielen? Drücke (2)")
    game_mode = ""
    while game_mode != "1":
        game_mode = input("> ")
        if game_mode == "2":
            break
        print("Falsche Eingabe: Drücke (1) für vs. PC oder (2) für P1 vs. P2")

    if game_mode == 1:
        print("Spiel gegen den PC gewählt")
    elif game_mode == 2:
        print("Spiel gegen eine/n Freund/in gewählt")
    return game_mode  # 1 or 2


def game_pc():
    import random
    wortliste_pc = ['Akquise', 'nichtsdestotrotz', 'Burgverlies', 'Ouvertuere', 'Chrysantheme', 'Portemonnaie',
                    'Dekollete',
                    'Quarzuhr', 'Einfaltspinsel', 'Rueckgrat', 'brillant', 'Bredouille', 'Fronleichnam',
                    'Schlafittchen',
                    'Galionsfigur', 'Terrasse', 'hanebuechen', 'unentgeltlich', 'Incentive', 'Verlies', 'Jackett',
                    'weismachen', 'Kernspintomografie', 'Xanthippe', 'lizenzieren', 'Yuccapalme', 'Mischpoke',
                    'Zucchini']

    i = random.randint(0, len(wortliste_pc))
    wort = wortliste_pc[i].lower()
    #print(wort)
    return wort


def game_player():
    print("Gib bitte ein Wort ein")
    from string import ascii_lowercase
    erlaubte_buchstaben = list(ascii_lowercase)
    while True:
        wort = input("> ").lower()
        zeichen_checker = 0
        for i in wort:
            zeichen_checker += erlaubte_buchstaben.count(i)
        if zeichen_checker == len(wort):
            break
        else:
            print("keine Umlaute, Zahlen oder Sonderzeichen erlaubt. Gib ein neues Wort ein")
    return wort


def tippen():
    global fehlversuche
    print(f"Du hast schon {fehlversuche} von max. {fehlversuche_max}")
    tipp = input("Gib bitte einen Tipp ab: > ")
    return tipp


def eingabe_check(tipp):
    from string import ascii_lowercase
    erlaubte_buchstaben = list(ascii_lowercase)
    check = 0
    for i in tipp:
        check += erlaubte_buchstaben.count(i)
    if check == len(tipp):
        return True
    else:
        print("keine Umlaute, Zahlen oder Sonderzeichen erlaubt.")
    return False


# Einzelbuchstabe Check auf wiederholte eingabe
def wiederholung_check(tipp):
    global alle_buchstaben
    if alle_buchstaben.count(tipp) > 0:
        print("Buchstabe wurden schon eingegeben")
        return False
    else:
        return True


def wort_eingabe_check(wort, tipp):
    global fehlversuche
    global zeit_start
    if wort == tipp:
        zeit_ende = default_timer()
        print(f"Richtig gelöst! Das Wort war \"{wort}\"")
        print(f"Du hast {fehlversuche} Fehlversuche benötigt")
        print(f"Du hast zum Lösen {round(zeit_ende - zeit_start, 1)}s benötigt")
        return True
    else:
        print("Das war falsch! Du erhälst zwei Fehlversuche")
        fehlversuche += 2

        return False


def buchstabe_eingabe_check(tipp, wort):
    global raster
    global falsche_buchstaben
    global fehlversuche
    for i in range(0, len(wort)):
        if wort[i] == tipp:
            raster[i] = tipp
            return True
    falsche_buchstaben.append(tipp)
    fehlversuche +=1
    print(f"Der Buchstabe {tipp} kommt nicht im Wort vor")
    return False


# Spiel
game_mode = choose_game_mode()
# Wort festlegen
if int(game_mode) == 1:
    wort = game_pc()
elif int(game_mode) == 2:
    wort = game_player()


# Tippen
raster = ["_"] * len(wort)
from timeit import default_timer
zeit_start = default_timer()
alle_buchstaben = []
falsche_buchstaben = []
stop = False
fehlversuche_max = 8
fehlversuche = 0


while not stop:
    # a) tippen und tipp auf Eingaberegeln prüfen
    status = False
    while not status:
        print(raster)
        print(f"falsche Buchstaben: {falsche_buchstaben}")
        tipp = tippen()
        if eingabe_check(tipp):
            if len(tipp) == 1:
                if wiederholung_check(tipp):
                    status = True
            elif len(tipp) > 1:
                status = True

    # b) abgleichen:
    if len(tipp) == 1:
        alle_buchstaben.append(tipp)
        if buchstabe_eingabe_check(tipp, wort):
            if raster.count("_") == 0:
                zeit_ende = default_timer()
                print(f"Richtig gelöst! Das Wort war \"{wort}\"")
                print(f"Du hast {fehlversuche} Fehlversuche benötigt")
                print(f"Du hast zum Lösen {round(zeit_ende-zeit_start,1)}s benötigt")
                stop = True
    elif len(tipp) > 1:
        if wort_eingabe_check(wort, tipp):
            stop = True

    # c) verlieren
    if fehlversuche ==8:
        print("Leider verloren! - Maximale Fehlversuche erreicht")
        print(f"Das richtige Wort war \"{wort}\"")
        stop = True

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1815120

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.