Python 刽子手游戏。如何切片字符串以更改原始值

Python 刽子手游戏。如何切片字符串以更改原始值,python,string,Python,String,我对python非常陌生,我正在尝试制作一个刽子手游戏。 我想更改字符串以显示猜测的字母数,但由于某些原因,我不断得到奇怪的结果。这是我的密码: import random guesses_left = 9 def show_guesses_left(): print("You have", guesses_left, "guesses left") wordlist = ['nerd', 'python', 'great', 'happy', 'programmer', 'lon

我对python非常陌生,我正在尝试制作一个刽子手游戏。 我想更改字符串以显示猜测的字母数,但由于某些原因,我不断得到奇怪的结果。这是我的密码:

import random
guesses_left = 9 
def show_guesses_left():
    print("You have", guesses_left, "guesses left")


wordlist = ['nerd', 'python', 'great', 'happy', 'programmer', 'long', 'short', 'stupid']
word = random.choice(wordlist)
wordwin = word
hidden_word = ["?" for q in word]
letters_guessed = ''.join(hidden_word)

print("Welcome to Hangman!!")
print("My word is", len(word), "letters long")
print(wordwin)
print(letters_guessed)


def request_guess():
    global guesses_left
    global word
    global letters_guessed
    x = input(f"What is your guess? \n{letters_guessed}")

    if x in word:
        print("Great you guessed a letter")
        t = word.find(x)
        word = word.replace(x, "")
        print(t)
        letters_guessed = letters_guessed[:t] + letters_guessed[t:t+1].replace('?', x) + letters_guessed[t+1:]


    elif type(x) is not str or len(x) > 1:
        print("Invalid guess, Your guess must be 1 letter long")
    else:
        print("Wrong!")
        guesses_left -= 1
        show_guesses_left()



def start_game():
    global letters_guessed
    global word
    global guesses_left
    letters_guessed = ''.join(hidden_word)
    while True:
        if guesses_left > 0 and len(word) != 0:
            request_guess()


        elif len(word) == 0:
            print(f"YOU WIN!!!, the word was {wordwin}")
            break

        else:
            print("You lose! Better luck next time!")
            break
start_game()
我一直在得到这样的结果,它只适用于一些字母,而且位置是错误的。以下是我的结果:

Welcome to Hangman!!
My word is 4 letters long
long
????
What is your guess? 
????l
Great you guessed a letter
0
What is your guess? 
l???n
Great you guessed a letter
1
What is your guess? 
ln??o
Great you guessed a letter
0
What is your guess? 
ln??g
Great you guessed a letter
0
YOU WIN!!!, the word was long
为什么我不能只剪切字符串,更改一个字符,然后剪切其余的字符? 为什么第一次有效而第二次无效?
如果有人能向我解释发生了什么,我将不胜感激。主要的问题是,你正在根据一个变量进行拼接,而这个变量是你在不断修改的。特别是变量
word
,其中查找
x
的位置,即猜测的字母。该位置是正确的,直到
word
的长度被修改,因为您将字母替换为空字符串

一个简单的解决方法是简单地更改replace语句,并放置一个用户通常不会放置的空格或另一个字符。在我的示例中,我将替换:

word = word.replace(x, "")

这当然打破了程序退出逻辑:你永远不会赢

还有另一个问题,那就是同一封信的多次出现没有得到正确的解释。事实上,当同一个字母的多个实例出现在
word
中时,程序循环直到耗尽

这是因为
find
只会显示给定字母的第一个实例的位置,并且不考虑可能的重复

有几种方法可以解决这个问题,但我认为主要问题已经确定


有关替代实施,请选中解决方案

import random
guesses_left = 9
def show_guesses_left():
    print("You have", guesses_left, "guesses left")


wordlist = ['nerd', 'python', 'great', 'long', 'short', 'stupid', 'happy', 'programmer']
word = random.choice(wordlist)
wordwin = list(word)
hidden_word = list('?' * len(word))
letters_guessed = ''.join(hidden_word)

print("Welcome to Hangman!!")
print("My word is", len(word), "letters long")
print(letters_guessed)


def request_guess():
    global guesses_left
    global word
    global letters_guessed
    x = input("\nWhat is your guess?\n" + letters_guessed + "\n")

    if x in word:
        print("\nGreat you guessed a letter")
        for i, j in enumerate(word):
            if j == x:
                hidden_word[i] = j
        letters_guessed = ''.join(hidden_word)

        print(letters_guessed + "\n")
    elif type(x) is not str or len(x) > 1:
        print("Invalid guess, Your guess must be 1 letter long")
    else:
        print("\nWrong!")
        guesses_left -= 1
        show_guesses_left()



def start_game():
    global letters_guessed
    global word
    global guesses_left
    letters_guessed = ''.join(hidden_word)
    while True:
        if guesses_left > 0 and letters_guessed != word:
            request_guess()
        elif letters_guessed == word:
            print("YOU WIN!!!, the word was " + word)
            break

        else:
            print("\nYou lose! Better luck next time!")
            break
start_game()
注释

成功了

对不起,时间不多了,我们会回来帮忙的,不过请四处看看。我使用了一些不同于您最初使用的方法,似乎您猜到的
字母有问题
没有显示已经猜到的字母之前的字母。这也适用于双字母,它似乎也是与原始代码一起发布的。


再次抱歉,会回来解释更多

主要问题是用于获取猜测字母索引的代码:

    t = word.find(x)
    word = word.replace(x, "")
这会缩短每次正确猜测后的
word
,因此
t
将不是第一次正确猜测后的所需值

但是,即使您解决了这个问题,您仍然无法正确处理猜测字母多次出现的情况

下面是一个简短的示例,说明如何解决这两个问题:

answer = 'long'
hidden = '?' * len(answer)
print("Welcome to hangman!")
while True:
    guess = input("Guess a letter: ")
    result = ''
    if guess in answer:
        for answer_letter, hidden_letter in zip(answer, hidden):
            if guess == answer_letter:
                result += guess
            else:
                result += hidden_letter
        hidden = result
    print(hidden)
    if hidden == answer:
        print("You guessed it!")
        break

您将希望更新隐藏的单词,而不是猜测的字母。
answer = 'long'
hidden = '?' * len(answer)
print("Welcome to hangman!")
while True:
    guess = input("Guess a letter: ")
    result = ''
    if guess in answer:
        for answer_letter, hidden_letter in zip(answer, hidden):
            if guess == answer_letter:
                result += guess
            else:
                result += hidden_letter
        hidden = result
    print(hidden)
    if hidden == answer:
        print("You guessed it!")
        break