2016-08-20 6 views
0

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

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

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

Однако у меня возникли проблемы с разработкой того, как пользователь может создавать единицы таким образом, чтобы этот механик. Первоначально я использовал класс Unit() (с разными единицами, например archer, spearman as objects) с аргументом «количество» наряду с именем/силой/сопротивляемостью для количества построенных единиц, но каждый раз, когда я запускал функцию для вычисления эффекта я понял, что влияю не только на произведенные в настоящее время единицы, но и на все будущие версии этого устройства. Я бегу что-то вроде следующего:

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) 

и т.д ...

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

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

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

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

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

+0

Вы должны показать больше кода. Определение силы и т. Д., Как вы это делали, означает, что они будут применяться только к этой конкретной единице и * не * ко всем единицам этого типа; обычная ошибка, которую люди делают, определяет эти значения на уровне класса, но вы этого не сделали. –

+0

Спасибо за отзыв. Я не был уверен, какой код действительно будет иметь значение, потому что это не так, у меня есть ошибочный код, просто я играю с логикой питона и не могу понять правильную структуру. Ответ Rawing ниже близок, у меня есть дополнительные проблемы, создающие уникальные идентификаторы для объектов, когда пользователь решает их создать. – Jammydude44

ответ

1

Пункт класса состоит в том, что он позволяет создавать множество экземпляров этого класса. Вам не нужно (и не может/не должно) подкласс Unit для каждого устройства. Вам просто нужно Instantiate в 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() сейчас), и вы можете все равно изменяют статистику единицы, не влияя на другие единицы.

+0

Спасибо. Это близко к тому, что я искал, по крайней мере, это показывает, что я был на правильном пути. Часть, с которой я борюсь, генерирует уникальные объекты «на лету», когда пользователь выбирает их из производственного меню. Не могли бы вы порекомендовать, как пользовательский ввод «лучника» или «копейщика» может привести меня к точке, где я создаю объект «archer3» или «spearman4»? Я не могу понять, как создать уникальный ID для объекта во время выполнения. – Jammydude44

+0

@ Jammydude44 Я подозреваю, что вы недопонимаете. Вы можете создать новый, уникальный, независимый блок/лучник, просто вызвав конструктор 'Archer()' или 'Unit()'. Нет необходимости динамически создавать переменные, т. Е. 'Archer386 = Archer()'. Вам просто нужно сохранить новый экземпляр «Unit» в списке со всеми остальными единицами: 'all_my_archers.append (Archer())'. Если вам действительно нужен уникальный идентификатор для каждого устройства, вы можете использовать встроенную функцию 'id':' id (archer1) '. –

+0

Да, спасибо, я был недопониманием. Я думал, что print (all_my_archers.name) возвращает «лучник, лучник, лучник», что они были тем же самым экземпляром, и я делал ту же ошибку, что и в моем вопросе. Но, проверив его дальше, я вижу, что это уникальные экземпляры. Теперь я понимаю магию списков в отношении объектов. Время убрать остальную часть моего кода! Спасибо, ответил отлично. – Jammydude44

0

Для меня, особенно когда вы создаете игру, субклассификация - это действительно хороший способ написания хорошего кода. В основном потому, что вы можете реализовать независимые функции в своих подклассах. Например, каждый 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 
+0

Спасибо Kostas Pelelis, в то время как это не совсем то, что я искал (хотя мы будем винить это в неопределенности моего сообщения), это то, что я определенно буду поддерживать, когда я добавлю больше глубины в систему. – Jammydude44