【问题标题】:Storing the guessed word in Hangman game在 Hangman 游戏中存储猜出的单词
【发布时间】:2017-07-12 19:33:06
【问题描述】:

我如何存储来自 hangman 函数的用户输入,所以每次 for 循环运行时它都会记住用户已经猜到了字母。

hangman 函数第一次运行时,如果用户的输入是“gera”,那没关系,然后它应该循环返回进行第五次猜测;问题是如果用户现在输入'mo',它不会像这样显示gera _ mo,而是会打印_ _ _ _ _ mo;忘记用户之前的“gera”输入。 如何存储过去的输入,以便代码回忆传递的内容?

def get_guessed_word(secret_word, letters_guessed):

    a = ""
    for char1 in secret_word:
        if char1 in letters_guessed:
                a += char1
        else: 
                a += "_ "

    print(a)







def get_available_letters(letters_guessed):

    a = string.ascii_lowercase
    for char1 in a:
        if char1 in letters_guessed:
           a = a.replace(char1,"")


    print(a)




def hangman(secret_word_user_to_guess):

    secret_word_user_to_guess = 'geranimo'

    for index in range(6,1,-1):
        print('You have', index,'guesses left.')
        #print('Available letters: abcdefghijklmnopqrstuvwxyz')
        letters_guessed = input('Check a word: ')
        get_guessed_word(secret_word_user_to_guess, letters_guessed)
        print('Available letters:')
        get_available_letters(letters_guessed)

【问题讨论】:

  • 我会用一组来猜测
  • 这个问题太不清楚了......标题说“用下划线替换猜测的单词。”但示例显示字母被替换而不是整个单词。甚至这个例子本身也令人困惑:'apple' -> '_ pp_ e' 为什么_e 之间有一个空格,为什么e 没有被替换?不是在猜字母列表中吗?

标签: python


【解决方案1】:

您可以轻松做到这一点:

result = ""
for char in secret_word:
    if char in letters_guessed:
        result += char
    else:
        result += "_"

或者,使用生成器:

result = "".join(char if char in letters_guessed else "_" for char in secret_word)

顺便说一句,letters_guessed 可以是一个字符串 ("eikprs"),或者,如果顺序无关紧要,setset("eikprs")


你也可以试试这个:

result = secret_word.translate("".maketrans(letters_guessed, "_" * len(letters_guessed)))

【讨论】:

    【解决方案2】:

    有几种方法可以解决它,就像已经提到的 ForceBru。但是要按照 cmets 中的建议添加一个集合:

    def g(secret_word, letters_guessed):
        letters = set(secret_word)
        guess = set(letters_guessed)
        for i in letters.difference(guess):
            secret_word=secret_word.replace(i,'_')
        print(secret_word)
    
    secret_word = 'apple'
    letters_guessed = ['e', 'i', 'k', 'p', 'r', 's']
    print(g(secret_word, letters_guessed) ) #prints '_pp_e'
    

    【讨论】:

      【解决方案3】:

      让我们看看你的函数,因为有一个你似乎没有的概念:

      def g(secret_word, letters_guessed):
          a = []
          for char1 in secret_word:    
              for thing in letters_guessed:
                  if thing == char1:            
                      a += thing
                      break
                  elif thing != char1:
                      a[secret_word.index(char1)] == '_ '
                      break
      

      for char1 in secret_word: 行遍历单词,将每个字符依次拉入char。这没有什么问题,几乎每个解决方案都必须使用它。

      接下来,您执行for thing in letters_guessed:。正如@ForceBru 指出的那样,这存在一个问题,因为Python 提供了in and not in operators 来完成您尝试手动编写的代码。

      但是,当您刚刚开始时,可​​以重新发明轮子几次。如果不出意外,它可以帮助您了解幕后发生的事情。

      我认为你错过或误解的事情是:当你拥有char1 == thing 时,你知道一些东西。你绝对可以说“是的,这封信已经被猜到了”,然后你就可以继续展示这封信了。

      但是当那个条件不正确 - 当char1 != thing - 你什么都不知道。你不能简单地说“哦,如果那不是真的,那就画一个下划线”,因为你还没有完成检查!

      请记住,for thing in letters_guessed: 循环正在检查每个已猜到的字母。这意味着即使 letters_guessed 中的这个特定字符可能与单词中的当前字符不匹配,也有可能其他字符 匹配,因此您必须继续循环。

      类似这样的:

      for char1 in secret_word:
          for thing in letters_guessed:
              if thing == char1:
                  a += thing
                  break
          else: # 'else' after for means 'if no break command was run'
              a += '_'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多