在Python中实现一个hangman函数

时间:2014-10-29 02:45:35

标签: python

这是我的功能中有问题的部分:

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中。我可以正确地打印空白,但如果用户输入单词中的字母,则会打印出正确字母的行,而不是空格,正确的字母混合在一起。

感谢任何帮助。

2 个答案:

答案 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)