Пара дополнительных предложений: не имеет смысла называть класс, который моделирует боец, Fighters
. Это должно быть единственное число, Fighter
. У бойцов нет имени, у одного бойца есть имя. Хотя один боец может начать бой, странно, что один боец руководит им; Я бы предпочел использовать либо статический метод (Fighter.fight(goku, conan)
), либо отдельный класс Fight
, представляющий случай события, в котором сражаются два человека. Он также отвечал бы за сообщение о бое. Для экземпляра также не очень удобно вносить изменения в другой экземпляр; Конан может ударить, но только Гоку должен управлять своим здоровьем. Цикл while
сложнее, чем нужно; структура боя такова, что атакующий поражает защитника, затем они меняются местами . Это делает управление потоком намного проще. Наконец, по соглашениям об именах Python переменные экземпляра должны быть в нижнем регистре; люди могут быть обмануты, думая, Goku
и Conan
являются именами классов. (Это только один пример, есть и другие проблемы с делами.) Итак, с учетом этого, немного переписать переписать:
import random
class Fighter:
def __init__(self, name):
self.name = name
self.health = 100
self.damage = [5, 10, 15, 20]
self.strength = 0
def __str__(self):
return self.name
def hit(self, defender):
attack_damage = random.choice(self.damage) + self.strength
defender.suffer(attack_damage)
return attack_damage
def suffer(self, attack_damage):
self.health -= attack_damage
def is_dead(self):
return self.health <= 0
def fight(self, other):
return Fight(self, other)
class Fight:
def __init__(self, attacker, defender):
self.attacker = attacker
self.defender = defender
def round(self):
damage = self.attacker.hit(self.defender)
if self.defender.is_dead():
print_str = f"{self.attacker} killed {self.defender}! {self.attacker} wins the fight!"
else:
print_str = f"{self.attacker} attacks {self.defender}!"
print_str += f" Hit for {damage} damage | {self.defender}'s Health: {self.defender.health}hp"
print(print_str, end="\n\n")
self.attacker, self.defender = self.defender, self.attacker
def run(self):
while not self.attacker.is_dead():
self.round()
goku = Fighter("Goku")
konan = Fighter("Konan")
goku.strength = 3
goku.fight(konan).run()
Отсюда, продвинутым упражнением будет превращение боя в генератор, чтобы вы могли, например, бегать по раундам проще.