组合
给一个类的对象封装一个属性,这个属性是另一个类的对象。
题目要求:1.创建一个Game_role类
2.构造方法中给对象封装name,ad,hp等三个属性
3.创建一个attack方法,此方法实例化2个对象,互相攻击的功能:实例化一个对象 盖伦,ad为10,hp=100;实例化
另外一个对象 剑豪 ad为20,hp为80;盖伦通过attack方法攻击剑豪,此方法要完成“谁攻击谁,谁掉了多少血,还剩多少血”的提示功能。
# 添加武器:斧子,刀,枪,棍,棒....
class GameRole:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p):
p.hp = p.hp - self.ad #p.hp需要重新赋值,因为被打者的血量发生了变化,不重新赋值的话,值不变
print("%s攻击%s,%s掉了%s血,还剩%s血” % (self.name,p.name,p.name,self.ad,p.hp))
class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def fight(self,p1,p2): #谁用什么打谁
p2.hp =p2.hp - self.ad
print("%s用%s打了%s,掉了%s血,还剩%s血” % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))
p1 =GameRole('盖伦’,20,500)
p2 =GameRole('亚索’,50,200)
axe = Weapon("三板斧",60)
broadsword = Weapon(“屠龙宝刀”,100)
axe.fight(p1,p2) #武器对象调用fight方法,实现谁攻击谁的目的;动作发起者应该是人才对,所以重新写。
broadword.fight(p2,p1)
第一版:代码不合理,人物利用武器去攻击别人,你的动作发起者是人 ,而不是武器。
#第2版 组合的概念
在人的类中增加武器的属性
p1.armement_weapon(axe)触发了self.wea=wea这个方法,后面的wea是右边标青色的axe对象空间;
self.wea是给右边标青色的P1对象增加了一个wea属性,那么wea就是axe的对象空间。
class GameRole:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p):
p.hp = p.hp - self.ad #p.hp需要重新赋值,因为被打者的血量发生了变化,不重新赋值的话,值不变
print("%s攻击%s,%s掉了%s血,还剩%s血” % (self.name,p.name,p.name,self.ad,p.hp))
def armament_weapon(self,wea):
self.wea= wea
class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def fight(self,p1,p2): #谁用什么打谁
p2.hp =p2.hp - self.ad
print("%s用%s打了%s,掉了%s血,还剩%s血” % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))
p1 =GameRole('盖伦’,20,500)
p2 =GameRole('亚索’,50,200)
axe = Weapon("三板斧",60)
broadsword = Weapon(“屠龙宝刀”,100)
p1.armament_weapon(axe) #给盖伦装备了三板斧这个对象
print(p1.wea) #p1.wea其实就是axe
print(p1.wea.name) #三板斧
print(p1.wea.ad) #60
p1.wea.fight(p1,p2) #这里的p1.wea就是axe,axe就可以调用fight这个方法