Профиль пользователя заблокирован сроком с 13 мая 2021 г. и навсегда по причине: нарушение п. 6.6 правил сайта
  • Где и как можно оптимизировать код?

    longclaps
    @longclaps
    Дружище, это кошмар. И в нём виноват не ты, а составители задания, которые обрекли тебя это слепить.
    Эта игра состоит в том чтобы пройти по дереву сюжетов, делая выбор той или иной ветви.
    Умеешь ли ты строить дерево? Умеешь ли обходить? Умеешь ли хранить/редактировать? Нет, нет, нет. И ты выкрутился, как мог. Молодец, а теперь смотри

    Хранить дерево будем в файле 'kolobok.yaml':
    intro: "Испеки мне колобок"
    choise:
      - "по сусекам поскреби":
          intro: "испекла. Что сделал колобок"
          choise:
            - "покатился с окна на заваленку":
                intro: "встретил зайца"
                choise:
                  - "я тебе песенку спою":
                      intro: "спел песенку, а навстречу волк"
                      choise:
                        - "я уже чёрствым стал":
                            final: "Волк поломал зубы"
                        - "отнеси к дедушке с бабушкой":
                            final: "Волк бросил колобка в речку"
                        - "я тебе песенку спою":
                            final: "колобок встретил медведя"
                  - "попробуй меня догнать":
                    intro: "прошмыгнул между ног зайца"
                  - "Не успел ответить":
                    final: "заяц его съел"
            - "скатился на лавку"
            - "остался остывать на окне"
      - "свари мне каши":
        final: "Старуха сварила кашу"
      - "пойду на базар":
        final: "медведь его съел"

    Движок мог бы быть примерно таким:
    import yaml
    
    with open('kolobok.yaml') as f:
        root = yaml.load(f, Loader=yaml.FullLoader)
    
    
    def dfs(d):
        if 'intro' in d:
            print(d['intro'])
        if 'final' in d:
            print(d['final'])
            exit(0)
        if 'choise' in d:
            print('выберите цифру ответа')
            choise = d['choise']
            for i, p in enumerate(choise, 1):
                print(i, next(iter(p)) if type(p) is dict else p)
            while True:
                try:
                    answer = input()
                    i = int(answer) - 1
                    if not 0 <= i < len(choise):
                        raise ValueError
                except ValueError:
                    print(f'ответ "{answer}" не поддерживается, пробуй ещё:')
                p = choise[i]
                if type(p) is dict:
                    dfs(p.popitem()[1])
                else:
                    print(p)
                    exit(0)
    
    
    dfs(root)

    Сколь-нибудь долгий путь, 4 сцены - лишь по ветке 1 -> 1 -> 1 -> 1, вбивать всё недосуг.
    Про YAML, DFS и прочие штуки можно найти в интернете.
    Ответ написан
    3 комментария