人狗大战Ⅱ

news/2025/10/22 17:45:02/文章来源:https://www.cnblogs.com/wangya216/p/19158579
import random# 1. 元类:追踪所有角色类的创建
class MetaCharacter(type):"""元类:记录所有角色类并自动添加种族标识"""character_types = []  # 存储所有角色类def __new__(cls, name: str, bases: tuple, namespace: dict):new_cls = super().__new__(cls, name, bases, namespace)if name != "BaseCharacter":  # 排除基类cls.character_types.append(new_cls)print(f"元类创建角色类: {name}")return new_cls# 2. 基类:所有角色的抽象基类,由元类MetaCharacter创建
class BaseCharacter(metaclass=MetaCharacter):"""角色基类,定义核心属性与行为"""__slots__ = ("_name", "_hp", "_attack", "_defense")  # 限制动态属性race: str = "Unknown"  # 类属性:种族标识default_hp: int = 100  # 类属性:默认生命值 hp的全称为health points default_attack: int = 10  # 类属性:默认攻击力default_defense: int = 5  # 类属性:默认防御力  def __init__(self, name: str):# 私有属性:名称、生命值、攻击力、防御力self._name = name.strip()  # 移除首尾空格,标准化名称 self._hp = self.default_hp  # 初始化生命值为默认值self._attack = self.default_attack  # 初始化攻击力为默认值self._defense = self.default_defense  # 初始化防御力为默认值# 封装:属性访问控制@propertydef name(self) -> str:return self._name@propertydef hp(self) -> int:return self._hp@hp.setter # 生命值 setter 方法,确保非负def hp(self, value: int):self._hp = max(0, value)  # 确保生命值不为负@propertydef attack(self) -> int:return self._attack@attack.setter  # 攻击力 setter 方法,确保非负def attack(self, value: int):if value < 0:raise ValueError("攻击力不能为负")self._attack = value# 类方法:批量设置种族默认属性@classmethoddef set_race_defaults(cls, hp: int, attack: int, defense: int): # 生命值、攻击力、防御力的默认值cls.default_hp = hpcls.default_attack = attackcls.default_defense = defenseprint(f"[{cls.race}] 种族默认属性更新: HP={hp}, 攻击={attack}, 防御={defense}")# 静态方法:伤害计算工具@staticmethoddef calculate_damage(attacker: 'BaseCharacter', defender: 'BaseCharacter') -> int:base_damage = max(1, attacker.attack - defender._defense // 2)# 生命值低于30%时伤害加成if defender.hp < defender.default_hp * 0.3:base_damage = int(base_damage * 1.5)return base_damage# 核心方法:攻击目标(多态基础)def attack_target(self, target: 'BaseCharacter'):if self.hp <= 0:print(f"{self.name}已倒下,无法攻击!")returnif target.hp <= 0: print(f"{target.name}已被击败,无需攻击!")return# 只要目标生命值大于0,就可以攻击damage = self.calculate_damage(self, target)target.hp -= damageprint(f"{self.name}攻击了{target.name},造成{damage}点伤害!")if target.hp <= 0:print(f"{target.name}被击败了!")# 特殊方法:字符串表示def __str__(self) -> str:return f"{self.race} {self.name} | HP: {self.hp}/{self.default_hp} | 攻击: {self.attack} | 防御: {self._defense}"# 特殊方法:角色组合(组队)def __add__(self, other: 'BaseCharacter') -> 'Team':if not isinstance(other, BaseCharacter):raise TypeError("只能与角色组队")return Team([self, other])# 特殊方法:调用实例使用技能def __call__(self, skill: 'BaseSkill'): # 鸭子类型:只要有cast方法即可if self.hp <= 0:print(f"{self.name}无法使用技能(已倒下)")returnskill.cast(self)  # 调用技能的cast方法,返回伤害值# 3. 类装饰器:添加临时增益效果
def temporary_buff(bonus_hp: int = 0, bonus_attack: int = 0):"""类装饰器:为角色添加临时属性加成(兼容 __slots__,不新增实例字段)"""def decorator(cls):original_init = cls.__init__def new_init(self, *args, **kwargs):# 先调用原始初始化,确保已有的 __slots__ 字段就绪original_init(self, *args, **kwargs)# 直接将加成体现在现有的基础属性上,避免新增字段触发 __slots__ 限制self.hp += bonus_hpself.attack = self.attack + bonus_attackprint(f"{self.name}获得临时增益: HP+{bonus_hp}, 攻击+{bonus_attack}")# 不重写 attack property,避免访问不存在的 _bonus_attack 字段cls.__init__ = new_initreturn clsreturn decorator# 4. 武器类(组合关系:角色持有武器)
class Weapon:"""武器类,与角色形成组合关系"""__slots__ = ("_name", "_damage", "_durability")  # 限制属性def __init__(self, name: str, damage: int, durability: int = 100):self._name = nameself._damage = damageself._durability = durability@propertydef name(self) -> str:return self._name@propertydef damage(self) -> int:return self._damage if self._durability > 0 else 0@propertydef durability(self) -> int:return self._durabilitydef use(self) -> int:"""使用武器,消耗耐久度"""if self._durability <= 0:print(f"{self.name}已损坏,无法使用!")return 0self._durability = max(0, self._durability - 10)return self._damagedef __str__(self) -> str:return f"[{self.name} 伤害:{self.damage} 耐久:{self.durability}%]"# 5. 人类类(继承+多态+组合)
@temporary_buff(bonus_hp=20, bonus_attack=3)  # 应用类装饰器
class Human(BaseCharacter):"""人类角色类"""race = "Human"__slots__ = ("_intelligence", "_weapon")  # 扩展基类slotsdef __init__(self, name: str, intelligence: int = 5, weapon: Weapon = None):super().__init__(name)  # 调用父类构造self._intelligence = intelligence# 组合关系:人类必须持有武器(默认拳头)self._weapon = weapon or Weapon("拳头", 2)@propertydef intelligence(self) -> int:return self._intelligence@intelligence.setterdef intelligence(self, value: int):self._intelligence = max(0, value)@propertydef weapon(self) -> Weapon:return self._weapon# 多态:重写攻击方法(使用武器)def attack_target(self, target: BaseCharacter):weapon_damage = self._weapon.use()original_attack = self.attackself.attack += weapon_damage  # 临时叠加武器伤害super().attack_target(target)  # 调用父类攻击逻辑self.attack = original_attack  # 恢复原始攻击print(f"[{self.weapon}]造成额外{weapon_damage}点伤害")def __str__(self) -> str:base_str = super().__str__()return f"{base_str} | 智力: {self._intelligence} | 武器: {self._weapon}"# 6. 狗类(继承+多态)
class Dog(BaseCharacter):"""狗角色类"""race = "Dog"__slots__ = ("_agility", "_breed")  # 扩展属性def __init__(self, name: str, breed: str = "普通犬", agility: int = 8):super().__init__(name)self._agility = agilityself._breed = breed@propertydef agility(self) -> int:return self._agility@agility.setterdef agility(self, value: int):self._agility = max(0, value)# 多态:重写攻击方法(敏捷影响暴击)def attack_target(self, target: BaseCharacter):# 敏捷越高,暴击概率越高crit_prob = self._agility / 20is_crit = random.random() < crit_proboriginal_attack = self.attackif is_crit:self.attack *= 2print(f"{self.name}触发暴击!攻击翻倍!")super().attack_target(target)self.attack = original_attack  # 恢复def __str__(self) -> str:base_str = super().__str__()return f"{base_str} | 品种: {self._breed} | 敏捷: {self._agility}"# 7. 技能系统(鸭子类型)
class BaseSkill:"""技能基类,定义鸭子类型接口"""def __init__(self, name: str, cost: int = 10):self.name = nameself.cost = cost  # 技能消耗(生命值)def cast(self, caster: BaseCharacter) -> int: # 施法逻辑(必须实现)    """施法逻辑(必须实现)"""raise NotImplementedError("技能必须实现cast方法")class FireballSkill(BaseSkill): """火球术(人类专属)"""def __init__(self):super().__init__("火球术", cost=15)def cast(self, caster: BaseCharacter) -> int: # 施法逻辑(必须实现)"""施法逻辑(必须实现)"""if not isinstance(caster, Human):print(f"{caster.name}无法使用火球术(非人类)")returnif caster.hp < self.cost:print(f"{caster.name}生命值不足,无法释放{self.name}")return# 消耗生命值,伤害与智力相关caster.hp -= self.costdamage = 20 + caster.intelligence * 3print(f"{caster.name}释放{self.name},消耗{self.cost}HP,造成{damage}点火焰伤害!")return damageclass BiteSkill(BaseSkill):"""撕咬(狗专属)"""def __init__(self):super().__init__("疯狂撕咬", cost=5)def cast(self, caster: BaseCharacter) -> int: # 施法逻辑(必须实现)"""施法逻辑(必须实现)"""  if not isinstance(caster, Dog):print(f"{caster.name}无法使用撕咬(非犬类)")returnif caster.hp < self.cost:print(f"{caster.name}生命值不足,无法释放{self.name}")return# 消耗生命值,伤害与敏捷相关caster.hp -= self.costdamage = 15 + caster.agility * 2print(f"{caster.name}使用{self.name},消耗{self.cost}HP,造成{damage}点撕裂伤害!")return damage# 8. 队伍类(聚合关系)
class Team:"""队伍类,聚合多个角色(角色可属于多个队伍)"""def __init__(self, members): # members 队伍成员列表self.members = membersdef __str__(self) -> str:return f"队伍成员: {[m.name for m in self.members]}"def is_defeated(self) -> bool:"""判断队伍是否全灭"""return all(m.hp <= 0 for m in self.members)def attack(self, enemy_team: 'Team'):"""队伍攻击另一队伍(支持技能释放)"""if self.is_defeated():print("己方队伍已全灭,无法攻击!")returnif enemy_team.is_defeated():print("敌方队伍已全灭,无需攻击!")returnprint("\n----- 队伍交锋 -----")for attacker in self.members:if attacker.hp <= 0:continue# 随机选择敌方目标targets = [e for e in enemy_team.members if e.hp > 0]if not targets:continuetarget = random.choice(targets)used_skill = False# 概率释放各自专属技能if isinstance(attacker, Human) and random.random() < 0.4:damage = FireballSkill().cast(attacker)if isinstance(damage, int) and damage > 0:target.hp -= damageprint(f"{attacker.name}用技能对{target.name}造成{damage}点伤害!")if target.hp <= 0:print(f"{target.name}被击败了!")used_skill = Trueelif isinstance(attacker, Dog) and random.random() < 0.5:damage = BiteSkill().cast(attacker)if isinstance(damage, int) and damage > 0:target.hp -= damageprint(f"{attacker.name}用技能对{target.name}造成{damage}点伤害!")if target.hp <= 0:print(f"{target.name}被击败了!")used_skill = Trueif not used_skill:attacker.attack_target(target)# 9. 战斗系统(关联关系)
class Battle:"""战斗场景,关联多个角色/队伍"""def __init__(self, team1: Team, team2: Team):self.team1 = team1self.team2 = team2self.round = 0def start(self, max_rounds: int = 5):"""开始战斗,最多进行max_rounds回合"""print("\n===== 人狗大战 正式开始 =====")while self.round < max_rounds:self.round += 1print(f"\n===== 第{self.round}回合 =====")# 随机决定先手if random.random() < 0.5:self.team1.attack(self.team2)if self.team2.is_defeated():breakself.team2.attack(self.team1)else:self.team2.attack(self.team1)if self.team1.is_defeated():breakself.team1.attack(self.team2)# 检查是否有队伍全灭if self.team1.is_defeated() or self.team2.is_defeated():break# 战斗结果print("\n===== 战斗结束 =====")if self.team1.is_defeated():print("狗队获胜!")elif self.team2.is_defeated():print("人类队获胜!")else:print("平局!")# 打印最终状态print("\n【最终状态】")for m in self.team1.members + self.team2.members:print(m)# 测试代码
if __name__ == "__main__":# 配置种族默认属性Human.set_race_defaults(hp=150, attack=12, defense=8)Dog.set_race_defaults(hp=120, attack=15, defense=5)# 创建武器sword = Weapon("精铁剑", 10, durability=90)axe = Weapon("巨斧", 15, durability=60)# 创建角色alice = Human("Alice", intelligence=9, weapon=sword)bob = Human("Bob", intelligence=6, weapon=axe)dog1 = Dog("大黄", breed="藏獒", agility=12)dog2 = Dog("小黑", breed="狼犬", agility=10)# 打印初始状态print("\n【初始状态】")print(alice)print(bob)print(dog1)print(dog2)# 测试组队(__add__方法)team_human = alice + bobteam_dog = dog1 + dog2print(f"\n{team_human}")print(f"{team_dog}")# 测试技能使用(__call__方法)print("\n【技能测试】")alice(FireballSkill())  # alice使用火球术dog1(BiteSkill())       # dog1使用撕咬# 开始战斗battle = Battle(team_human, team_dog)battle.start(max_rounds=4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但应该与QVideoWidget 配合使用以显示视频画面。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【IEEE出版、往届会后3个月检索】2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025)

