这是我的功能中有问题的部分:
def hangman1(word):
global guessesMade
global guessesLeft
currentGuess = '_ ' * len(word)
let = print(input('Please guess a letter: '))
for i in range(len(word)):
if word[i] == let:
print('{} is contained in the word.'.format(let))
if i == 0:
currentGuess = word[0] + currentGuess[1:]
else:
currentGuess = currentGuess[:i] + word[i] + currentGuess[i + 1:]
print(currentGuess)
用户在提示符处输入一个字母,它会检查该字母是否位于从单词列表中生成的函数外部的randomWord中。我可以正确地打印空白,但如果用户输入单词中的字母,则会打印出正确字母的行,而不是空格,正确的字母混合在一起。
感谢任何帮助。
答案 0 :(得分:2)
你现在遇到的主要问题是双重问题 - 一个,replace()方法替换字符串中任何给定输入的所有实例,而不是第一个,而且两个,你没有&# 39;目前有任何方法可以告诉你已经发现了哪些信件。调用replace(&#34; _&#34;,let)将始终替换&#34; _&#34;的每个实例,并且假定您将其应用于仅的字符串< / em>由下划线组成,它总是会覆盖整个字符串。看起来你每次使用猜测字母调用hangman()时都会重新生成hidden_let,这意味着你的设计最好的情况是你只会显示用户猜到的每一个字母,并且否则就是一堆下划线。
您想要做的是有两个值,correct_word和current_guess。 correct_word将是玩家必须猜测的单词,current_guess将是他们猜测单词的进度,从一串只有与correct_word相同长度的下划线开始。
这是一个简短的例子。我已经冒昧地删除了你的全局引用 - 全局变量通常不受欢迎 - 并将行为封装在一个小类中。您想要将hangmanner.play_hangman()中的值替换为您的随机单词。
class Hangmanner:
correct_word = ''
current_guess = ''
def play_hangman(self, word):
self.correct_word = word
self.current_guess = '_' * len(self.correct_word)
while self.current_guess != self.correct_word:
self.guess_letter(input("Please guess a letter: "))
def guess_letter(self, guessed_letter):
for i in range(len(self.correct_word)):
if self.correct_word[i] == guessed_letter:
if i == 0:
self.current_guess = self.correct_word[i] + self.current_guess[1:]
else:
self.current_guess = self.current_guess[:i] + self.correct_word[i] + self.current_guess[i + 1:]
print(self.current_guess)
if __name__ == "__main__":
hangmanner = Hangmanner()
hangmanner.play_hangman("test")
这使用python中的切片函数,您可以使用括号和[first:last]语法来访问任何给定集合的任意范围。如果缺少第一个或最后一个,则切片分别继续到集合的开头或结尾。在上面,current_guess [1:]将current_guess从第二个索引返回到最后一个索引。 current_guess [:i]将current_guess从第一个索引返回到i之前的索引,假设last是唯一的结束边界。
答案 1 :(得分:2)
hiddenLet.replace('_',let)
将所有_
替换为let
代表的所有内容。
newWordList = [x if x==let else '_' for x in randWord]
newWord = ''.join(newWordList)