面向对象-名称空间

组合

给一个类的对象封装一个属性,这个属性是另一个类的对象。

 

题目要求: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这个方法

 

       

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值