在这里的这个类中:
class Hero():
def __init__(self, Type, name):
self.Type = Type
self.name = name
self.atk = 'Undefined'
if Type == 'Paladin':
self.hp = 150
self.dmg = [10, 20]
self.atk = random.randint(self.dmg[0], self.dmg[1])
self.defence = 25
self.dodge = 5
elif Type == 'Mage':
self.hp = 70
self.dmg = [60, 70]
self.atk = random.randint(self.dmg[0], self.dmg[1])
self.defence = 15
self.dodge = 8
elif Type == 'Archer':
self.hp = 100
self.dmg = [40, 50]
self.atk = random.randint(self.dmg[0], self.dmg[1])
self.defence = 10
self.dodge = 13我注意到我总是对每个if语句使用hp、dmg、atk、defence、dodge。既然python是面向对象的,那么有没有办法利用这一点而不需要手动编写所有这些东西呢?
发布于 2020-06-16 04:52:07
您可以使用inheritance并创建Hero类的3个子类来移动代码。
Hero类,您可以在其中编写util方法来创建不同类型的Hero
class Hero():
def __init__(self, Type, name):
self.name = name
self.atk = 'Undefined'
def _init_atk(self):
self.atk = random.randint(self.dmg[0], self.dmg[1])
@staticmethod
def get_hero(hero_type, name):
if hero_type == 'Paladin':
return Paladin(name)
elif hero_type == 'Mage':
return Mage(name)
elif hero_type == 'Archer':
return Archer(name)
return None英雄类,它们定义了自己的属性值
class Paladin(Hero):
def __init__(self,name):
super(Paladin, self).__init(name)
self.hp = 150
self.dmg = [10, 20]
self.defence = 25
self.dodge = 5
self._init_atk()
class Mage(Hero):
def __init__(self,name):
super(Mage, self).__init(name)
self.hp = 70
self.dmg = [60, 70]
self.defence = 15
self.dodge = 8
self._init_atk()
class Archer(Hero):
def __init__(self,name):
super(Archer, self).__init(name)
self.hp = 100
self.dmg = [40, 50]
self.defence = 10
self.dodge = 13
self._init_atk()然后你可以创建像这样的对象
a = Archer("RobinHood")
b = Hero.get_hero("Mage", "HarryPotter")发布于 2020-06-16 11:39:29
您可以使用继承从超类派生各种Hero Characters,并为每个新类型提供一组特定的值;您还可以为它们提供特定的属性和行为:
使用类变量来存储值可以简化代码:
from abc import ABC
import random
class Hero(ABC): # this cannot be instantiated
def __init__(self, name):
self.name = name
self.atk = random.randint(self.dmg[0], self.dmg[1])
self.hp = self.__class__.hp
self.dmg = list(self.__class__.dmg)
self.defence = self.__class__.defence
self.dodge = self.__class__.dodge
def __str__(self):
return f'{self.__class__.__qualname__}: {self.name}, atk: {self.atk}, hp: {self.hp}, dmg: {self.dmg}, defense: {self.defence}, dodge: {self.dodge}'
class Paladin(Hero):
hp = 150
dmg = (10, 20)
defence = 25
dodge = 5
def __init__(self, name):
super().__init__(name)
class Mage(Hero):
hp = 70
dmg = (60, 70)
defence = 15
dodge = 8
def __init__(self, name, spells):
super().__init__(name)
self.spells = spells[:]
def __str__(self):
return f'{super().__str__()}\n\tspells: {self.spells}'
class Archer(Hero):
hp = 100
dmg = (40, 50)
defence = 10
dodge = 13
def __init__(self, name):
super().__init__(name)
A = Archer('Guillaume Tell')
B = Mage('Gandalf', ['quadratus lumborum', 'rectus femoris'])
C = Paladin('Ali Baba')
print(A)
print(B)
print(C)输出:
Archer: Guillaume Tell, atk: 49, hp: 100, dmg: [40, 50], defense: 10, dodge: 13
Mage: Gandalf, atk: 62, hp: 70, dmg: [60, 70], defense: 15, dodge: 8
spells: ['quadratus lumborum', 'rectus femoris']
Paladin: Ali Baba, atk: 13, hp: 150, dmg: [10, 20], defense: 25, dodge: 5https://stackoverflow.com/questions/62396692
复制相似问题