Python Python Basics (2015) Letter Game App Letter Game Refinement

Armand van Alphen
Armand van Alphen
12,852 Points

If I guess a letter that exist multible times within a secret word I instantly win. Did I do something wrong?

My code runs without errors. But I guess a letter that exist multible times within a secret word I instantly win. Did I do something wrong?

\/here is my code \/

import os
import random
import sys

# make a list of words  
words = [
    'apple',
    'banana',
    'orange',
    'coconut',
    'strawberry',
    'lime',
    'grapefruit',
    'lemon',
    'kumquat',
    'blueberry',
    'melon'
]

def clear():
    if os.name == 'nt':
        os.system('cls')
    else:
        os.system('clear')

def draw(bad_guesses, good_guesses, secret_word):
    clear()
    print('Strikes: {}/7'.format(len(bad_guesses)))
    print('')

    for letter in bad_guesses:
        print(letter, end=' ')
    print('\n\n')


    for letter in secret_word:
        if letter in good_guesses:
            print(letter, end='')
        else:
            print('_', end='')

    print('')

def get_guess(bad_guesses, good_guesses):
    guess = input("guess a letter: ").lower()

    while True:
        if len(guess) != 1:
            print("You can only guess a single letter!")

        elif guess in bad_guesses or guess in good_guesses:
            print("You already guess that letter!")

        elif not guess.isalpha():
            print("You can only guess letters!")

        else: 
            return guess

def play(done):
    clear()
    secret_word = random.choice(words)
    bad_guesses = []
    good_guesses = []

    while True:
        draw(bad_guesses, good_guesses, secret_word)
        guess = get_guess(bad_guesses, good_guesses)

        if guess in secret_word:
            good_guesses.append(guess)
            found = True
            for letter in secret_word:
                if letter not in good_guesses:
                    found = False

                if found:
                    print("You win!")
                    print("The secret word was {}".format(secret_word))
                    done = True
        else:
            bad_guesses.append(guess)
            if len(bad_guesses) == 7:
                draw(bad_guesses, good_guesses, secret_word)
                print("You lost!")
                print("The secret word was {}".format(secret_word))
                done = True

        if done:
            play_again = input("Play again? Y/n").lower()
            if play_again != 'n':
                return play(done=False)
            else:
                sys.exit()                  

print('Welcome to Letter Guess')


def welcome():
    start = input("Press enter/return to start or Q to quit ").lower()
    if start == 'q':
        print("Bye!")
        sys.exit()
    else:
        return True


done = False
while True:
    clear()
    welcome()
    play(done)

2 Answers

Logan R
Logan R
22,823 Points

Hi!

So the first thing I noticed was the indentation of your if found. It's tabbed out once too far and is part of the for loop.

            for letter in secret_word:
                if letter not in good_guesses:
                    found = False

            if found:
                print("You win!")
                print("The secret word was {}".format(secret_word))
                done = True

The second problem is that input should be inside of your while loop for getting a new letter. If it's not, then it will always just print "You already picked that letter" when picking the same letter, etc. This is because you never ask for a new letter.

def get_guess(bad_guesses, good_guesses):
    while True:
        guess = input("guess a letter: ").lower()

If you fix those two issues, you should be good to go! If you still have some bugs and can't fix them, just add a comment about what causes it and I can take a look :) I ran the program a few times and it works fine for me.

Armand van Alphen
Armand van Alphen
12,852 Points

Thanks for taking the time to help me its much appreciated

Logan R
Logan R
22,823 Points

Hey, no problem :) Happy to help!

Marzoog AlGhazwi
Marzoog AlGhazwi
12,806 Points

my code without errors . but somehow the game is not working, I can guess without showing me if it's a good one or a bad one

import random

# make a list of words

words = [
    'apple',
    'banana',
    'orange',
    'coconut',
    'strawberry',
    'lime',
    'grapefruit',
    'lemon',
    'kumquat',
    'blueberry',
    'melon'
]

while True:
    start = input("Press enter/return to start, or enter Q to quit")
    if start.lower() == 'q':
        break
    # pick a random word 
    secret_word = random.choice(words)
    bad_guesses = []
    good_guesses = []

    while len(bad_guesses) < 7 and len(good_guesses) != len(list(secret_word)): 
        # draw guessed letters,spaces and strikes 
        for letter in secret_word:
            if letter in good_guesses:
                print(letter, end='')
            else:
                print('_', end='')

            print('')
            print('Strikes: {}/7'.format(len(bad_guesses)))
            print('')

            # take guess
            guess = input("Guess a letter: ").lower()

            if len(guess) != 1:
                print("You can only guess a single letter !")
                continue
            elif guess in bad_guesses or guess in good_guesses:
                print("You've already guess that letter!")
                continue
            elif not guess.isalpha():
                print("You can only guess letters!")
                continue
            if guess in secret_word:
                good_guesses.append(guess)
                if len(good_guesses) == len(list(secret_word)):
                    print("You win! The word was {}".format(secret_word))
                    break
                else:
                    bad_guesses.append(guess)
        else:
        print("You didn't guess it! My secret word was {}".format(secret_word))

    # print out win/lose