Баг в игре из учебника?

В книге "Изучаем Python делая крутые игры" встречается вот такая игра Виселица. При запуске всплыл баг - если правильно угадать первую букву из искомого слова, то программа срузу выводит сообщение о победе, хотя остальные буквы не отгаданы. При этом сообщение начать заново появляется только после ещё одной итерации угадывания Я знаю, что это связано как-то с циклом for на 102 строке, но ещё не могу разобраться почему так. Плиз, помогите!

import random
HANGMAN_PICS = ['''
   +---+
       |
       |
       |
      ===''', '''
   +---+
   0   |
       |
       |
      ===''', '''
   +---+
   0   |
   |   |
       |
      ===''', '''
   +---+
   0   |
  /|   |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
  /    |
      ===''', '''
  +---+
   0   |
  /|\  |
  / \   |
      ===''']
words = 'аист акула бабуин баран барсук бобр бык верблюд волк воробей ворона выдра голубь гусь жаба зебра змея  индюк кит кобра коза козел койот корова кошка кролик крыса курица лама ласка лебедь лев лиса лосось лось лягушка медведь моллюск моль мул муравей мышь норка носорог обезьяна овца окунь олень орел осел панда паук питон попугай пума скунс собака сова тигр тритон тюлень утка форель хорек черепаха ястреб ящерица'.split()

def getRandomWord(wordList):
    #
    wordIndex = random.randint(0, len(wordList) - 1)
    return wordList[wordIndex]

def displayBoard(missedLetters, correctLetters, secretWord):
    print(HANGMAN_PICS[len(missedLetters)])
    print()

    print('Ошибочные буквы:', end=' ')
    for letter in missedLetters:
        print(letter, end=' ')
    print()

    blanks = '_' * len(secretWord)

    for i in range(len(secretWord)):
        if secretWord[i] in correctLetters:
            blanks = blanks[:i] + secretWord[i] + blanks[i+1:]

    for letter in blanks:
        print(letter, end=' ')
    print()

def getGuess(alreadyGuessed):
    #
    while True:
        print('Введите букву.')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
            print('Пожалуйста введите одну букву.')
        elif guess in alreadyGuessed:
            print('Вы уже называли эту букву. Назовите другую.')
        elif guess not in 'йцукенгшщзхъфывапролджэячсмитьбю':
            print('пожалуйста введите БУКВУ.')
        else:
            return guess

def playAgain():
    #
    print('Сыграть ещё? (да или нет)')
    return input().lower().startswith('д')


print('В И С Е Л И Ц А')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
gameIsDone = False

while True:
    displayBoard(missedLetters, correctLetters, secretWord)

    #
    guess = getGuess(missedLetters + correctLetters)

    if guess in secretWord:
        correctLetters = correctLetters + guess

        #
        foundAllLetters = True
        for i in range(len(secretWord)):
            if secretWord[i] not in correctLetters:
                foundAllLetters = False
                break
            if foundAllLetters:
                print('ДА! Секретное слово - "' + secretWord + '!" Вы угадали!')
                gameIsDone = True
    else:
        missedLetters = missedLetters + guess

        #
        if len(missedLetters) == len(HANGMAN_PICS) - 1:
            displayBoard(missedLetters,correctLetters, secretWord)
            print('Вы исчерпали все попытки!\nНеугаданобукв:'+str(len(missedLetters))+'иугаданобукв:'+str(len(correctLetters))+'Былозагаданослово"'+secretWord+'".')
            gameIsDone = True

            #Проверяет
        if gameIsDone:
            if playAgain():
                missedLetters = ''
                correctLetters = ''
                gameIsDone = False
                secretWord = getRandomWord(words)
            else:
                break

Ответы (2 шт):

Автор решения: alex

LEGI43ON, у вас абсолютно рабочий код. В вашем примере ошибка в отступе. Эта ошибка связана с тем, что сначала в цикле мы перебираем все буквы, а уже потом проверяем, угадано слово или нет.

В результате, я взял ваш код и условие проверки ( там где написано ДА! ) немного подвинул налево ( на один пролёт ) и всё волшебным образом заработало. Привожу рабочий код полностью:

import random
HANGMAN_PICS = ['''
   +---+
       |
       |
       |
      ===''', '''
   +---+
   0   |
       |
       |
      ===''', '''
   +---+
   0   |
   |   |
       |
      ===''', '''
   +---+
   0   |
  /|   |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
  /    |
      ===''', '''
  +---+
   0   |
  /|\  |
  / \   |
      ===''']
words = 'аист акула бабуин баран барсук бобр бык верблюд волк воробей ворона выдра голубь гусь жаба зебра змея  индюк кит кобра коза козел койот корова кошка кролик крыса курица лама ласка лебедь лев лиса лосось лось лягушка медведь моллюск моль мул муравей мышь норка носорог обезьяна овца окунь олень орел осел панда паук питон попугай пума скунс собака сова тигр тритон тюлень утка форель хорек черепаха ястреб ящерица'.split()

def getRandomWord(wordList):
    #
    wordIndex = random.randint(0, len(wordList) - 1)
    return wordList[wordIndex]

def displayBoard(missedLetters, correctLetters, secretWord):
    print(HANGMAN_PICS[len(missedLetters)])
    print()

    print('Ошибочные буквы:', end=' ')
    for letter in missedLetters:
        print(letter, end=' ')
    print()

    blanks = '_' * len(secretWord)

    for i in range(len(secretWord)):
        if secretWord[i] in correctLetters:
            blanks = blanks[:i] + secretWord[i] + blanks[i+1:]

    for letter in blanks:
        print(letter, end=' ')
    print()

