day23 02 组合(继续人狗大战游戏)
面向对象的三大特性:继承 多态 封装
先讲解一下组合
组合:一个对象的属性值是另一个类的对象:对象.属性.属性(一般有两个点)
继续扩展day22 01里面的人狗大战的小游戏来说明组合的存在,相对于之前的游戏,这次多加了一个武器装备类,而且武器还有它的大招。首先一个武器装备所有的属性有:武器的名字,武器具有的攻击力,武器可使用的次数,购买购买该装备需要的钱,所以你每次使用武器前都要看看自己的钱够不够,不够就得先充值,每次购买武器后,所拥有的钱都要扣除相应的钱。代码如下,以及相关注释:
# 人物类的定义 class someone: def __init__(self,name,blood,aggr,sex): # self对象的创建以及初始化 # 给人物的属性赋值,得到一个具体的人物 self.name=name self.blood=blood self.aggr=aggr self.sex=sex self.money=0 # 人物拥有的攻击技能 def attack(self,dog): dog.blood -=self.aggr # 人物没攻击一下狗,狗就会掉相应的血量 # 给人物装备武器 def get_weapon(self,weapon): if self.money>=weapon.price: # 只有当人物拥有的钱大于或者等于该武器装备的价格的时候才能拥有该武器装备 self.money-=weapon.price # 购买武器后钱就相应的扣除 self.weapon=weapon # 添加武器 self.aggr+=weapon.aggr # 人物添加武器装备后,具有的攻击力就等于它自身的加上武器的 else: print('余额不足,请先充值') # 人物拥有的钱不够买武器装备的时候就提醒人物充值 # 狗类的定义 class dog: def __init__(self,name,blood,aggr,kind,): # self对象的创建以及初始化 # 给狗类的属性赋值,得到一条具体的狗 self.name=name self.blood=blood self.aggr=aggr self.kind=kind self.money=0 # 预设人物开始没有钱 # 狗具有的攻击技能 def bite(self,someone): someone.blood-=self.aggr # 狗每次攻击人物,人物就会掉相应的血量 # 添加一个武器装备类 class weapon: def __init__(self,name,aggr,sustain,price): # self对象的创建以及初始化 # 给武器装备的属性赋值 self.name=name self.aggr=aggr self.sustain=sustain self.price=price # 武器装备里面有个大招double_kill def double_kill(self,person,dog): if self.sustain>0: # 只有当你武器使用次数还有剩余的时候,才能使用武器里面的大招 person.blood-=self.aggr*2 # 每次使用大招,人物的血量就会掉武器两倍攻击力的血量,即武器的大招是武器原本攻击力的两倍 dog.blood-=self.aggr*3 # 每次使用大招,狗被击中,血量就会掉武器3倍攻击力的血量 self.sustain-=1 # 每次使用一次大招,武器使用次数相应的减一次 person1=someone('王昭君',1000,300,'girl') # 人物实例化 print(person1.name) dog1=dog('溜溜球',2000,500,'泰迪') # 狗角色的实例化 print(dog1.name) person1.attack(dog1) # 进行人物攻击狗的操作 print(dog1.blood) # 因为人的攻击力是300,所以当人物攻击狗的时候,狗会掉300的血量,剩余1700的血量 weapon1=weapon('打狗棒',100,3,1000) # 武器实例化 person1.get_weapon(weapon1) # 给人物装备武器打狗棒 person1.money=2000 # 装备过程发现人物拥有的钱不够买武器装备,提醒充值,然后充值2000 person1.get_weapon(weapon1) print(person1.weapon.name) # 人物装备武器成功 print(person1.aggr) # 人物获得武器装备后攻击力等于自身的攻击力加上武器具有的攻击力为400 person1.attack(dog1) # 人物获得武器后再去攻击狗 print(dog1.blood) # 狗会掉400的血量,即此时的血量剩余1300 person1.weapon.double_kill(person1,dog1) # 人物使用武器里面的大招 print(dog1.blood) # 狗会掉300的血量,剩余1000 print(person1.blood) # 人物也会掉200的血量,剩余800
运行结果:
王昭君 溜溜球 1700 余额不足,请先充值 打狗棒 400 1300 1000 800
以上代码中:
person1.weapon是weapon类的一个对象
person1.weapon是person1这个对象的一个属性值
double_kill又是person1.weapon的一个属性值
这种一个对象的属性值是另一个类的对象,就形成了一个组合