Python 刽子手游戏。如何切片字符串以更改原始值
我对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
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