Проблемы с постоянным вложением циклов while в python

Я пишу текстовую RPG на Python 3. Я пишу ее с отдельными сценами, которые будут выполнять связанные функции на основе пользовательского ввода в этой конкретной сцене. Некоторые из этих входных данных переместят пользователя в новую сцену. Игрок застревает в сцене с циклом while True до тех пор, пока не перейдет к новой сцене, где снова застревает в цикле while True. Это не было проблемой, но я новичок, я просто хотел бы знать, может ли это вызвать проблемы в будущем, поскольку игра по существу будет работать на бесконечно вложенных циклах while.

Ниже показано, как я получаю данные от игроков и использую их для выполнения команд в зависимости от того, где находится игрок. Обратите внимание, что структура моего кода не совсем такая, я использую классы и храню доступные команды по-другому, но мне нужен простой способ показать, как работает смена сцены. Мой вопрос относится только к циклам while. Большое спасибо!

def scene_room():
    while True:
        user_input = input()
        if user_input == "go outside":
            scene_outside()
        elif user_input == "exit":
            exit()
        else:
            print("Invalid input.")

def scene_outside():
    while True:
        user_input = input()
        if user_input == "go room":
            scene_room()
        elif user_input == "info":
            print("You're outside.")
        elif user_input == "exit":
            exit()
        else:
            print("Invalid command")

scene_room()

Да, это проблематично, но не из-за while Trues. У вас есть взаимная рекурсия между двумя функциями. Если пользователь выйдет на улицу, затем в комнату, а затем обратно на улицу 500-1000 раз, ваша программа рухнет. Хотя это маловероятно, это не лучший вариант для укрепления.

Carcigenicate 18.11.2022 16:01

Да, размер стека ограничен. Таким образом, вы можете запускать только конечное количество функций одновременно. Для этой цели предел, вероятно, достаточно высок, чтобы вы вряд ли его достигли, но он есть, если вы получите переполнение стека, нет возможности поймать и восстановить

mousetail 18.11.2022 16:01

Вам нужно быть исключительно осторожным с While True, так как он по своей природе «блокирует», а это означает, что ваша программа не может ничего делать во время выполнения цикла. Это особенно важно при работе с графическим интерфейсом, где вы, скорее всего, в конечном итоге заблокируете поток пользовательского интерфейса и заставите свою программу зависнуть, но, как правило, лучше всего этого избегать!

JRiggles 18.11.2022 16:03

Проект, который вы ищете, представляет собой конечный автомат, где функция принимает текущую комнату и направление в качестве входных данных и возвращает новую комнату. Другая функция обрабатывает все, что происходит в комнате, прежде чем передать управление функции перехода из одной комнаты в другую. (Другая проблема с взаимной рекурсией заключается в том, что вызов scene_room, затем scene_outside, затем снова scene_room не совпадает с исходным вызовом scene_outside фактического возврата. То, что у вас есть, похоже на стиль передачи продолжения, когда вы никогда не ожидаете никаких своих функций. реально вернуться)

chepner 18.11.2022 16:05

Одним из методов преобразования вашего рекурсивного дизайна в итеративный подход является использование батута.

chepner 18.11.2022 16:07
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
5
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на комментариях, ответ да, вложенные циклы while могут вызывать проблемы как из-за превышения ограниченного размера стека, так и из-за того, что циклы while обычно «блокируют» по своей природе (что я не совсем понимаю, но я включаю это для людей что будет). В этом конкретном случае также существует проблема возможной бесконечной рекурсии, поскольку функции также являются вложенными.

Решение для кода, который я предоставил, состоит в том, чтобы вернуть новую сцену, не вызывая ее из цикла или функции while. Нам нужна функция-оболочка для обработки вызова новых сцен, чтобы мы могли выйти из каждой функции сцены перед вызовом новой.

def scene_room():
    while True:
        user_input = input()
        if user_input == "go outside":
            return scene_outside # break loop before calling
        elif user_input == "exit":
            exit()
        else:
            print("Invalid input.")

def scene_outside():
    while True:
        user_input = input()
        if user_input == "go room":
            return scene_room # # break loop before calling
        elif user_input == "info":
            print("You're outside.") # not new scene so stay in loop
        elif user_input == "exit":
            exit()
        else:
            print("Invalid command")

def play():
    new_scene = scene_room
    while True:
        new_scene = new_scene()

Другие вопросы по теме