Hangman游戏,但我在列表功能上有问题

2024-05-14 03:52:18 发布

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

我目前正在做麻省理工学院关于Python的开放式课件,其中一个作业是做一个刽子手游戏。
大多数函数我都做得很好,但我遇到的问题是在这两个函数中:

def get_guessed_word(secret_word, letters_guessed):
    lengthOf = len(secret_word)

    listLength = ["_ "] *lengthOf

    for i,char in enumerate(secret_word):
        if char == letters_guessed:
            listLength[i]=char+" "
            listCopy = listLength[:]
            print(list)

def get_available_letters(letters_guessed):
    alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

    for i, char in enumerate(alphabet):
        if char == letters_guessed:
            alphabet[i]="_"
            alphabetCopy = alphabet[:]
            print(alphabetCopy)
            break

问题是,每次我遍历函数时,字母表都会重置,我试图通过创建一个副本来解决这个问题,但我意识到,即使在实现它之前,解决方案也确实不起作用,因为每次调用函数时,listCopy和alphabetCopy都只会复制“零状态”

我知道我可以做其他的解决方案,但我特别想要这种“用户体验”。我试过其他的解决办法,但我现在就是想不出来


Tags: 函数inforgetsecretdefwordchar
2条回答

获取可用的信件

所以你有一个已经猜到的字母列表,你想知道,剩下的字母是什么。 最简单的方法是使用sets

def get_available_letters(guessed_letters):
   alphabet = set(map(chr, range(97, 123))) # Same list like you but shorter version
   return sorted(alphabet - set(guessed_letters))

它的作用是:

>>>get_available_letters(['a', 'e', 'f'])
['b', 'c', 'd', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

猜词

def get_guessed_word(secret_word, letters_guessed):
   guessed_word = ["_"] * len(secret_word)
   for i, letter in enumerate(secret_word):
      if letter in letters_guessed: # Changed == to in
         guessed_word[i] = letter # Don't break after a letter was found and no copy necessary
   return "".join(guessed_word)
>>>get_guessed_word("Hello", ["e", "o"])
'_e__o'

我假设变量字母_guessed是一个包含所有已猜测字母的列表或集合

在这种情况下,您可以使用:

def GetGuessedWord(SecretWord, GuessedLetters):    
    Ln = len(SecretWord)
    DisplayList = ["_ "]*Ln

    for i, char in enumerate(SecretWord):
        if char in GuessedLetters:          # This will check if char is present in the list
            DisplayList[i] = char + " "
    print(DisplayList)

def GetAvailableLetters(GuessedLetters):
    Letters = "abcdefghijlkmnopqrstuvwxyz"
    DisplayList = [L for L in Letters]      # Converts it into a list of smaller strings, 1 letter each

    for i, char in enumerate(DisplayList):
        if char in GuessedLetters:
            DisplayList[i] = "_"
    print(DisplayList)
>>> GetGuessedWord("overgrown", ['o'])
['o ', '_ ', '_ ', '_ ', '_ ', '_ ', 'o ', '_ ', '_ ']
>>> GetGuessedWord("overgrown", ['o', 'e', 'r'])
['o ', '_ ', 'e ', 'r ', '_ ', 'r ', 'o ', '_ ', '_ ']
>>> GetGuessedWord("overgrown", ['o','e','r','z'])
['o ', '_ ', 'e ', 'r ', '_ ', 'r ', 'o ', '_ ', '_ ']


>>> GetAvailableLetters(['o'])
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'k', 'm', 'n', '_', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> GetAvailableLetters(['o', 'e', 'r'])
['a', 'b', 'c', 'd', '_', 'f', 'g', 'h', 'i', 'j', 'l', 'k', 'm', 'n', '_', 'p', 'q', '_', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> GetAvailableLetters(['o', 'e', 'r', 'z'])
['a', 'b', 'c', 'd', '_', 'f', 'g', 'h', 'i', 'j', 'l', 'k', 'm', 'n', '_', 'p', 'q', '_', 's', 't', 'u', 'v', 'w', 'x', 'y', '_']

如果要比较的对象具有相同的值,“==”运算符将返回true。它将返回false,因为一个是字符串,另一个是列表,因此不能有相同的值

如果左侧的输入存在于右侧的输入中,则“in”运算符返回true

然而

如果你一次猜一个字母,那么你需要你的函数在外面的变量上留下永久性的修改。所以变量alphabet不能在get\u available\u letters中声明,但必须在主代码中声明,并作为输入传递给函数get\u available\u letters。如果字母_guessed是一个1个字母长的字符串,则应该修复此函数。现在可以使用“==”运算符

def get_available_letters(letters_guessed, alphabet):
    for i, char in enumerate(alphabet):
        if char == letters_guessed:
            alphabet[i]="_"               # This line will permanently change the variable alphabet
            alphabetCopy = alphabet[:]    # Not useful, u may as well print the original
            print(alphabetCopy)
            break
>>> alphabet = [L for L in 'abcdefghijklmnopqrstuvwxyz']; print(alphabet)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

>>> get_available_letters("o", alphabet)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '_', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> get_available_letters("e", alphabet)
['a', 'b', 'c', 'd', '_', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '_', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> get_available_letters("r", alphabet)
['a', 'b', 'c', 'd', '_', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '_', 'p', 'q', '_', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> get_available_letters("z", alphabet)
['a', 'b', 'c', 'd', '_', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '_', 'p', 'q', '_', 's', 't', 'u', 'v', 'w', 'x', 'y', '_']

对于另一个函数,需要在外部声明变量listLength并将其传递给该函数

def get_guessed_word(secret_word, letters_guessed, listLength):
    for i,char in enumerate(secret_word):
        if char == letters_guessed:
            listLength[i]=char+" "                # Permanently modifies listLength, not breaking since multiple same letters can occur in the same word
listCopy = listLength[:]
print(listCopy)
>>> secret_word = "overgrown"
>>> listLength = ["_ "]*len(secret_word); print(listLength)
['_ ', '_ ', '_ ', '_ ', '_ ', '_ ', '_ ', '_ ', '_ ']

>>> get_guessed_word(secret_word, "o", listLength)
['o ', '_ ', '_ ', '_ ', '_ ', '_ ', 'o ', '_ ', '_ ']
>>> get_guessed_word(secret_word, "e", listLength)
['o ', '_ ', 'e ', '_ ', '_ ', '_ ', 'o ', '_ ', '_ ']
>>> get_guessed_word(secret_word, "r", listLength)
['o ', '_ ', 'e ', 'r ', '_ ', 'r ', 'o ', '_ ', '_ ']
>>> get_guessed_word(secret_word, "z", listLength)
['o ', '_ ', 'e ', 'r ', '_ ', 'r ', 'o ', '_ ', '_ ']

并在需要修改数组而不影响原始数组时复制数组

相关问题 更多 >