Python Hangman in der Konsole

HardtbeatShow

Cadet 4th Year
Registriert
Aug. 2020
Beiträge
96
PYTHON


Moinsen ^^
4. Tag an dem ich programmiere. Einiges gelernt bisher...
nun wollte ich Hangman in der Konsole coden. Leider... naja. seht selbst.
Python:
print("Willkommen bei Hangman")
quiz_word = input("Welches Wort soll erraten werden?: ")
word_counter = len(quiz_word) -1



while word_counter >= 0:
    print("_", end = "\t")
    word_counter -= 1



def move():
    input_player = input("Gib einen Buchstaben ein: ")
    for x in quiz_word:
        if input_player == x:
            print(input_player, end="\t")




        else:
            print("_", end="\t")





run = True
while run:
    move()

Wir reden jetzt mal noch gar nicht davon das es keine Gewinnermittlung gibt. Ich will nur das mein Code sich merken kann welche Buchstaben bereits richtig sind ^^
Es kommt nämlich das raus:

1665054294796.png

Kann mir wer helfen? ^^
Grüße Simon
 
Zuletzt bearbeitet:
Würde eine leere Liste anlegen und dann jeweils die Inputs da mit .append einfügen (ggf. noch type check einbauen), dann die While Schleife anpassen, so dass es eine Obergrenze an versuchen gibt die dann mit “len(Liste)“ gecheckt wird und dann „run“ auf False gesetzt wird, wird diese erreicht
 
  • Gefällt mir
Reaktionen: w0nd4bra
Moin^^
Also ja das Wort wird hidden. Später ^^ Zuerst will ich es mir anzeigen lassen.
Obergrenze an versuchen soll es auch geben, ja. run wird dann auf false umgestellt. War so geplant :)
aber ich weiß nicht ganz welche funktion die leere liste hat die sich nach und nach füllt. Um zu verhindern das man buchstaben doppelt einloggt?
 
Kenne ich die Regeln wohl anders, bei uns zählte doppelter Buchstabe quasi als Fehler, und in der Liste können doppelte Elemente vorkommen, daher Liste. Du kannst auch ein set nehmen, da gehen keine doppelten Einträge.
Dachte an Liste bzw. Set um halt die inputs zu haben und leichter mit denen arbeiten zu können. Gab auch noch meine ich die Möglichkeit einen String, also das Anfangswort, in einzelne Buchstaben zu teilen das man dann auch damit arbeiten kann, bin aber auch kein Programmierer, in meinem Kopf erschien mir das spontan als die einfachste Lösung
 
Wie wäre es, wenn Du Dir mal mutidimensionale Arrays anschaust? Man kann das natürlich auch mit mehreren jeweils eindimensionalen Arrays lösen, aber gerade für das zu erratende Wort und bereits erratene Buchstaben würde ich mindestens ein zweidimensionales Array nutzen.
 
S.Evans schrieb:
also das Anfangswort, in einzelne Buchstaben zu teilen das man dann auch damit arbeiten kann
also mein anfangswort müsste bereits zergliedert werden bei
if input_player ==x:
Ergänzung ()

Arrays? Nie davon gehört xD Wenn du meinst das würde helfen... ich informiere mich mal ^^
 
Kennst du schon das Konzept von Klassen?
Wenn ja, dann ein Gerüst als Denkanstoß:


Python:
from getpass import getpass

class SecretChar:
    def __init__(self, char: str) -> None:
        # Fill me

    def reveal(self) -> None:
        """
        Reveals the character
        """
        # Fill me

    def __str__(self) -> str:
        """
        Returns self.char if already revealed and "_" if not
        """
        
class SecretWord:
    def __init__(self, word: str) -> None:
        self.word = [SecretChar(char) for char in word]

    def __str__(self) -> str:
        """
        Gets the string representation of a secret word
        """
        # Fill me

    def guess(self, char: str) -> bool:
        """
        Returns true when guess is correct and reveals the correctly guessed characters
        """
        # Fill me

    def is_completely_revealed(self) -> bool:
        """
        Returns true when all characters are revealed
        """
        # Fill me
        
