Я создаю текстовую приключенческую игру на языке python. Когда игра начинается, я хочу создать экземпляр класса под названием "Character", который является объектом персонажа игрока. Я хотел бы, чтобы пользователь мог выбрать расу персонажа, которым он хочет играть. На данный момент у меня есть:

class Race:
    def __init__(self, name, passive, hp):
        self.name = name
        self.passive = passive
        self.hp = hp

и

class Lizard(Race):
    def __init__(self, name, passive, hp):
        super().__init__(name, passive, hp)
        self.name = 'Lizardman'
        self.passive = 'Regrowth'
        self.hp = 20

    def regrowth(self):
        if 0 < self.hp <= 18:
            self.hp += 2

и

def race_select():
    races = ['Lizard']

    while True:
        for i, j in enumerate(races):
            print(f"[{i + 1}]", j)

        choice = int(input('Pick a race:'))

        if choice <= len(races):
            print('You are a ', races[choice - 1])
            return races[choice - 1]
        else:
            continue

Если я правильно понимаю, если бы я хотел, чтобы раса была ящерицей, мне все равно пришлось бы сделать

character = Lizard('Lizardman', 'Regrowth', 20)

Есть ли простой способ позволить пользователю выбрать расу и соответственно создаваемый объект? Спасибо

Schnibs

Ответов: 1

Ответы (1)

Простым решением может быть сопоставление имени с классом с помощью словаря. В качестве простого примера:

race_map = {"lizard": Lizard,
            "human": Human}  # I'm adding a theoretical other class as an example

choice = input('Pick a race:')
race_initializer = race_map.get(choice, None)  # Get the chosen class, or None if input is bad
if race_initializer is None:
    # They entered bad input that doesn't correspond to a race
else:
    new_creature = race_initializer(their_name, their_passive, their_hp)

new_creature теперь является новым объектом выбранного класса.

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


Я изменил его, чтобы позволить указывать расу строковым именем, а не номером. Если вам нужен номер, вы можете сохранить свой список, но применить ту же идею. Например:

race_list = races = [('Lizard', Lizard), ('human', Human)]
choice = int(input('Pick a race:'))
try:
    race_initializer = race_list[choice][1]  # 1 because the class object is the second in the tuple
    new_creature = race_initializer(their_name, their_passive, their_hp) 
except IndexError:
    # Bad input

Я включил имя в race_list, чтобы вы могли перебирать список и выводить ассоциации индекс->имя для выбора пользователем.

Возможно, вы захотите использовать более надежную структуру, чем простой кортеж, для хранения связок имя->инициализатор, но это хорошо работает в простых случаях.

2022 WebDevInsider