2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025) 9th International Workshop on Control Engineering and Advanced Algorithms 高届数会议!IWCEAA 2024已于会后3个多月完成见刊检索 本届会议已申请到IEEE出版,…

设计模式(C++)详解——命令模式(1) - 指南

设计模式(C++)详解——命令模式(1) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

整装定制家具生产厂家口碑榜:TOP3企业智能制造实力深度解析

随着家居产业升级和消费需求变革,整装定制家具市场呈现快速增长态势。行业数据显示,2024年中国定制家具市场规模预计突破4800亿元,智能制造渗透率已达65%以上。本文基于企业生产能力、技术研发水平、数字化建设及服…

实用指南:阿里云安装Docker

实用指南:阿里云安装Dockerpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

给大家分享三个特别好用的在线工具,可以为你的工作节省很多时间

给大家分享三个特别好用的在线工具,可以为你的工作节省很多时间 有工具需求的,大家可以点赞收藏一下 1.All to All 一个万能的在线格式转换站,文件类型覆盖特别全,而且是免费的 无论你是要把文档变成PDF、图片转成…

2025 年振动筛源头厂家最新推荐榜单:权威甄选实验 / 防爆 / 精细筛分设备,揭秘靠谱供应企业

引言 2025 年全球振动筛市场规模持续扩大,设备需求已延伸至矿业、化工、食品、环保等数十个领域,但市场乱象却让企业采购陷入困境。行业集中度低、中小厂家扎堆,部分企业缺乏核心技术,导致设备存在筛分效率低、能耗…

