Skip to content
Advertisement

Python, User picks a word and computer guesses it

First off I am a noob to python (if you couldn’t tell) and a noob to StackOverflow.

I’ve seen similar programs but I can’t find ones that quite give me much help. In short, the assignment I’m doing is to create a program that takes a word from the user and proceeds to guess random letters.

Currently, my new_letter function doesn’t work I’ve tried printing in several places so I know that it just doesn’t get through the function.

I was trying to come up with a counter so that the guessed letter would replace the * in computers_word in the right spot that corresponds with the same place in actual_word.

import random

#I just have this as a placeholder so guessed_letter exists
guessed_letter = 0

#list of all letters
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

generateletter = True

#this function is supposed to randomly picks letters and only move on if that letter is not one in the guessed list

def new_letter():
    while generateletter == True:
        n = random.randint(0, 25)
        guessed_letter = alphabet[n]
        
        for g in guessed:
            if guessed_letter == g:
                    continue
        generateletter == False
    guessed.append(guessed_letter)
    print('I guess '+str(guessed_letter))
    generateletter == False
    
    return guessed_letter

#This functions just updates the player (and me)
def display_status():
    print(actual_word)
    print(computers_word)
    print(guessed)

playagain = True
guessagain = True

#Outer loops allow for variables to be reset if the user wants to play again after the word has been guessed
while playagain == True:
    #new word is entered by the user
    user_word = input('Please choose a word and I will try to guess it: ')
    
    #resets lists
    guessed = []
    actual_word = []
    computers_word = []
    
    for letter in user_word:
        
        #Append users word to actual_word as a list
        actual_word.append(letter)
        
        #Appends *'s the same length as the user's word to computers_word
        computers_word.append('*')
        
    counter = 0

    #computer gameplay begins
    while guessagain == True:
        if computers_word != actual_word:
            display_status()

^ Okay as of now the program gets to here and just stops, I don’t get any errors it’s just the new_letter function isn’t returning anything.

            guessed_letter = new_letter()
            print(guessed_letter)
            for letter in user_word:
                if guessed_letter == letter:
                    computers_word.append(counter, guessed_letter)
                    
                    #I realize that the way these counter works is wrong. The concept is so that the star replaced corresponds with the same position in the actual_word list
                    counter = counter + 1
                    
                else:
                    continue
                    
        elif computers_word == actual_word:
            display_status
            user_choice = input('I guessed the word! Would you like to play again? ')
            if user_choice == 'Yes' or user_choice == 'yes':
                guessagain == False
                playagain == True
                
            else:
                guessagain == False
                playagain == False

Advertisement

Answer

Okay. So, to start off as @Uvar pointed out, the assignment and comparison has been mixed up at several places. Additionally, the code could run for very long duration because of the while loop and indiscriminate picking of values between 0-25. The code doesn’t eliminate previously guessed digits in future guesses. The modified code (with comments) is as follows:

import random
import string

guessed_letter = 0

# list of all letters
# string.ascii returns 'abcdefghijklmnopqrstuvwxyz'
alphabet = list(string.ascii_lowercase)
alphabet.extend(list(string.ascii_uppercase))
generateletter = True


# this function is susposed to randomly picks letters and only move 
# on if that letter is not one in the guessed list
def new_letter(generateletter, alphabet):
    while generateletter:
        # Using random.choice to pick values
        guessed_letter = random.choice(alphabet)

        if guessed_letter not in guessed:
            for g in guessed:
                if guessed_letter == g:
                        continue
            generateletter = False
        guessed.append(guessed_letter)

        # To prevent picking the same values again, remove them
        alphabet.remove(guessed_letter)
        print('I guess '+str(guessed_letter))
        generateletter = False

    return guessed_letter

def display_status(actual_word, computers_word, guessed):
    print("Actual Word", actual_word)
    print("Computers Word:", computers_word)
    print("Guessed:", guessed)

playagain = True
guessagain = True

# 'while playagain == True' and 'while playagain' evaluate the same thing
while playagain:

    user_word = input('Please choose a word and I will try to guess it: ')

    guessed = []
    actual_word = []
    computers_word = []

    for letter in user_word:
        actual_word.append(letter)
        computers_word.append('*')

    while guessagain:
        if computers_word != actual_word:
            display_status(actual_word, computers_word, guessed)
            guessed_letter = new_letter(generateletter, alphabet)
            print("Guessed Letter:", guessed_letter)

            # Used enumerate here to get position too
            # Additionally, used actual_word
            for i,letter in enumerate(actual_word):
                if guessed_letter == letter:
                    # Insert at exactly the required position
                    computers_word[i] = guessed_letter

                else:
                    continue

        elif computers_word == actual_word:
            display_status
            user_choice = input('I guessed the word! Would you like to play again? ')
            if user_choice == 'Yes' or user_choice == 'yes':
                guessagain = False
                playagain = True

            else:
                guessagain = False
                playagain = False
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement