hangman程序中的缺陷

2024-04-20 09:56:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要编写一个简单的hangman函数,它包含一个字符串(猜测的单词)和一个字母列表(猜测的字母)。 这是我使用的代码:

def WordGuessed(Word, letters):
    if letters == []:
        return False
    else:
        for i in letters:
            if i not in Word:
                return False
        else:
            if i == letters[-1]:
                return True

代码通常是有效的,但我发现偶尔打印错误的答案。例如,如果

WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't', 'u'])

当它应该打印为真时,它打印为假。有人能看出我的代码哪里错了吗?你知道吗


Tags: 函数字符串代码infalse列表returnif
2条回答

一旦你发现一个猜中的字母不在单词中,你就返回False。在你的例子中,第一个字母不在单词中。你知道吗

相反,如果您循环遍历Word,并检查每个字母是否在数组letters中,它就会起作用:

def WordGuessed(Word, letters):
    if letters == []:
        return False
    else:
        for i in Word:
            if i not in letters:
                return False
        else:
            if i == Word[-1]:
                return True

# prints True
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't', 'u']))

# prints False, missing 'u'
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']))

@jonhopkins说得对:与其检查单词是否包含所有猜测的字母,不如检查单词的所有字母是否都是猜测的。你知道吗

但您的代码可以更简洁:

  • 如果需要检查list实例是否为空,只需use negation

  • 如果我们已经到达了for-elseelse块,这意味着我们已经到达了iterable的结尾,而没有returning或breaking,那么不需要额外检查。

所以解决方案可以写成

def WordGuessed(Word, letters):
    if not letters:
        return False
    else:
        for i in Word:
            if i not in letters:
                return False
        else:
            return True

最后,因为我们只需要检查一次字母的外观,所以我们可以使用像^{}s这样的独特的字母集合

def WordGuessed2(Word, letters):
    return set(Word).issubset(set(letters))

试验

>>> word = 'durian'
>>> guessed_letters = ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']
>>> WordGuessed(word, guessed_letters)
False
>>> WordGuessed2(word, guessed_letters)
False
>>> guessed_letters.append('u')
>>> WordGuessed(word, guessed_letters)
True
>>> WordGuessed2(word, guessed_letters)
True

相关问题 更多 >