Это отличное начало, и, очевидно, вы уже много об этом думали. Однако вы не продумали отношения между классами.
Первое, на что нужно обратить внимание: MTGGame.gainLife(lifeAmt)
- это вызов метода, доступ к которому осуществляется через класс, а не через экземпляр. Это означает, что параметр self на самом деле не заполнен, т.е. вы получите ошибку, потому что ваш метод ожидает 2 аргумента, но получает только один. Возможно, вы хотели сделать следующее:
class MTGGame:
lifeTotal = 20 # Notice this is declared as a class variable
def __init__(self, ...):
...
@classmethod
def healersHawkAbility(cls, lifeGained):
cls.lifeTotal = cls.lifeTotal + lifeGained
Однако для этого нужны переменные класса, которые здесь лишают смысла иметь экземпляр.
Ваше наименование в программе должно предполагать, что вы занятия немного выходные Например player1 = MTGGame()
. Является ли игрок игрой? Нет, конечно нет. Поэтому на самом деле вы можете захотеть переименовать свой класс MTGGame в Player, чтобы было ясно, что он относится к игроку, а не к игре. Вероятно, потребуется создать отдельный класс, называемый MTGGame, чтобы управлять взаимодействиями между игроками, например, чьим ходом, стеком, в котором находятся карты во время разрешения.
Основная задача вашего вопроса: как справиться с карты, обращающиеся к объекту игры / игрока.
Карты должны иметь возможность доступа к экземплярам класса игрока и игры, и если у игрока есть атрибут is_playing, карта не должна иметь его. Эмпирическое правило для наследования - «это». Так как карта не является игроком, она не должна наследоваться от нее или MTGGame. Вместо этого карта должна выглядеть следующим образом:
game = RevisedMTGGame()
player1 = Player()
player2 = Player()
class Card:
def __init__(self, name, text, cost):
self.name = name
self.text = text
self.cost = cost
self.owner = None
self.game = None
class Creature(Card):
def __init__(self, name, text, cost, power, toughness):
super().__init__(self, name, text, cost)
self.power = power
self.toughness = toughness
def lifelink(self):
self.owner.heal(self.power) # NOTE: this is NOT how I would implement lifelink, it is an example of how to access the owner
healersHawk = Creature("Healer's Hawk", "Flying, Lifelink", 1, 1, 1)
healersHawk.game = game
healersHawk.owner = player1
Из этого неполного примера вы можете увидеть, как вы можете легко настроить свои карты, даже со сложной механикой, и поскольку базовые классы были определены, вы можете избегать повторения кода. Возможно, вы захотите взглянуть на модель событий, чтобы в качестве примера реализовать механизм поддержки жизненного цикла c. sh удачи в продолжении игры!