def getGuess(alreadyGuessed):
    #
    while True:
        print('Введите букву.')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
            print('Пожалуйста введите одну букву.')
        elif guess in alreadyGuessed:
            print('Вы уже называли эту букву. Назовите другую.')
        elif guess not in 'йцукенгшщзхъфывапролджэячсмитьбю':
            print('пожалуйста введите БУКВУ.')
        else:
            return guess

def playAgain():
    #
    print('Сыграть ещё? (да или нет)')
    return input().lower().startswith('д')


print('В И С Е Л И Ц А')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
gameIsDone = False

while True:
    displayBoard(missedLetters, correctLetters, secretWord)

    #
    guess = getGuess(missedLetters + correctLetters)

    if guess in secretWord:
        correctLetters = correctLetters + guess

        #
        foundAllLetters = True
        for i in range(len(secretWord)):
            if secretWord[i] not in correctLetters:
                foundAllLetters = False
                break
            # было тут
        # а теперь я немного сдвинул это условие левее 
        if foundAllLetters:
            print('ДА! Секретное слово - "' + secretWord + '!" Вы угадали!')
            gameIsDone = True
    else:
        missedLetters = missedLetters + guess

        #
        if len(missedLetters) == len(HANGMAN_PICS) - 1:
            displayBoard(missedLetters,correctLetters, secretWord)
            print('Вы исчерпали все попытки!\nНеугаданобукв:'+str(len(missedLetters))+'иугаданобукв:'+str(len(correctLetters))+'Былозагаданослово"'+secretWord+'".')
            gameIsDone = True

            #Проверяет
        if gameIsDone:
            if playAgain():
                missedLetters = ''
                correctLetters = ''
                gameIsDone = False
                secretWord = getRandomWord(words)
            else:
                break

'''
LEGI43ON
'''
→ Ссылка
Автор решения: akmast16

Как сказал @alex, проблема была в отступе. Но ещё была проблема:

При этом сообщение начать заново появляется только после ещё одной итерации угадывания - @LEGI43ON

Я её исправил путём перемещения и модификации условия if gameIsDone: Исправленный код оставил ниже, а я вам посоветовал бы выбрать другой самоучитель по Python (вот аргумент за: https://www.litres.ru/el-sveygart/uchim-python-delaya-krutye-igry-33399590/otzivi/)

import random
HANGMAN_PICS = ['''
   +---+
       |
       |
       |
      ===''', '''
   +---+
   0   |
       |
       |
      ===''', '''
   +---+
   0   |
   |   |
       |
      ===''', '''
   +---+
   0   |
  /|   |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
       |
      ===''', '''
   +---+
   0   |
  /|\  |
  /    |
      ===''', '''
  +---+
   0   |
  /|\  |
  / \   |
      ===''']
words = 'аист акула бабуин баран барсук бобр бык верблюд волк воробей ворона выдра голубь гусь жаба зебра змея индюк кит кобра коза козел койот корова кошка кролик крыса курица лама ласка лебедь лев лиса лосось лось лягушка медведь моллюск моль мул муравей мышь норка носорог обезьяна овца окунь олень орел осел панда паук питон попугай пума скунс собака сова тигр тритон тюлень утка форель хорек черепаха ястреб ящерица'.split()

def getRandomWord(wordList):
    #
    wordIndex = random.randint(0, len(wordList) - 1)
    return wordList[wordIndex]

def displayBoard(missedLetters, correctLetters, secretWord):
    print(HANGMAN_PICS[len(missedLetters)])
    print()

    print('Ошибочные буквы:', end=' ')
    for letter in missedLetters:
        print(letter, end=' ')
    print()

    blanks = '_' * len(secretWord)

    for i in range(len(secretWord)):
        if secretWord[i] in correctLetters:
            blanks = blanks[:i] + secretWord[i] + blanks[i+1:]

    for letter in blanks:
        print(letter, end=' ')
    print()

def getGuess(alreadyGuessed):
    #
    while True:
        print('Введите букву.')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
            print('Пожалуйста введите одну букву.')
        elif guess in alreadyGuessed:
            print('Вы уже называли эту букву. Назовите другую.')
        elif guess not in 'йцукенгшщзхъфывапролджэячсмитьбю':
            print('пожалуйста введите БУКВУ.')
        else:
            return guess

def playAgain():
    #
    print('Сыграть ещё? (да или нет)')
    return input().lower().startswith('д')

print('В И С Е Л И Ц А')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
gameIsDone = False

while True:
    #То самое условие
    if gameIsDone:
        if playAgain():
            missedLetters = ''
            correctLetters = ''
            gameIsDone = False
            secretWord = getRandomWord(words)
            continue
        else:
            break

    displayBoard(missedLetters, correctLetters, secretWord)
    #
    guess = getGuess(missedLetters + correctLetters)

    if guess in secretWord and not gameIsDone:
        correctLetters = correctLetters + guess

        #
        foundAllLetters = True
        for i in range(len(secretWord)):
            if secretWord[i] not in correctLetters:
                foundAllLetters = False
                break

        if foundAllLetters:
            print('ДА! Секретное слово - "' + secretWord + '!" Вы угадали!')
            gameIsDone = True
    else:
        missedLetters = missedLetters + guess
        #
        if len(missedLetters) == len(HANGMAN_PICS) - 1:
            displayBoard(missedLetters,correctLetters, secretWord)
            print('Вы исчерпали все попытки!\nНеугаданобукв:'+str(len(missedLetters))+'иугаданобукв:'+str(len(correctLetters))+'Былозагаданослово"'+secretWord+'".')
            gameIsDone = True
→ Ссылка