应用:反恐精英

1. 人类

  • 属性
    • 姓名
    • 血量
    • 持有的枪
  • 方法
    • 安子弹
    • 安弹夹
    • 拿枪(持有抢)
    • 开枪

2. 子弹类

  • 属性
    • 杀伤力
  • 方法
    • 伤害敌人(让敌人掉血)

3. 弹夹类

  • 属性
    • 容量(子弹存储的最大值)
    • 当前保存的子弹
  • 方法
    • 保存子弹(安装子弹的时候)
    • 弹出子弹(开枪的时候)

4. 枪类

  • 属性
    • 弹夹(默认没有弹夹,需要安装)
  • 方法
    • 连接弹夹(保存弹夹)
    • 射子弹

参考代码

class Person(object):
    def __init__(self, new_name):
        self.name = new_name
        self.gun = None
        self.ph = 100

    def anzhuang_zidan(self, danjian_temp, zidan_temp):
        # 让弹夹存储子弹
        danjian_temp.baocun(zidan_temp)

    def anzhuang_danjia(self, gun_temp, danjia_temp):
        gun_temp.baocun(danjia_temp)

    def na_gun(self, gun_temp):
        self.gun = gun_temp

    def __str__(self):
        if self.gun:
            return "%s 的ph为:%d, 他一把%s:" % (self.name, self.ph, self.gun)
        else:
            return "%s 的ph为:%d, 他么有枪..." % (self.name, self.ph)

    def kaiqiang(self, diren):
        # 让枪向敌人开火
        self.gun.fire(diren)

    def diaoxue(self, shashangli):
        self.ph -= shashangli


class Gun(object):
    def __init__(self, new_name):
        self.name = new_name
        self.danjia = None

    def baocun(self, danjia_temp):
        self.danjia = danjia_temp

    def __str__(self):
        if self.danjia:
            return "%s有弹夹,%s" % (self.name, self.danjia)
        else:
            return "%s没有弹夹"

    def fire(self, diren):
        # 从弹夹中拿出一个子弹
        zidan_temp = self.danjia.tanchu_zidan()
        if zidan_temp:
            # 让子弹去伤害敌人
            zidan_temp.shanghai(diren)
        else:
            print("%s没子弹了" % self.name)


class Danjia(object):
    def __init__(self, new_max_num):
        self.max_num = new_max_num
        self.zidan_list = []

    def baocun(self, zidan_temp):
        self.zidan_list.append(zidan_temp)

    def __str__(self):
        return "弹夹:%d/%d" % (len(self.zidan_list), self.max_num)

    def tanchu_zidan(self):
        if len(self.zidan_list) > 0:
            return self.zidan_list.pop()
        else:
            return None


class Bullet(object):
    def __init__(self, new_shashangli):
        self.shashangli = new_shashangli

    def shanghai(self, diren):
        diren.diaoxue(self.shashangli)

# 创建老王对象
lao_wang = Person("老王")

# 创建一把枪
ak47 = Gun("AK47")

# 创建一个弹夹
dan_jia = Danjia(20)  # 表示最大能够容纳20发子弹

# 创建一颗子弹
bullet = Bullet(10)  # 表示每颗子弹的杀伤力

# 老王把一个子弹放到弹夹中
lao_wang.anzhuang_zidan(dan_jia, bullet)

# 测试弹夹的信息
print(dan_jia)

# 老王把弹夹放到枪中
lao_wang.anzhuang_danjia(ak47, dan_jia)

# 测试枪的信息
print(ak47)

# 老王拿起枪
lao_wang.na_gun(ak47)

# 测试老王的信息
print(lao_wang)

# 创建一个敌人
gebi_laowang = Person("隔壁老王")

# 老王向隔壁老王开枪
lao_wang.kaiqiang(gebi_laowang)

# 测试隔壁老王
print(gebi_laowang)

# 创建一些子弹
for i in range(5):
    bullet = Bullet(10)  # 表示每颗子弹的杀伤力
    # 每创建一颗子弹就让老王把它放到弹夹中
    lao_wang.anzhuang_zidan(dan_jia, bullet)

lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)
lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)
lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)
lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)
lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)
lao_wang.kaiqiang(gebi_laowang)
print(gebi_laowang)