Найти - Пользователи
Полная версия: 'Ошибка: NoneType' object has no attribute 'enter'
Начало » Python для новичков » 'Ошибка: NoneType' object has no attribute 'enter'
1
Ruslan_Nali
Всем привет. При прохождении игры выходит ошибка:
(код игры также есть в прикрепленных файлах)

Traceback (most recent call last):
File “CUsers/Aser/Ruslan/Holy Grail.py”, line 263, in <module>
a_game.play()
File “CUsers/Aser/Ruslan/Holy Grail.py”, line 22, in play
next_scene_name = current_scene.enter()
AttributeError: ‘NoneType’ object has no attribute ‘enter’

Укажите пожалуйста, что я упустил? И как исправить данную ошибку.
Заранее огромное спасибо!

 from sys import exit
from textwrap import dedent
from random import randint
class Scene(object):
    def enter(self):
        print("Эта сцена еще не настроена")
        print("Создайте подкласс и реализуйте функцию enter().")
        exit(1)
class Engine(object):
    def __init__(self, notebook):
        self.notebook = notebook
    def play(self):
        current_scene = self.notebook.opening_scene()
        last_scene = self.notebook.next_scene('finished')
        while current_scene != last_scene:
            next_scene_name = current_scene.enter()
            current_scene = self.notebook.next_scene(next_scene_name)
        # не забываем вывести последнюю сцену
        current_scene.enter()
class Death(Scene):
    quips = [
        "Вы погибли. Это печально. Попробуйте пройти испытания еще раз.",
        "Вы исчерпали лимит попыток и вы больше не жилец.",
        "А вы думали что все так просто? Нет и к вашему сведению - вы погибли",
        "Вы пополнили список тех, кто пал в поисках священного грааля.",
        "Видимо вы не достойны священного грааля, поэтому вы мертвы."
    ]
    def enter(self):
        print(Death.quips[randint(0, len(self.quips)-1)])
        exit(1)
class TempleEntrance(Scene):
    def enter(self):
        print(dedent("""
            Вы археолог. В африканских джунглях вам удалось найти то, за чем вы и отправились а Африку.
            По записям, что достались вам от вашего пра-пра дедушки вы нашли храм африканского бога 
            "Мулунгу".
            Также из записей вам известно, что там есть священный грааль. Но для того, чтобы до него 
            добраться
            вам придется пройти через три зала этого храма. Зал земли, зал воды и зал жизни.
            В последнем и находиться священный грааль, который всю жизнь искал ваш пра-пра дедушка.
            И вот вы добрались по карте до священного храма и стоите незаметно у его входа и перед вами 
            задача:
            вход в храм охраняют два стража, для того,чтобы войти вы можете:
                1) отвлечь стражей
                2) убить стражей
                3) попросить войти
            """))
        action = input("Ваш ответ: ")
        if action == "отвлечь стражей":
            print(dedent("""
            Вы делаете отвлекающий манёвр с помощью ваших инструментов и стража на короткое время 
            отошла от входа, чем вы успешно воспользовались.
            Поздравляю, вам удалось обхитрить стражей и вы вошли в священный храм, в зал земли.   
            """))
            return 'hall_of_earth'
        elif action == "убить стражей":
            print(dedent("""
                Вы попытались вступить в схватку со стражами, но они ваc победеили.
                """))
            return 'death'
        elif action == "попросить войти":
            print(dedent("""
                Вы вышли из укрытия и как только вас заметили стражи, они взяли и связали вас.
                """))
            return 'death'
        else:
            print("Так нельзя поступить!")
            return 'temple_entrance'
class HallOfEarth(Scene):
    def enter(self):
        print(dedent("""
            Осмотрев зал земли, вы находите дверь в следующий зал и для того, чтобы войти вам нужно
            отгадать загадку которая написана на двери древними африканскими иероглифами.
            У вас есть три попытки, иначе стены начнут сдвигаться и вы умрете.
            Загадка: СКАЖЕШЬ "НЕ ПРИХОДИ!" - ВСЕ РАВНО ПРИХОДИТ. СКАЖЕШЬ "НЕ УХОДИ!" - ВСЕ РАВНО 
            УХОДИТ.
            Что это? 
            """)) #время
        answer = input("Ваш ответ: ")
        answers = 0
        while answer != "время" and answers < 2:
            print("Неверно, попробуйте еще раз.")
            answers += 1
            answer = input("Ваш ответ: ")
        if answer == "время":
            print(dedent("""
                Вы молодец! Дверь открылась и вы вошли в следующий зал - зал воды.
                """))
            return 'hall_of_water'
        else:
            print(dedent("""
                Вы истратили все 3 попытки. 
                Стены начали сдвигаться и вы погибли.
                """))
            return 'death'
class HallOfWater(Scene):
    def enter(self):
        print(dedent("""
            Все осмотрев, вы также находите здесь дверь в следующий зал.
            Справа от двери вы видите древние африканские числа и две загадки.
            Чтобы попасть в следующий зал, вам нужно отгадать пароль, состоящий из ответов двух загадок.
            У вас есть три попытки, после чего, комнату затопит водой.
            1 + 4 = 5                 3 * 6 = 18
            2 + 5 = 12                5 + 3 = 26
            3 + 6 = 21                1 + 3 = 30
            8 + 11 = ?                5 + (3 * 5) = ?
            """)) #4050
        answer = str(input("Ваш ответ: "))
        answers = 0
        while answer != "4050" and answers < 2:
            print("Неверно, попробуйте еще раз.")
            answers += 1
            answer = input("Ваш ответ: ")
        if answer == "4050":
            print(dedent("""
                4050, абсолютно верно! Дверь открывается и вы идете дальше.
                """))
            return 'hall_of_life'
        else:
            print(dedent("""
                Вы исчерпали три попытки. 
                Комната стала наполняться водой вы долгое время сопротивлялись и вскоре утонули.
                """))
            return 'death'