2025 年最新推荐摇摆筛厂家榜单:聚焦实力雄厚供货稳定品牌,助力企业精准选购筛分设备方形/圆形/石英砂/砂石/精细摇摆筛厂家推荐

引言 在当前工业生产快速发展的背景下,摇摆筛作为物料处理关键设备,市场需求持续增长,但同时也面临品牌繁杂、产品质量良莠不齐的局面。众多企业在选购时,常遭遇设备筛分效率低、定制化能力不足、售后响应慢等问题…

江苏国际陆运物流公司口碑榜:TOP7企业服务能力全景解析

在长三角一体化发展战略推动下,江苏省作为制造业重镇,其国际陆运物流需求呈现持续增长态势。行业统计数据显示,2024年江苏省国际物流市场规模预计突破2800亿元,其中陆运业务占比达42%。本文基于企业服务网络、运营…

高性能超低功耗蓝牙电子价签方案 OM6626 NRF52832

方案介绍 在智慧零售浪潮席卷全球的今天,电子价签(ESL)正迅速取代传统纸质标签,成为门店数字化升级的核心入口。而驱动这场静默革命的核心引擎,正是依靠高性能超低功耗蓝牙系统级芯片(SoC)。 ​方案推荐芯片 电…

软工第三次作业-结对项目

软工第三次作业 小组成员 3123004287肖锦瑞 3123004268黄泽鹏 Github 仓库链接这个作业属于哪个课程 软件工程这个作业要求在哪里作业要求 作业要求这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序PSP 表…

2025 年中国校服厂家最新推荐榜单权威发布!深度解析优质品牌核心竞争力与选择指南

引言 我国中小学在校生规模已达 2.5 亿人,校服作为学生日常必备服饰,其品质与体验直接关系到千万家庭。然而当前市场仍存诸多痛点:部分产品面料安全不达标、版型不合身,洗后易变形褪色;设计同质化严重,既缺乏校园…

【IEEE出版 | EI检索稳定】第五届IEEE能源工程与电力系统国际学术会议(IEEE-EEPS 2025)

第五届IEEE能源工程与电力系统国际学术会议(IEEE-EEPS 2025),将于2025年10月31-11月2日在深圳召开。【IEEE冠名会议 | EI检索稳定】 【香港中文大学(深圳)主办】 第五届IEEE能源工程与电力系统国际学术会议(IEEE…

2025 年同步带厂家推荐:深入剖析浙江三星胶带有限公司,探寻橡胶带行业的优质之选

行业背景 在当今工业蓬勃发展的时代,汽车、摩托车、工业和农业机械设备、家用电器等领域持续扩张。传动胶带作为这些行业设备运转的关键零部件,其需求呈现出爆发式增长。市场对胶带产品的性能要求愈发严苛,不仅追求…

深夜的调试界面,藏着微信生态的黄金密码

2017年的夏天,广州的出租屋格外闷热。我对着电脑屏幕上的 PHP 代码敲到凌晨两点,烟灰缸里的烟蒂堆成了小山,心里却满是焦虑。作为一名刚入行三年的 PHP 开发者,我正陷入职业瓶颈:接的外包项目要么是重复的企业官网…

【题解】洛谷 P4096 [HEOI2013] Eden 的博弈树 | 更简洁的一种做法

洛谷 P4096 [HEOI2013] Eden 的博弈树,一种由 xzm 大神提供的更简洁做法。 首先需要从下往上求出以 \(i\) 为根的子树先后手的最小必胜集合大小,记为 \(f_{i,0/1}\)(\(0\) 为先手,\(1\) 为后手)。此外在转移同时维…

2025年丝杆升降机厂家最新行业推荐:联动丝杆升降机/螺旋丝杆升降机/蜗杆丝杆升降机/蜗轮丝杆升降机/三家兼顾工艺与适配性的实力厂家推荐

随着工业自动化领域对传动设备精度与适配性需求的不断提升,丝杆升降机作为关键传动部件,其生产厂家的工艺积累与场景适配能力愈发受到关注。以下三家厂家在丝杆升降机、螺旋升降机等品类的研发与生产中表现突出,其核…

智能配电变压器生产厂家口碑榜:基于技术实力、客户服务及市场反馈的专业评估

在智能电网建设快速推进的背景下,智能配电变压器作为配电网的核心设备,其技术水平和产品质量直接影响供电可靠性与能效水平。行业数据显示,2024年我国智能配电变压器市场规模预计将达到186亿元,年均复合增长率保持…

力扣300.最长递增子序列(经典dp)力扣375.猜数字II力扣.329矩阵最长的递增子序列力扣.33搜索旋转排序数组 - 详解

力扣300.最长递增子序列(经典dp)力扣375.猜数字II力扣.329矩阵最长的递增子序列力扣.33搜索旋转排序数组 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

Meta DINO系列论文浅读

Meta AI的DINO系列(DINO、DINOv2、DINOv3)代表了自监督视觉表示学习领域的重大进展。本报告系统性地分析了该系列模型的技术演进路径,从自监督学习的基础概念和传统方法的局限性出发,深入阐述了DINOv1、DINOv2和DI…