Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

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

Terrell Stewart
PLUS
Terrell Stewart
Courses Plus Student 4,228 Points

Why doesn't my program break once I have guess the secret word?

The program continues until I run out of tries even when I correctly guess my secret word

import random

#make a list of words
words = [
    'apple',
    'orange',
    'banana',
    '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 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 guessed that number")
            continue
        elif not guess.isalpha():
          print("You can only guess a letter")
          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 didnt guess it! My secret word was {} ".format(secret_word))


    #print out win/loose

3 Answers

Chris Freeman
MOD
Chris Freeman
Treehouse Moderator 68,426 Points

If the secret _word has a repeated letter the length of good_guesses can never equal the length of secret_word. In the comparisons change list to set:

while len(bad_guesses) <7 and len(good_guesses) != len(set(secret_word)):

# ...

if len(good_guesses) == len(set(secret_word)):
Adam Young
Adam Young
15,791 Points

I knew someone would find a more concise way to do this! Way more readable than mine.

Adam Young
Adam Young
15,791 Points

The script only counts one addition to the good_guesses list, even if there are duplicate letters.

For example, if the word is strawberry, when a user guesses "r", good_guesses only increments 1, when it should increment 3.

This means that on words with duplicate letters, the condition to trigger your break will never be met.

Using strawberry again as an example, len(good_guesses) would equal 8, while len(list(secret_word)) is 10.

There are a lot of ways to do this, but here's what worked for me:

#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 guessed that number")
            continue
        elif not guess.isalpha():
          print("You can only guess a letter")
          continue

        for letter in secret_word:
          if guess == letter:
            good_guesses.append(guess)

        if guess not in secret_word:
          bad_guesses.append(guess)

        if len(good_guesses) == len(list(secret_word)):
          print("You win! The word was {}".format(secret_word))
          break
 else:
        print("You didnt guess it! My secret word was {} ".format(secret_word))
Jason Roseberry
Jason Roseberry
1,080 Points

Someone should really put this in teacher notes or on the video. I just spent an hour trying to figure out what I was doing wrong. ):

Chris Freeman
Chris Freeman
Treehouse Moderator 68,426 Points

Debugging code is great experience. Hopefully it wasn't too frustrating. Some of the best learning comes from answer the "What's wrong with my code" type questions.

There is an acknowledgement of the issue in the Teacher's Notes for the associated video that mentions:

Did you notice?

There's a tricky condition (on purpose) in the final version of our code from this video. Words that have repeated characters won't be marked as correct once they're all correctly guessed due to our len() comparisons. See if you can find a way to fix that yourself!

We'll write a version without that bug in the next video. link