核心玩法设计
-
团队组建:
- 玩家A和玩家B各自从「6个人类角色」中选2个,从「4种狗角色」中选1个,组成3人团队
- 每个角色有独特属性(生命值、攻击力、防御力、技能)
-
回合制对战:
- 玩家轮流操作(玩家A→玩家B→玩家A...)
- 每次操作可选择:「攻击敌方成员」「治疗己方成员」「使用技能」(部分角色有专属技能)
-
胜负规则:
- 一方团队所有成员生命值归0则失败,另一方获胜
完整代码实现
import random
from typing import List, Dict# 基础生物类(继承父类)
class Creature:def __init__(self, name: str, hp: int, attack: int, defense: int):self.name = name # 名称self.max_hp = hp # 最大生命值self.current_hp = hp # 当前生命值self.attack = attack # 攻击力self.defense = defense # 防御力self.is_alive = True # 是否存活def take_damage(self, damage: int) -> str:"""受到伤害(防御减免部分伤害)"""actual_damage = max(1, damage - self.defense) # 至少造成1点伤害self.current_hp -= actual_damageif self.current_hp <= 0:self.current_hp = 0self.is_alive = Falsereturn f"{self.name}受到{actual_damage}点伤害,已倒下!"return f"{self.name}受到{actual_damage}点伤害,剩余生命值:{self.current_hp}/{self.max_hp}"def heal(self, amount: int) -> str:"""治疗生命值"""self.current_hp = min(self.max_hp, self.current_hp + amount)return f"{self.name}恢复了{amount}点生命值,当前生命值:{self.current_hp}/{self.max_hp}"# 人类角色(继承Creature)
class Human(Creature):ROLES = { # 6个人类角色模板"战士": {"hp": 150, "attack": 25, "defense": 10, "skill": "狂怒一击(双倍伤害)"},"法师": {"hp": 80, "attack": 35, "defense": 5, "skill": "火球术(无视5点防御)"},"牧师": {"hp": 100, "attack": 15, "defense": 8, "skill": "强效治疗(恢复50点生命)"},"刺客": {"hp": 90, "attack": 30, "defense": 7, "skill": "偷袭(优先攻击,伤害+10)"},"骑士": {"hp": 130, "attack": 20, "defense": 15, "skill": "护盾(本回合减伤50%)"},"猎人": {"hp": 110, "attack": 28, "defense": 6, "skill": "精准射击(必中,伤害+5)"}}def __init__(self, name: str, role: str):role_data = self.ROLES[role]super().__init__(name, role_data["hp"], role_data["attack"], role_data["defense"])self.role = role # 职业self.skill = role_data["skill"] # 技能描述self.weapon = None # 武器(聚合关系)def use_skill(self, target) -> str:"""使用职业技能(不同职业效果不同)"""if not target.is_alive:return f"目标{target.name}已倒下,技能无效!"if self.role == "战士":damage = self.attack * 2 + (self.weapon.attack_buff if self.weapon else 0)return f"{self.name}使用狂怒一击!" + target.take_damage(damage)elif self.role == "法师":damage = self.attack + (self.weapon.attack_buff if self.weapon else 0)actual_damage = damage - max(0, target.defense - 5) # 无视5点防御return f"{self.name}使用火球术!" + target.take_damage(actual_damage)elif self.role == "牧师":return self.heal(50) # 牧师技能是治疗自己elif self.role == "刺客":damage = self.attack + 10 + (self.weapon.attack_buff if self.weapon else 0)return f"{self.name}使用偷袭!" + target.take_damage(damage)elif self.role == "骑士":self.defense += 5 # 本回合减伤(临时提升防御)return f"{self.name}开启护盾!本回合防御+5!"elif self.role == "猎人":damage = self.attack + 5 + (self.weapon.attack_buff if self.weapon else 0)return f"{self.name}使用精准射击!" + target.take_damage(damage)def attack_target(self, target) -> str:"""普通攻击"""if not target.is_alive:return f"目标{target.name}已倒下,无法攻击!"base_damage = self.attack + (self.weapon.attack_buff if self.weapon else 0)return f"{self.name}攻击{target.name}!" + target.take_damage(base_damage)# 狗角色(继承Creature)
class Dog(Creature):BREEDS = { # 4种狗角色模板"狼狗": {"hp": 120, "attack": 22, "defense": 8, "skill": "撕咬(造成流血,持续伤害)"},"藏獒": {"hp": 180, "attack": 18, "defense": 12, "skill": "冲撞(击退,降低目标防御2点)"},"边牧": {"hp": 90, "attack": 15, "defense": 6, "skill": "辅助(提升己方随机成员攻击3点)"},"杜宾": {"hp": 110, "attack": 25, "defense": 7, "skill": "突袭(无视目标3点防御)"}}def __init__(self, name: str, breed: str):breed_data = self.BREEDS[breed]super().__init__(name, breed_data["hp"], breed_data["attack"], breed_data["defense"])self.breed = breed # 品种self.skill = breed_data["skill"] # 技能描述self.collar = None # 项圈(聚合关系,减伤)def use_skill(self, target, ally_team=None) -> str:"""使用狗类技能(部分需要队友信息)"""if not target.is_alive and self.breed != "边牧":return f"目标{target.name}已倒下,技能无效!"if self.breed == "狼狗":# 撕咬:造成伤害+持续流血(下回合额外5点伤害)base_damage = self.attack + (self.collar.defense_buff if self.collar else 0)result = f"{self.name}使用撕咬!" + target.take_damage(base_damage)target.bleed = True # 标记流血状态return result + "(目标进入流血状态,下回合额外受5点伤害)"elif self.breed == "藏獒":base_damage = self.attack + (self.collar.defense_buff if self.collar else 0)result = f"{self.name}使用冲撞!" + target.take_damage(base_damage)target.defense -= 2 # 降低目标防御return result + "(目标防御降低2点)"elif self.breed == "边牧":# 辅助队友:随机提升己方1名成员攻击if not ally_team:return "边牧技能需要队友信息!"ally = random.choice([m for m in ally_team if m.is_alive])ally.attack += 3return f"{self.name}使用辅助!{ally.name}攻击+3(当前攻击:{ally.attack})"elif self.breed == "杜宾":base_damage = self.attack + (self.collar.defense_buff if self.collar else 0)actual_damage = base_damage - max(0, target.defense - 3) # 无视3点防御return f"{self.name}使用突袭!" + target.take_damage(actual_damage)def attack_target(self, target) -> str:"""普通攻击(项圈提供防御加成,但不直接提升攻击)"""if not target.is_alive:return f"目标{target.name}已倒下,无法攻击!"base_damage = self.attackreturn f"{self.name}攻击{target.name}!" + target.take_damage(base_damage)# 武器(聚合到Human)
class Weapon:def __init__(self, name: str, attack_buff: int):self.name = nameself.attack_buff = attack_buff # 攻击加成def __str__(self):return f"{self.name}(攻击+{self.attack_buff})"# 项圈(聚合到Dog)
class Collar:def __init__(self, name: str, defense_buff: int):self.name = nameself.defense_buff = defense_buff # 防御加成def __str__(self):return f"{self.name}项圈(防御+{self.defense_buff})"# 药水(依赖关系,用完即弃)
class Potion:def __init__(self, heal_amount: int, name: str = "治疗药水"):self.heal_amount = heal_amountself.name = namedef __str__(self):return f"{self.name}(恢复{self.heal_amount}点生命)"# 玩家团队类
class PlayerTeam:def __init__(self, player_name: str):self.player_name = player_name # 玩家名称self.members = [] # 团队成员(2个人类+1只狗)def add_member(self, member: Creature) -> str:"""添加团队成员"""if len(self.members) >= 3:return "团队已满(最多3人)!"self.members.append(member)return f"{self.player_name}的团队加入了:{member.name}({member.role if isinstance(member, Human) else member.breed})"def is_defeated(self) -> bool:"""判断团队是否全灭"""return all(not m.is_alive for m in self.members)def show_status(self) -> str:"""显示团队当前状态"""status = f"\n【{self.player_name}的团队状态】\n"for i, member in enumerate(self.members, 1):alive_tag = "存活" if member.is_alive else "已倒下"status += f"{i}. {member.name}({member.role if isinstance(member, Human) else member.breed}):"status += f"生命{member.current_hp}/{member.max_hp},攻击{member.attack},防御{member.defense},{alive_tag}\n"return status# 游戏主控制器
class Game:def __init__(self):self.player_a = None # 玩家A团队self.player_b = None # 玩家B团队self.turn = 0 # 回合数def create_teams(self):"""创建玩家团队(选择角色)"""print("=== 欢迎来到人狗大战回合制游戏 ===")# 玩家A创建团队print("\n【玩家A创建团队】")player_a_name = input("请输入你的名称:")self.player_a = PlayerTeam(player_a_name)self._choose_members(self.player_a)# 玩家B创建团队(可改为真人或AI,这里默认真人)print("\n【玩家B创建团队】")player_b_name = input("请输入你的名称:")self.player_b = PlayerTeam(player_b_name)self._choose_members(self.player_b)def _choose_members(self, team: PlayerTeam):"""选择团队成员(2人类+1狗)"""# 选择人类角色print("\n可选人类角色:", list(Human.ROLES.keys()))for i in range(2):while True:role = input(f"请选择第{i+1}个人类角色(输入角色名):")if role in Human.ROLES:name = input(f"给{role}起个名字:")human = Human(name, role)# 随机分配武器weapons = [Weapon("长剑", 5), Weapon("斧头", 6), Weapon("法杖", 4)]human.weapon = random.choice(weapons)print(team.add_member(human))print(f"{name}装备了:{human.weapon}")breakelse:print("角色不存在,请重新输入!")# 选择狗角色print("\n可选狗角色:", list(Dog.BREEDS.keys()))while True:breed = input("请选择1只狗角色(输入品种名):")if breed in Dog.BREEDS:name = input(f"给{breed}起个名字:")dog = Dog(name, breed)# 随机分配项圈collars = [Collar("皮革", 2), Collar("金属", 3), Collar("魔法", 4)]dog.collar = random.choice(collars)print(team.add_member(dog))print(f"{name}戴上了:{dog.collar}")breakelse:print("狗品种不存在,请重新输入!")def parse_command(self, command: str, attacker_team, defender_team) -> str:"""解析玩家输入的指令(格式:操作 目标)"""command = command.strip().lower()# 攻击指令:"攻击 玩家b的1号" 或 "攻击 2"(简化:直接输入目标序号)if command.startswith("攻击"):try:target_idx = int(command.split()[-1]) - 1 # 目标序号(1-based→0-based)if 0 <= target_idx < len(defender_team.members):target = defender_team.members[target_idx]# 选择己方存活成员进行攻击attacker = self._choose_attacker(attacker_team)if attacker:return attacker.attack_target(target)else:return "己方已无存活成员,无法攻击!"else:return "目标序号无效!"except (ValueError, IndexError):return "指令格式错误!攻击指令示例:'攻击 1'(攻击敌方1号成员)"# 技能指令:"技能 玩家b的2号" 或 "技能 1"elif command.startswith("技能"):try:target_idx = int(command.split()[-1]) - 1if 0 <= target_idx < len(defender_team.members) or (attacker_team.members[0].breed == "边牧" and target_idx == -1):target = defender_team.members[target_idx] if target_idx != -1 else Noneattacker = self._choose_attacker(attacker_team)if attacker:if isinstance(attacker, Dog) and attacker.breed == "边牧":return attacker.use_skill(target, attacker_team.members) # 边牧技能需要队友else:return attacker.use_skill(target)else:return "己方已无存活成员,无法使用技能!"else:return "目标序号无效!"except (ValueError, IndexError):return "指令格式错误!技能指令示例:'技能 1'(对敌方1号使用技能)"# 治疗指令:"治疗 己方2号" 或 "治疗 1"elif command.startswith("治疗"):try:ally_idx = int(command.split()[-1]) - 1if 0 <= ally_idx < len(attacker_team.members):ally = attacker_team.members[ally_idx]if not ally.is_alive:return "目标已倒下,无法治疗!"# 随机使用药水(依赖关系)potion = Potion(random.randint(20, 40))return f"{ally.name}使用了{potion}!" + ally.heal(potion.heal_amount)else:return "己方成员序号无效!"except (ValueError, IndexError):return "指令格式错误!治疗指令示例:'治疗 1'(治疗己方1号成员)"else:return "无效指令!支持指令:攻击 目标序号 / 技能 目标序号 / 治疗 己方序号(序号从1开始)"def _choose_attacker(self, team: PlayerTeam) -> Creature:"""选择己方一个存活成员执行操作(这里简化为随机,可改为玩家指定)"""alive_members = [m for m in team.members if m.is_alive]if not alive_members:return None# 显示可选攻击者,让玩家选择(增强交互)print(f"\n请选择执行操作的成员(序号):")for i, m in enumerate(alive_members, 1):print(f"{i}. {m.name}({m.role if isinstance(m, Human) else m.breed},生命{m.current_hp}/{m.max_hp})")while True:try:idx = int(input("输入序号:")) - 1return alive_members[idx]except (ValueError, IndexError):print("序号无效,请重新输入!")def handle_bleed(self, members: List[Creature]) -> str:"""处理流血状态(狼狗技能效果)"""result = ""for member in members:if hasattr(member, "bleed") and member.bleed and member.is_alive:member.take_damage(5)result += f"{member.name}流血了,额外受到5点伤害!当前生命:{member.current_hp}/{member.max_hp}\n"member.bleed = False # 重置流血状态return resultdef start_battle(self):"""开始战斗回合"""print("\n=== 战斗开始! ===")current_player = self.player_a # 先手玩家Aopponent = self.player_bwhile True:self.turn += 1print(f"\n===== 第{self.turn}回合:{current_player.player_name}的回合 =====")# 显示双方状态print(current_player.show_status())print(opponent.show_status())# 处理上回合流血状态bleed_result = self.handle_bleed(current_player.members)if bleed_result:print(f"\n【状态触发】{bleed_result}")# 检查是否有一方已全灭if current_player.is_defeated():print(f"\n{current_player.player_name}的团队全灭!{opponent.player_name}获胜!")breakif opponent.is_defeated():print(f"\n{opponent.player_name}的团队全灭!{current_player.player_name}获胜!")break# 玩家输入指令command = input(f"\n{current_player.player_name},请输入操作指令(攻击/技能/治疗 + 目标序号):")action_result = self.parse_command(command, current_player, opponent)print(f"\n【操作结果】{action_result}")# 切换回合current_player, opponent = opponent, current_player# 启动游戏
if __name__ == "__main__":game = Game()game.create_teams()game.start_battle()
游戏亮点与玩法说明
-
角色多样性:
- 6个人类职业(战士/法师/牧师等)和4种狗(狼狗/藏獒等),各有专属技能(如战士的双倍伤害、边牧的队友 buff)
- 随机分配武器/项圈,增加每次游戏的差异性
-
策略性操作:
- 攻击:选择敌方成员进行普通攻击
- 技能:使用职业专属技能(如牧师治疗、狼狗流血)
- 治疗:使用药水恢复己方成员生命
- 需根据战场状态决策(优先集火敌方输出?治疗残血队友?)
-
文本交互流程:
- 团队创建时选择角色并命名
- 回合中输入指令(如“攻击 2”表示攻击敌方2号成员)
- 实时显示双方生命值、攻击/防御变化,清晰掌握战局
-
状态机制:
- 流血效果(狼狗技能):下回合额外受伤
- 防御/攻击临时加成(骑士护盾、边牧辅助)
- 武器/项圈提供固定加成(聚合关系体现)
示例操作流程
- 玩家A和B分别输入名称,选择2个人类+1只狗组成团队
- 回合开始,显示双方成员状态(生命值、职业等)
- 玩家A输入指令(如“技能 1”,用战士的狂怒一击攻击敌方1号)
- 系统执行操作并显示结果(如“Alice使用狂怒一击!Bob受到50点伤害...”)
- 切换到玩家B回合,重复操作
- 一方全灭则游戏结束,显示获胜方
这个版本保留了原有的面向对象设计(继承、聚合、依赖),同时通过团队系统、技能机制和文本交互大幅提升了游戏性,支持双人对战和策略决策,适合作为入门级回合制游戏案例扩展。