Ошибка при вводе кода из учебника

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
Буквально пару дней назад начал изучать Python 3 по учебнику Эла Свейгарта "Учим Python, делая крутые игры". Ввожу код и получаю ошибку со скрина. Как я понял, компилятор не нашёл переменной guess, хотя она в коде есть. Как вы думаете, в чём причина ошибки на самом деле?
Problem.png
 

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Выглядит будто там не guess а quess.
 

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Не точь-в-точь, значит.
В ошибке все написано: нельзя делать "+" с интом и строками. guessesTaken - инт, а остальное строки.
f"Я хочу вставить сюда мой инт - {guessesTaken}"

P.S. пользуйся вставкой текста, от скринов никому не легче. Содержимое консоли можно прекрасно выделить и вставить.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ошибка в этом месте:
Python:
else:
    break
нужно или удалить эти строки или обернуть в цикл.
Скорее всего вы неправильно скопировали отступы. Наверно нужно так:

Python:
import random
HANGMAN_PICS = ('''
    +---+
        |
        |
        |
       ===''','''
    +---+
        |
         |
         |
        ===''','''
    +---+
    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 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():
#Эта функция возвращает значение True, если игрок хочет сыграть заново; в противном случае возвращает false
        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('YES! Секретное слово - "' + 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
 

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
Выглядит будто там не guess а quess.

Блин, а ведь правда)) Эту ошибку я исправил, теперь другая появилась:
Problem2.png
Вроде всё точь-в-точь переписываю, а один хрен проблемы.
 

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
ОК, завтра проверю - отпишусь.
 

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
Блин, я слепой. У меня вместо guessesTaken было quessesTaken, поэтому и не работало нормально. Но всё равно спасибо за помощь.
 

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
Приветствую! Пришёл я вновь на этот форум с проблемой:
Python:
import random
HANGMAN_PICS = ('''
    +---+
        |
        |
        |
       ===''','''
    +---+
        |
         |
         |
        ===''','''
    +---+
    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 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():
#Эта функция возвращает значение True, если игрок хочет сыграть заново; в противном случае возвращает false
        print('Хотите сыграть ещё раз?')
        return input().lower().startswith('д')


print('В И С Е Л И Ц А')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
game.IsDone = 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('YES! Секретное слово - "' + 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
При запуске выдаёт ошибку "break" outside loop. С чем это может быть связано и есть в моём коде ещё ошибки?
 

_CoRdycepS_

Новичок
Пользователь
Авг 4, 2020
6
0
1
Убрал я последние две строчки, запускаю, а мне сразу две ошибки выдаёт:

Traceback (most recent call last):
File "C:\Users\Илья Андреевич\Documents\python projects\HANGMAN.py", line 97, in <module>
secretWord = getRandomWord(words)
File "C:\Users\Илья Андреевич\Documents\python projects\HANGMAN.py", line 48, in getRandomWord
return wordList(wordIndex)
TypeError: 'list' object is not callable


Я с такой проблемой не встречался ещё. Насколько я понял не найден объект "list".
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Убрал я последние две строчки, запускаю, а мне сразу две ошибки выдаёт:

Traceback (most recent call last):
File "C:\Users\Илья Андреевич\Documents\python projects\HANGMAN.py", line 97, in <module>
secretWord = getRandomWord(words)
File "C:\Users\Илья Андреевич\Documents\python projects\HANGMAN.py", line 48, in getRandomWord
return wordList(wordIndex)
TypeError: 'list' object is not callable


Я с такой проблемой не встречался ещё. Насколько я понял не найден объект "list".
Выше я вам показал исправленный вариант (правда в нем еще могут быть ошибки).
TypeError: 'list' object is not callable
Эта ошибка происходит потому, что вместо обращения к элементы списка по индексу wordList[wordIndex] у вас в коде написано wordList(wordIndex), то есть вызов функции wordList.
 

Форум IT Специалистов