Не могу определить, почему программа заканчивается раньше - PullRequest
0 голосов
/ 26 февраля 2019

Я работал над этим заданием для курса Python по EdX MIT и решил, что вывод должен отображаться по-другому.Основываясь на моем коде, я думал, что программа задачи завершится, когда угадать = 0. Однако я либо получаю «IndexError: индекс назначения списка вне диапазона», либо программа заканчивается в предположении 2. Это, кажется, зависит от длинысекретного слова.Кто-нибудь может указать мне правильное направление?

def hangman(secretWord):
    '''
    secretWord: string, the secret word to guess.

    Starts up an interactive game of Hangman.

    * At the start of the game, let the user know how many 
      letters the secretWord contains.

    * Ask the user to supply one guess (i.e. letter) per round.

    * The user should receive feedback immediately after each guess 
      about whether their guess appears in the computers word.

    * After each round, you should also display to the user the 
      partially guessed word so far, as well as letters that the 
      user has not yet guessed.

    Follows the other limitations detailed in the problem write-up.
    '''
    trackedguess = []
    letcount = ()
    letterlist = []
    guess = ''
    for i in range(0, (len(secretWord)-1)):
        trackedguess.append('_')
    letcount = len(secretWord)
    guessesleft = 8

    for i in range(0, 7):
        if ''.join(trackedguess) == secretWord:
            print('You win!')
            break
        if guessesleft < 1:
            print('You have 0 guesses remaining.')
            break
        print(trackedguess)
        print("You have ", guessesleft, " guesses remaining.")
        guess = input('Please guess a letter and press return:  ')
        if guess in letterlist:
            print("You've already guessed that.  Try again.")
        else:
            guessesleft -= 1
            letterlist.append(guess)
            for i in range(0, len(secretWord)):
                if secretWord[i] in letterlist:
                    coordinate = i
                    trackedguess[coordinate] = secretWord[i]


hangman(chooseWord(wordlist))

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это очень хорошая попытка, но есть и неправильные вещи.Я попытаюсь пройтись по ним один за другим.

Вместо цикла for я бы предложил использовать while guessesleft>0.В текущей реализации цикл for будет выполняться 8 раз, независимо от того, остались ли какие-либо предположения (например, попробуйте каждый раз указывать одну и ту же букву в качестве предположения).Однако с while вы получаете гораздо больший контроль над циклом.

Поколение trackedguess имеет недостатки.Он всегда будет пропускать последнюю букву secretword (это также причина, по которой вы получили IndexError). Попробуйте вместо нее for i in range(len(secretWord)).Вы также найдете его гораздо более кратким и читабельным.

Я также позволил себе перенести условие победы или проигрыша в петлю.Ранее, если вы выиграли по последнему предположению, вы все равно бы проиграли (потому что условие проверки выигрыша произошло до ввода, а после этого цикл закончился);Кроме того, предположение не было напечатано, если вы выиграли (потому что цикл прерывался перед оператором печати).

Пересмотренный код ниже:

def hangman(secretWord):
'''
secretWord: string, the secret word to guess.

Starts up an interactive game of Hangman.

* At the start of the game, let the user know how many
  letters the secretWord contains.

* Ask the user to supply one guess (i.e. letter) per round.

* The user should receive feedback immediately after each guess
  about whether their guess appears in the computers word.

* After each round, you should also display to the user the
  partially guessed word so far, as well as letters that the
  user has not yet guessed.

Follows the other limitations detailed in the problem write-up.
'''
trackedguess = []
letterlist = []
for i in range(len(secretWord)):
    trackedguess.append('_')
guessesleft = 8

while guessesleft > 0:
    print(trackedguess)
    print("You have ", guessesleft, " guesses remaining.")
    guess = input('Please guess a letter and press return:  ')
    if guess in letterlist:
        print("You've already guessed that.  Try again.")
    else:
        guessesleft -= 1
        letterlist.append(guess)
        for i in range(0, len(secretWord)):
            if secretWord[i] in letterlist:
                coordinate = i
                trackedguess[coordinate] = secretWord[i]
    if ''.join(trackedguess) == secretWord:
        print(trackedguess)
        print('You win!')
        break
    if guessesleft < 1:
        print('You have 0 guesses remaining.')
        break


hangman('test')

Надеюсь, это поможет.

0 голосов
/ 26 февраля 2019

Несколько вещей выделяются для меня:

  1. range использует эксклюзивный конец.Это означает, что range(0, (len(secretWord)-1) будет повторяться один раз меньше , чем длина secretWord.Вы хотите, чтобы длины совпадали.Более простые и менее подверженные ошибкам подходы были бы просто: trackedGuess = ['_'] * len(secretWord) или trackedGuess = list('_' * len(secretWord)).

  2. Вы должны проверить свои предположения.Например, описанный выше случай мог бы быть легко обнаружен, если бы вы assert(len(trackedGuess) == len(secretWord)).

  3. for i in range(0, 7) страдали той же проблемой, что и ваше предыдущее использование range().Если вы хотите повторить 8 (guessesleft) раз, то вам следует использовать range(0, 8).Тем не менее, вы также уменьшаете guessesleft внутри цикла и выходите, когда он достигает 0. Делайте одно или другое, но не оба.Как ваш код в настоящее время, если кто-то вводит предположение, что он уже сделал, он будет рассчитывать одну итерацию против него (что я не уверен, что вы хотите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...