luliyu_python面向对象继承

本文介绍了一种不使用继承的策略,详细阐述了如何通过面向对象的方式让小鲁班在游戏对战中独立操作打大龙,避免了继承带来的复杂性。代码实例展示了如何封装英雄和怪物的行为,实现了战斗逻辑的灵活设计。

不使用继承进行鲁班打大龙的操作

# 封装/继承/多态
from random import randint
class Hero(object):
    def __init__(self, name, blood, strength):
        self.name = name
        self.blood = blood
        self.strength = strength
    def take_damage(self, monster):
        """承受攻击"""
        damage = randint(monster.strength-5, monster.strength+5)
        self.blood -= damage
        print(f'{self.name}你正在被{monster.name}攻击, 受到{damage}点伤害, 还剩{self.blood}滴血')
        if self.blood <=0:
            print(f"{self.name}你被杀死了, 胜败乃兵家常事!")
            return True
        else:
            return False
class Monster(object):
    def __init__(self, name, blood, strength):
        self.name = name
        self.blood = blood
        self.strength = strength

    def take_damage(self, hero):
        """承受攻击"""
        damage = randint(hero.strength - 5, hero.strength + 5)
        self.blood -= damage
        print(f'{self.name}你正在被{hero.name}攻击, 受到{damage}点伤害, 还剩{self.blood}滴血')
        if self.blood <= 0:
            print(f"{self.name}你被杀死了, 胜败乃兵家常事!")
            return True
        else:
            return False
if __name__ == '__main__':
    hero = Hero("小鲁班", 200, 100)
    monster = Monster("暴君", 1000, 25)
    while True:
        is_monster_died = monster.take_damage(hero)
        if is_monster_died:
            break
        is_hero_died =hero.take_damage(monster)
        if is_hero_died:
            break




class Vector(object):
    def __init__(self, lst):
        ## __value 属性私有化
        self.__value = lst[:]
    def __len__(self):
        """返回向量的长度"""
        return len(self.__value)
    def __getitem__(self, index):
        """支持下标访问"""
        return self.__value[index]
    def __add__(self, another):
        # 断言
        assert len(self) == len(another), "Error , 两个向量长度必须相等"
        return Vector([a+b for a, b in zip(self, another)])
    def __sub__(self, another):
        assert len(self) == len(another), "Error , 两个向量长度必须相等"
        return Vector([a - b for a, b in zip(self, another)])
    def __str__(self):
        return "({})".format(", ".join(str(e) for e in self.__value))
if __name__ == '__main__':
    v1 = Vector([1, 2, 3, 5])
    v2 = Vector([1, 2, 3, 5])
    ###
    print(v1)
    ls = [12, 34]
    print(len(ls))
    print(len(v1))
    print(ls[0])
    print(v1[0])
    print(v1[1])
    print("-"*20)
    print(v1 + v2)
    print(v1 - v2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值