Текстовая механика в Python: класс, словарь или список?

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

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

У меня есть несколько разных юнитов для игрока. Допустим, у каждого юнита есть имя, сила и устойчивость (например, "Лучник", "10", "80"). Войны основаны на общей силе игрока (я могу рассчитать это). После каждой войны сила юнита уменьшается на его устойчивость, т.е. этот лучник уменьшится до 80% своей первоначальной силы после войны до силы 8.

Тем не менее, у меня возникли проблемы при разработке того, как пользователь может создавать юниты таким образом, который позволяет эту механику. Первоначально я использовал класс Unit() (с различными единицами измерения, например, лучником, копьеносцем в качестве объектов) с аргументом "количество" наряду с именем / силой / сопротивляемостью для количества построенных единиц, но каждый раз, когда я запускал функцию для вычисления эффекта Эластичность Я понял, что это влияет не только на выпускаемые в настоящее время устройства, но и на все будущие версии устройства. Я запускал что-то вроде следующего:

class Unit():
  def __init__(self, name, quantity, strength, resilience)
  self.name = name
  self.quantity = quantity
  self.strength = strength
  self.resilience = resilience

archer = Unit('archer', 0, 10, 80)

так далее...

Каждый раз, когда пользователь строит единицу, "количество" будет увеличиваться. Однако я понял, что, вероятно, именно этот метод кодирования, вероятно, ограничивает меня. Чтение других потоков говорит мне, что я должен стремиться не хранить объектные данные таким образом, верно?

Я играю вокруг и исследую, и я, кажется, не могу придумать решение (которое, я уверен, там). У меня возникают проблемы с поиском правильного способа хранения основных данных каждого устройства (имя, сила, устойчивость), в то же время позволяя пользователю создавать несколько уникальных копий каждого устройства. Каждый блок должен быть классом? Подкласс? Это должно храниться в словаре? Список?

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

Как создать несколько лучников, каждый из которых получает урон, не затрагивая будущих лучников, которые могут быть произведены?

Спасибо, если кто-нибудь может что-то предложить. Кроме этого, я получаю много удовольствия от написания кода на python!

2 ответа

Решение

Суть класса в том, что он позволяет создавать множество экземпляров этого класса. Вам не нужно (и не может / не должно) подкласс Unit за каждую единицу. Вам просто нужно создать экземпляр Unit учебный класс:

 archer1= Unit('archer', 0, 10, 80)
 archer2= Unit('archer', 0, 10, 80)

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

 archer1.strength= 0
 print(archer2.strength) # prints 10

Конечно, это означает, что вам не нужно quantity атрибут, и вам нужно хранить все единицы в некоторой структуре данных, как список:

 all_my_archers= [archer1, archer2]
 #create a 3rd archer
 all_my_archers.append(Unit('archer', 0, 10, 80))

Это менее важно, но вы также должны рассмотреть возможность создания подклассов Unit создать Archer учебный класс:

class Unit:
    def fight_war(self):
         self.strength= self.strength * self.resilience / 100.0

class Archer(Unit):
    name= 'archer'
    strength= 10
    resilience= 80

Поскольку все юниты лучников начинаются с одинаковых характеристик (я полагаю), это избавит от необходимости указывать strength а также resilience каждый раз, когда вы создаете новое подразделение лучника (вы можете просто сделать archer4= Archer() сейчас), и вы все еще можете изменять характеристики юнита, не влияя на другие юниты.

Для меня, особенно когда вы создаете игру, подклассификация - это действительно хороший способ написания хорошего кода. Главным образом потому, что вы можете реализовать независимые функции на ваших подклассах. Например каждый Unit может иметь тот же механизм движения, но Archer Unit может отложить в процессе атаки. Чтобы поговорить код:

class Unit(object):

    def __init__(self, movement_speed=10, health=100):
        self.movement_speed = movement_speed
        self.health = health
        self.position = 0

    def move(self):
        self.position += movement_speed

    def get_hit(self, damage=0):
        self.health -= damage

    #etc

class Archer(Unit):

    def __init__(self, arrows=10):
        super(self.__class__, self).init()
        self.arrows = 10

    # Archer has all the Unit methods

    def attack(self, other_unit_instance):
        # Here you can check if he is in range, etc
        other_unit_instance.get_hit(damage=1)
        self.arrows -= 1
Другие вопросы по тегам