class HallOfLife(Scene):
    def enter(self):
        print(dedent("""
            Отлично! Вы проходите дальше. Перед вами последняя дверь, которая ведет в зал жизни и к 
            священному граалю.
            Подойдя к двери вы также находите загадку на древнем африканском.
            И для того, чтобы попасть в зал жизни, вам необходимо отгадать следующую загадку:
            НЕЛЬЗЯ УВИДЕТЬ, НЕЛЬЗЯ ПОЩУПАТЬ, НЕЛЬЗЯ УСЛЫШАТЬ, НЕЛЬЗЯ УНЮХАТЬ.
            ЖИВЕТ ЗА ЗВЕЗДАМИ И ПОД ГОРАМИ. ОКАНЧИВАЕТ ЖИЗНЬ И УБИВАЕТ СМЕХ.
            Что это?
            На ее разгадку у вас есть три попытки, после чего путь назад будет разрушен
            и вы навсегда останетесь в этом зале!
            """)) # темнота
        answer = input("Ваш ответ: ")
        answers = 0
        while answer != "темнота" and answers < 2:
            print("Неверно, подумайте еще.")
            answers += 1
            answer = input("Ваш ответ: ")
        if answer == "темнота":
            print(dedent("""
                Темнота, это правильный ответ. Вы молодец!
                """))
            return 'HollyGrail'
        else:
            print(dedent("""
                Все попытки исчерпаны. 
                Вдруг все двери закрылись и наступила гробовая тишина.
                """))
class HollyGrail(Scene):
    def enter(self):
        print(dedent("""
            А вы умнее, чем я думал! Вам удалось пройти все испытания.
            И вот вы вошли в священный зал, зал жизни и перед вами стоит священный грааль.
            Ваш пра-пра дед всю свою жизнь искал его. И вот он перед вами.
            Вы можете:
            1) оставить грааль
            2) взять грааль с собой
            3) уничтожить грааль
            """))
        action = input("Ваш ответ: ")
        if action == "оставить грааль":
            print(dedent("""
                Вы поступили мудро. Теперь вы можете вернуться домой и написать книгу о своих 
                приключениях.
                """))
            return 'finished'
        elif action == "взять грааль с собой":
            print(dedent("""
                Как только вы подняли грааль, все двери закрылись и ото всюду наружу начали выползать 
                большие ядовитые пауки и змеи. Вы какое то время сопротивлялись, но к концу дня вы 
                обессилели
                и погибли от укусов ядовитых животных.  
                """))
            return 'death'
        elif action == "уничтожить грааль":
            print(dedent("""
                Как только вы подняли грааль, чтобы разбить его, все двери закрылись и ото всюду наружу 
                начали
                выползать большие ядовитые пауки и змеи. Вы какое то время сопротивлялись, но к концу дня 
                вы обессилели и погибли от укусов ядовитых животных.  
                """))
            return 'death'
        else:
            print("Так нельзя поступить!")
            return 'temple_entrance'
class Finished(Scene):
    def enter(self):
        print("Вы победили! Отличная работа.")
        return 'finished'
class Notebook(object):
    scenes = {
        'temple_entrance': TempleEntrance(),
        'hall_of_earth': HallOfEarth(),
        'hall_of_water': HallOfWater(),
        'hall_of_life': HallOfLife(),
        'holly_grail': HollyGrail(),
        'death': Death(),
        'finished': Finished(),
    }
    def __init__(self, start_scene):
        self.start_scene = start_scene
    def next_scene(self, scene_name):
        val = Notebook.scenes.get(scene_name)
        return val
    def opening_scene(self):
        return self.next_scene(self.start_scene)
a_notebook = Notebook('temple_entrance')
a_game = Engine(a_notebook)
a_game.play()
FishHook
Ruslan_Nali
Укажите пожалуйста, что я упустил?
ваши методы def enter(self) ничего не возвращают, однако next_scene_name = current_scene.enter() вы присваиваете переменной. Понятно, что в переменной None
Rodegast
> ваши методы def enter(self) ничего не возвращают

Не, судя по тарссировке у него в current_scene None.

> Укажите пожалуйста, что я упустил? И как исправить данную ошибку.

У меня твой файл без ошибок запустился.
Ruslan_Nali
Спасибо вам!
Ruslan_Nali
А как это исправить? (Вопрос может показаться тупым, ведь вы объяснили причину ошибки)
Я новичок и просто не в упор не вижу, что тут нужно поменять или дописать код.

xam1816
Ruslan_Nali
Я новичок и просто не в упор не вижу, что тут нужно поменять или дописать код.

 if answer == "темнота":
            print(dedent("""
                Темнота, это правильный ответ. Вы молодец!
                """))
            return 'HollyGrail'
должно быть

 return 'holly_grail'
Ruslan_Nali
Спасибо, xam1816! Исправил. Так и думал, что что-то мелочное упустил.
FishHook
Ruslan_Nali
Сделайте правильный вывод из своей ошибки. Правильный вывод - не используйте магические числа
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB