wannabeathena
wannabeathena

Reputation: 23

Hangman | Problem with using names and surnames as "word"

I'm new to programming. I was doing a classic hangman game, but I wanted it to be guessing some character's names from a show (name and surname).

My problem: the dashes print the space between name and surname instead of ignoring it, example:

Secret word: Rupert Giles

How it prints when all the letters are guessed: Rupert_ Giles (yes, it has a space after the dash)

I've tried:

What I think it's the problem: the secret "word" is stored in main, and main is in charge of putting dashes instead of the letters, the code of that part goes like this

main = main + "_" + " "

So maybe there's something that should be changed in there so it ignores the spaces


My code:

import random, sys, time, os


def typingPrint(text):
    for character in text:
        sys.stdout.write(character)
        sys.stdout.flush()
        time.sleep(0.05)


def typingInput(text):
    for character in text:
        sys.stdout.write(character)
        sys.stdout.flush()
        time.sleep(0.05)
    value = input()
    return value


def clearScreen():
    if os.name == 'posix':
        _ = os.system('clear')
    else:
        _ = os.system('cls')


def hangman():
    word = random.choice(
        ["Spike", "Rupert Giles", "Tara Maclay", "Willow Rosenberg", "Buffy Summers", "Xander Harris",
         "Wesley Wyndam Price", "Faith Lehane", "Angel", "Darla", "Cordelia Chase", "Dawn Summers",
         "Anya Jenkins", "Riley Finn", "Drusilla", "Oz Osbourne", "Kendra Young", "Joyce Summers", "Master",
         "Harmony Kendall",
         "Jenny Calendar", "Robin Wood", "Jonathan Levinson",
         "Ethan Rayne", "Principal Snyder", "Kennedy", "Veruca", "Hank Summers", "Halfrek", "DHoffryn", "Mr Tick"])
    validLetters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    turns = 10
    guessmade = ''
    while len(word) > 0:
        main = ""
        missed = 0
        for character in word:
            if character in guessmade.lower() or character in guessmade.upper():
                main = main + character
            else:
                main = main + "_" + " "
        if main == word:
            print(main)
            typingPrint("Congratulations! You win... for now.\nLet's try again")
            typingPrint("\nin 3...2...1")
            clearScreen()
            break

        print("\nGuess the word:", main)
        guess = input()

        if guess in validLetters:
            guessmade = guessmade + guess
        else:
            typingPrint("Enter a valid character: ")
            guess = input()
        if guess.lower() not in word and guess.upper() not in word:
            turns = turns - 1
            if turns == 9:
                typingPrint("You have 9 turns left")
                print("\n -------- this is a ceiling, don't laugh at it")
            if turns == 8:
                typingPrint("You have 8 turns left")
                print("\n -------- ")
                print("      O    ")
            if turns == 7:
                typingPrint("You have 7 turns left")
                print("\n -------- ")
                print("      O    ")
                print("      |    ")
            if turns == 6:
                typingPrint("You have 6 turns left")
                print("\n -------- ")
                print("      O    ")
                print("      |    ")
                print("     /     ")
            if turns == 5:
                typingPrint("You have 5 turns left")
                print("\n -------- ")
                print("      O    ")
                print("      |    ")
                print("     / \   ")
            if turns == 4:
                typingPrint("You have 4 turns left")
                typingPrint("\nYou are walking on thin ice")
                print("\n -------- ")
                print("    \ O    ")
                print("      |    ")
                print("     / \   ")
            if turns == 3:
                typingPrint("You have 3 turns left")
                typingPrint("\n No pressure")
                print("\n -------- ")
                print("    \ O /   ")
                print("      |    ")
                print("     / \   ")
            if turns == 2:
                typingPrint("You have 2 turns left")
                typingPrint("\nYou call yourself a Buffy fan?")
                print("\n -------- ")
                print("    \ O / |  ")
                print("      |   O ")
                print("     / \   ")
            if turns == 1:
                typingPrint("You have 1 turn left")
                typingPrint("\nYou should re-watch all seasons")
                print("\n -------- ")
                print("    \ O_|/  ")
                print("      |    ")
                print("     / \   ")
            if turns == 0:
                typingPrint("You lose, ")
                typingPrint(name)
                typingPrint("\nThe name was...")
                typingPrint(word)
                print("\n -------- ")
                print("      O_|  ")
                print("     /|\  ")
                print("     / \   ")
                typingPrint("Good night")
                typingPrint("\nin 3...2...1")
                clearScreen()
                break


while 1:
    name = typingInput("Enter your name: ")
    typingPrint("Welcome, ")
    typingPrint(name)
    typingPrint(". You have been fooled\n")
    typingPrint("Now you are my prisioner, my dear ")
    typingPrint(name)
    typingPrint("\nMwahahaha")
    print("\n-------------------------------------")
    typingPrint("Try to guess the name of this Buffy's character in less than 10 attempts")
    typingPrint("\nIf you can't, you will be hanged")
    typingPrint("\nNo pressure, ")
    typingPrint(name)
    typingPrint("\nOh... and one little, itty bitty thing...")
    typingPrint("\nThe names are from Season 1 to 7")
    typingPrint("\nGood luck, break a neck... I mean, a leg")
    hangman()
    print()

Upvotes: 2

Views: 71

Answers (3)

Acccumulation
Acccumulation

Reputation: 3591

main is a terrible variable name, so I'll be using word_as_shown instead. Also, I'll replace guessmade with guessed_letters. If you replace

if guess in validLetters:
    guessmade = guessmade + guess

with

if guess in validLetters:
    guessed_letters += guess.lower()

and define

def char_as_shown(char):
    if char == ' ':
        return ' '
    if char.lower() in guessed_letters:
        return char
    return "_"

then you can do

 word_as_shown = [char_as_shown(char) for char in word]

Upvotes: 0

Doyousketch2
Doyousketch2

Reputation: 2147

Nice. I'd print out guessed letters as well. Think this is what you're going for. You don't have to keep caps in validLetters that way.

    for character in word:
        if character .lower() in guessmade .lower():
            main = main + character
        elif character == ' ':
            main = main + '  '
        else:
            main = main + '_' + ' '

Upvotes: 0

Kraigolas
Kraigolas

Reputation: 5560

You can make this adjustment. Replace

if character in guessmade.lower() or character in guessmade.upper():
    main = main + character

With

if character in guessmade.lower() or character in guessmade.upper() or character == " ":
    main = main + character

As it stands, you are expecting your users to guess a space character. This new if statement removes that requirement.

Upvotes: 2

Related Questions