Многократное повторение разделов кода в моей текстовой игре

#python #duplicates #text-based

#python #дубликаты #текстовый

Вопрос:

Я создаю текстовую игру, которая в основном основана на операторах if, elif и else. Тем не менее, я также использую циклы while для разных «областей» в игре. (Play_loop, Main_loop, Shop_loop, Fish_loop и т. Д.).

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

Проблема, с которой я сталкиваюсь, заключается в том, что я знаю, что следует избегать дублирования кода, но мне интересно, необходимо ли это в данной ситуации. Я уже создал множество функций, чтобы сделать код каждой команды довольно коротким, в общем, около 2-15 строк.

Должен ли я добавлять блоки кода в функции, которые выполняют то же самое, а затем просто повторять функцию, или я должен просто оставить ее как есть? Или, может быть, мне следует сделать что-то еще, о чем я даже не думал?

Пример кода:

 elif command == '/user info':
    if user.admin:
        print(f'User-list: {users}')
        who = input('Name of user: ').strip()
        who_user = admin_load_user(who, users)
        if who_user:
            print(who_user.info())
            print(who_user.display_inv())
        else:
            print(DNEError)
    else:
        print(PError)
elif command == '/add coins':
    who = input('Who gets coins? ').strip()
    amount = int(input('How much? ').strip())
    admin_add_coins(who, amount, users)
    save_users(users)
  

Комментарии:

1. Я бы подумал о создании всей игры в классе. Таким образом, переменные класса можно легко передавать и использовать вместо глобальных. Затем вы можете сопоставить каждую командную строку с функцией. который может быть вызван в любое время из любой ситуации. Т.е. ‘/ add coins’ должен немедленно вызвать функцию ‘add_coins’. Вы можете различать команды администратора и команды пользователя, но это зависит от вашего проекта.

2. @JasonChia На данный момент у меня есть два класса: класс игрока и класс поставщика. Это то, что вы имеете в виду? Многие команды администратора применяются к другим игрокам или поставщикам, а не к самому администратору.

Ответ №1:

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

Вот краткий аргумент в пользу использования функций. Это написано для C, но применимо и к python.

Затем, как указал Джейсон Чиа, вам следует подумать о том, чтобы разбить вашу игру на классы, поскольку они решают некоторые из упомянутых вами проблем и, как правило, являются важным инструментом управления для больших программ, где вам нужно координировать различные состояния (например, изменять что-то в комнате в зависимости от действий игрока).).

Этот учебник может помочь в этом.

Это примерно отвечает на ваш вопрос?

Комментарии:

1. Я думаю, это отвечает на мой вопрос. Я довольно новичок в использовании классов, но у меня есть довольно много методов в моем классе player. Большинство этих команд администратора не находятся внутри класса, а являются просто глобальными функциями.

Ответ №2:

Вы должны использовать стиль декоратора, чтобы было удобно читать и писать. черпайте вдохновение здесь:

 def requires_admin(f):
    def wrapper(f):
        @wraps(f)
        def wrapped(*args, **kwargs):
            #if not admin:
                #return render_template('error.html')
            return f(*args, **kwargs)
        return wrapped
    return wrapper


@app.route('/admin/action')
@requires_admin
def AdminAction():
    whatyouwant()
  

Комментарии:

1. Это выглядит немного выше моего уровня мастерства, есть ли у вас какие-либо источники, где я мог бы узнать об этом?

2. geeksforgeeks.org/decorators-with-parameters-in-python