【问题标题】:Hangman program, running into problems updating outputHangman 程序,在更新输出时遇到问题
【发布时间】:2018-12-21 02:50:38
【问题描述】:

所以我正在尝试制作一个小刽子手风格的程序,但在保存正确猜测时遇到了问题。

到目前为止,我已经达到了第一个正确猜测在需要的地方输出字母的地步,例如,如果正确的字母是:

_ _ _ a _ _

但是,每当我进行第二次猜测时,即使正确,它也只会打印出正确的猜测并忘记过去的正确猜测。例如,如果 b 在第二次猜测中是正确的字母:

_ _ b _ _ _

这是我的代码

for letter in range(len_word):
    print('_', end=" ")


guess = input("The length of the word is " + str(len_word) + ". Guess a letter, or ask for a vowel ... ")

while wrong_guesses < 6:
    if guess in letters_in_word:
        for letter in range(len(given_word)):
            if given_word[letter:letter+1] == guess:
                print(guess, end=" ")
            else:
                print('_', end=" ")
        guess = input("The length of the word is " + str(len_word) + ". Guess a letter, or ask for a vowel ... ")
    else:
        wrong_guesses -= 1
        print("Your guess is not in the word, you have " + str(wrong_guesses) + " left.")
        guess = input("The length of the word is " + str(len_word) + ". Guess a letter, or ask for a vowel ... ")

我想要的是,如果在我的第一次猜测中我得到一个正确的答案,并且它输出了

_ _ _ a _ _

如果我的下一个猜测不正确,我希望打印出来

_ _ _ a _ _

【问题讨论】:

  • 首先,请缩进您的代码。
  • 由于wrong_guesses是剩下的猜测次数,所以循环条件应该是while wrong_guesses &gt; 0:

标签: python python-3.x


【解决方案1】:

主要问题是您如何跟踪刽子手。现在,每次他们猜对了,你就是在打印空白并显示正确的字母。有许多方法可以跟踪猜测。考虑使用一个字符列表并在他们每次正确猜测时更新它:

scoreboard = [_] * len_word

while incorrect_guesses < 6:
// get the guess
    any_correct = None
    for index, char in enumerate(hangman_word):
        if guess == char:
            scoreboard[index] = guess
            any_correct = True
    print(scoreboard)
    if not any_correct
        print("wrong guess message")
        incorrect_guess += 1

这个想法是有一个字符串是真实的单词和一个列表,这是你向用户显示的内容。 index, char 只允许您浏览实际单词并跟踪您在真实字符串中查看的字符以及它在字符串中的位置。

(您希望使用列表而不是字符串作为答案,因为字符串是不可变的,而且您实际上对可变性非常投入——这使得列表成为完美的候选者。)

【讨论】:

    【解决方案2】:

    你可以将guess_string初始化为

    guess_string='_'*len_word
    

    如果猜测是正确的guess_string = guess_string[:letter] + guess + guess_string[letter+1:],那么你可以只做print(guess_string),而不是逐个字符地打印出来,并检查这个词是否被完全猜到只需检查if '_' in guess_string

    【讨论】:

    • 字符串在 Python 中是不可变的,所以如果你真的尝试guess_string[letter]=guess 你会得到一个错误。
    • 你是对的,所以 guess_string = guess_string[:letter] + guess + guess_string[letter+1:] 应该可以工作
    • 嗯,是的,但前提是您对字符串投入了大量资金(最好只使用可变类型而不是一遍又一遍地复制字符串)。
    【解决方案3】:

    在您的代码中

    if given_word[letter:letter + 1] == guess:
        print(guess, end=" ")
    else:
        print('_', end=" ")
    

    不存在存储已经猜到的字母的实现。

    【讨论】:

      【解决方案4】:

      我认为使用字典作为翻译表可能会非常可爱。当您正确猜测一个字母时,您不必遍历输出字符串中的字符来显示新字母。相反,您只需使用最新的翻译表打印翻译后的输出字符串。最初,翻译表(字典)将原始单词中的所有字母映射到“_”。每当您做出正确猜测时,字典都会更新,并且该字符的映射也会更改。

      注意,我的例子是区分大小写的,尽管让它不区分大小写并不需要太多。它还将元音视为辅音(从某种意义上说,您不“购买”字母,您只是进行猜测)——这只是我能想到的最天真的实现。

      word = "foobar"
      
      max_incorrect_guesses = 3
      incorrect_guesses = 0
      
      hidden_char = "_"
      
      translation = str.maketrans(word, hidden_char * len(word))
      
      while ord(hidden_char) in translation.values():
          if incorrect_guesses == max_incorrect_guesses:
              print("You've failed to guess the word.")
              break
      
          print(f"Revealed so far: {word.translate(translation)}")
          guess = input("Enter a guess: ")
          if len(guess) == 1 and guess in word:
              print("Correct!\n")
              translation.update({ord(guess) : ord(guess)})
          else:
              print("Incorrect.\n")
              incorrect_guesses = incorrect_guesses + 1
      else:
          print(f"Good job! the word was \"{word}\".")
      

      【讨论】:

        猜你喜欢
        • 2022-01-08
        • 2020-11-29
        • 2020-11-10
        • 1970-01-01
        • 2019-11-13
        • 2021-04-07
        • 1970-01-01
        • 2012-04-06
        • 2019-07-22
        相关资源
        最近更新 更多