繁体   English   中英

我对这个刽子手程序有点麻烦。 有人可以帮我弄清楚吗?

[英]I am having a bit of trouble with this hangman program. Can someone help me figure it out?

wanttodo = input('Type 1 if you want rules and 2 if you want to start and 3 if you want to end the program')

while wanttodo!='3':
  if wanttodo == '1':
    print('Player 1 picks a word (cannot include spaces or dashes) and player two goes guessing letters until the word is complete. You have six chances to get the letters wrong. Player one wins if player 2 doesnt guess it and player 2 wins if he does guess it.')
  elif wanttodo=='2': 
    word = str(input('Player 1: What is your word?'))
    word = word.lower()
    wordlong = len(word)
    rightanswer = False
    lives = 6
    lettersinword = -1

    guessed_letters = list()
    nooflettersguessed = len(guessed_letters)
    for x in range (100):
      print('')
    spaces = ('_ '*wordlong)
    print(spaces)
    while lives>0 and rightanswer == False:
      letterguessed = input('Pick a letter. Must not be picked yet.')
      letterguessed = letterguessed.lower()
      if len(letterguessed)!=1 or not letterguessed.isalpha():
        print('Your guess is not valid. Try again.')
      elif letterguessed in guessed_letters:
        print('Your pick has already been chosen. You have not lost a live. Guess again') 
      else:
        print('You picked a valid and new letter.')
        if letterguessed not in word:
          print(letterguessed + ' is not in the word.')
          lives-=1
        elif letterguessed in word:
          print('Lovely! ' + letterguessed + ' is in the word.')
          for letter in word:
            lettersinword+=1
            if letter == letterguessed:
              listspaces = list(spaces)
              listspaces[lettersinword] = letterguessed
              spaces = ''.join(listspaces)
        print(spaces)

        guessed_letters.append(letterguessed)
        print(guessed_letters)

当我输入 hello 作为我的单词时,它会正确输入,当我输入第一个字母 hello 时,它会将第一个下划线切换为“h”。 但是当我输入“e”时,它会放错位置,当我输入“l”时,它会给我一个错误。 有人可以告诉我问题是什么吗?

您描述的问题在代码的这一部分中:

lettersinword = -1
while lives>0 and rightanswer == False:
    ...
    for letter in word:
        lettersinword+=1
        if letter == letterguessed:
            listspaces = list(spaces)
            listspaces[lettersinword] = letterguessed
            spaces = ''.join(listspaces)

当你在 'hello' 中输入 'h' 时, lettersinword变为4 (因为在 'hello' 中每个字母都加1 ),所以当你再输入 'e' 时6当语句lettersinword listspaces[lettersinword] = letterguessed已运行。 您需要在每个 for 循环之前重置lettersinword

while lives>0 and rightanswer == False:
    ...
    lettersinword = -1
    for letter in word:
        lettersinword+=1
        if letter == letterguessed:
            listspaces = list(spaces)
            listspaces[lettersinword] = letterguessed
            spaces = ''.join(listspaces)

还有另一个需要修复的错误: spaces"h _ _ _ _ " ,所以listspaces变成['h', ' ', '_', ' ', '_', ' ', '_', ' ', '_', ' '] 输入 'e' 时, lettersinword现在是1 ,因此listspaces变为['h', 'e', '_', ' ', '_', ' ', '_', ' ', '_', ' '] ,空格变成"he_ _ _ _ " ,而不是"he _ _ _ " 一个快速的解决方法是将增量更改为2

lettersinword = -2
for letter in word:
    lettersinword+=2
    if letter == letterguessed:
        listspaces = list(spaces)
        listspaces[lettersinword] = letterguessed
        spaces = ''.join(listspaces)

但是,我建议将列表空间listspaces为您的字母/下划线列表,没有空格分隔它们,并在每次要打印时从该列表创建字符串。 由于listspaces空间在字母之间不再有多余的空格,因此计数器每次迭代都可以增加1而不是2 此外,每次迭代列表并每次迭代递增计数器时,最好使用内置的enumerate 这是具有这些更改的版本:

wanttodo = input('Type 1 if you want rules and 2 if you want to start and 3 if you want to end the program')

while wanttodo != '3':
    if wanttodo == '1':
        print(
            'Player 1 picks a word (cannot include spaces or dashes) and player two goes guessing letters until the word is complete. You have six chances to get the letters wrong. Player one wins if player 2 doesnt guess it and player 2 wins if he does guess it.')
    elif wanttodo == '2':
        word = str(input('Player 1: What is your word?'))
        word = word.lower()
        wordlong = len(word)
        rightanswer = False
        lives = 6

        guessed_letters = list()
        nooflettersguessed = len(guessed_letters)
        for x in range(100):
            print('')
        listspaces = ['_'] * wordlong
        print(' '.join(listspaces))  # replacing: print(spaces)
        while lives > 0 and rightanswer == False:
            letterguessed = input('Pick a letter. Must not be picked yet.')
            letterguessed = letterguessed.lower()
            if len(letterguessed) != 1 or not letterguessed.isalpha():
                print('Your guess is not valid. Try again.')
            elif letterguessed in guessed_letters:
                print('Your pick has already been chosen. You have not lost a live. Guess again')
            else:
                print('You picked a valid and new letter.')
                if letterguessed not in word:
                    print(letterguessed + ' is not in the word.')
                    lives -= 1
                elif letterguessed in word:
                    print('Lovely! ' + letterguessed + ' is in the word.')
                    for lettersinword, letter in enumerate(word):
                        if letter == letterguessed:
                            listspaces[lettersinword] = letterguessed
                            spaces = ''.join(listspaces)
                print(' '.join(listspaces))  # replacing: print(spaces)

                guessed_letters.append(letterguessed)
                print(guessed_letters)

PS:在 Python 中,我们通常使用“蛇形大小写”来表示变量(和函数)名称,例如letters_guessed而不是lettersguessed 这正是社区习惯阅读的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM