首页 > 解决方案 > Python,用户选择一个词,计算机猜测它

问题描述

首先,我是 python 的菜鸟(如果你不知道的话),也是 StackOverflow 的菜鸟。

我见过类似的程序,但我找不到能给我很大帮助的程序。简而言之,我正在做的任务是创建一个程序,该程序从用户那里获取一个单词并继续猜测随机字母。

目前,我的 new_letter 函数不起作用我已经尝试在几个地方打印,所以我知道它只是没有通过该函数。

我试图想出一个计数器,以便猜测的字母将在与actual_word 中的相同位置对应的正确位置替换computers_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()

^ 好的,到目前为止,程序到达这里并停止,我没有收到任何错误,只是 new_letter 函数没有返回任何内容。

            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

标签: python

解决方案


好的。因此,正如@Uvar 指出的那样,首先,分配和比较已经在几个地方混淆了。此外,由于 while 循环和不加选择地选取 0-25 之间的值,代码可能会运行很长时间。该代码不会在将来的猜测中消除先前猜测的数字。修改后的代码(带注释)如下:

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

推荐阅读