secret_word = SecretWord(getpass("Try to guess this one: "))
while True:
    if not guess(input("Guess character: ")):
        # Fill me
 
Ich habe einen Kurs ^^ Aber ich dachte "Okay mit dem wissen müsste ich das eigentlich hinbekommen" ^^
 
Python:
import random

print("Welcome to Hangman. Write 'quit' for exit game")


quiz_word = random.choice(["string", "integer", "python", "programming", "process", "true", "false", "hangman",
                            "keyboard", "test", "computer", "experimental", "desktop", "mouse", "controller"])

def printing_list(word = ""):
    for x in list_exe:
        print(x, end="\t")
    print(word, end=" ")
counter = 10
word_counter = len(quiz_word)
index = 0
list_exe = ["_"] * len(quiz_word)
printing_list()

while counter > 0:
    if not "_" in list_exe:
        print("you won")
    input_player = input("input letter: ")
    if input_player == "quit":
        break
    if not input_player.isalpha():
        print("only letters...!")
        printing_list()
    else:
        if input_player in quiz_word:
            for index, element in enumerate(quiz_word):
                if element == input_player:
                    list_exe[index] = element

            printing_list("Good!")
        else:
            if counter == 2:
                counter -= 1
                print("Try again.", end="\t")
                print(str(counter) + " try left")
                for x in list_exe:
                    print(x, end="\t")
            else:
                counter -= 1
                print("Try again.", end="\t")
                print(str(counter) + " tries left")
                for x in list_exe:
                    print(x, end="\t")

print("Looser")

#restart, input abfrage am ende, nach gewonnen. doppelte buchstaben. ganze wörter.


noch nicht ganz fertig. das kommentar in der letzten zeile gilt es noch umzusetzen ^^ Aber...es funktioniert
 
Sind Verbesserungsvorschläge noch erwünscht? Vieles wird ja ignoriert oder nicht mehr geantwortet (wie in deinem anderen Thread ;)). Wenn's zu viel wird dann einfach sagen, dann bin ich ruhig.
HardtbeatShow schrieb:
Bezeichnung könnte besser sein. Was wird denn gezählt? Sowas wie tries_left = 10 wäre vermutlich besser?
HardtbeatShow schrieb:
word_counter = len(quiz_word)
Hm, aber es gibt doch nur 1 Wort? Also wohl eher quiz_word_length. Wobei die Variable eh nicht benutzt wird. Was für eine IDE hast du eigentlich? Denn solche Dinge sollten dir angezeigt werden und verhindert viele Fehler. Empfehlung: VSCode + Python Plugin

HardtbeatShow schrieb:
Unbenutzt

HardtbeatShow schrieb:
list_exe = ["_"] * len(quiz_word)
Name ist verwirrend. Eigentlich ist das doch sowas wie hidden_quiz_word_chars. Keine Ahnung was du da mit exe meinst.

HardtbeatShow schrieb:
Der Name ist etwas nichtssagend. Vielleicht sowas with print_quiz_status()? Ich würde der Methode auch das hidden quiz word übergeben. Außerdem ist das mit dem übergebenem word etwas seltsam. Das sind doch zwei verschiedene Dinge die du dort machen willst: 1. Den status des Quiz Words hinschreiben und 2. ein optionales Wort dahinter. Funktionen machen am Besten immer nur genau eine Sache.

HardtbeatShow schrieb:
for index, element in enumerate(quiz_word):
Name für element Variable: Wir wissen doch was es ist: nämlich ein Buchstabe, also character oder char.
HardtbeatShow schrieb:
Das ist viel doppelter Code. Am Ende unterscheidet sich nur "tries" und "try". Also gehört auch nur genau das in einen if else Zweig.

HardtbeatShow schrieb:
for x in list_exe:
Bezüglich Schleifenvariable: Wir wissen doch genauer was x ist: Ein Buchstabe also -> character oder char.

HardtbeatShow schrieb:
print(str(counter) + " try left")
Genereller Tipp für printing: Versuche gleich format Strings zu benutzen, ist generell etwas umgänglicher:
print(f"{counter} try left")
 
Zuletzt bearbeitet:
Zurück
Oben