import random
import time
class Item:
"""装备类,包含武器和防具"""
def __init__(self, name, item_type, attack_bonus=0, defense_bonus=0, description=""):
self.name = name
self.item_type = item_type # "weapon" 或 "armor"
self.attack_bonus = attack_bonus
self.defense_bonus = defense_bonus
self.description = description
def __str__(self):
if self.item_type == "weapon":
return f"{self.name} (武器): +{self.attack_bonus} 攻击 | {self.description}"
else:
return f"{self.name} (防具): +{self.defense_bonus} 防御 | {self.description}"
class Skill:
"""技能类"""
def __init__(self, name, damage, mp_cost, accuracy=100, description=""):
self.name = name
self.damage = damage
self.mp_cost = mp_cost
self.accuracy = accuracy # 命中率百分比
self.description = description
def __str__(self):
return f"{self.name}: 伤害 {self.damage}, 消耗 MP {self.mp_cost}, 命中率 {self.accuracy}% | {self.description}"
class Character:
"""角色基类,玩家和怪物都继承自此"""
def __init__(self, name, hp, mp, attack, defense, speed):
self.name = name
self.max_hp = hp
self.hp = hp
self.max_mp = mp
self.mp = mp
self.base_attack = attack
self.base_defense = defense
self.speed = speed
self.skills = []
self.weapon = None
self.armor = None
@property
def total_attack(self):
"""计算总攻击力(基础攻击+武器加成)"""
bonus = self.weapon.attack_bonus if self.weapon else 0
return self.base_attack + bonus
@property
def total_defense(self):
"""计算总防御力(基础防御+防具加成)"""
bonus = self.armor.defense_bonus if self.armor else 0
return self.base_defense + bonus
def is_alive(self):
"""检查角色是否存活"""
return self.hp > 0
def take_damage(self, damage):
"""受到伤害"""
# 伤害不会低于1
actual_damage = max(1, damage - self.total_defense)
self.hp = max(0, self.hp - actual_damage)
return actual_damage
def use_skill(self, skill, target):
"""使用技能攻击目标"""
if self.mp < skill.mp_cost:
print(f"{self.name}的MP不足,无法使用{skill.name}!")
return False
self.mp -= skill.mp_cost
print(f"{self.name}使用了{skill.name}!")
# 检查技能是否命中
if random.randint(1, 100) <= skill.accuracy:
damage = skill.damage
actual_damage = target.take_damage(damage)
print(f"{target.name}受到了{actual_damage}点伤害!")
return True
else:
print(f"{skill.name}没有命中!")
return False
def basic_attack(self, target):
"""基础攻击"""
damage = self.total_attack
actual_damage = target.take_damage(damage)
print(f"{self.name}对{target.name}进行了普通攻击!")
print(f"{target.name}受到了{actual_damage}点伤害!")
return actual_damage
def __str__(self):
return (f"{self.name} - HP: {self.hp}/{self.max_hp} | MP: {self.mp}/{self.max_mp} | "
f"攻击: {self.total_attack} | 防御: {self.total_defense} | 速度: {self.speed}")
class Player(Character):
"""玩家类"""
def __init__(self, name):
# 初始属性
super().__init__(name, hp=100, mp=50, attack=15, defense=5, speed=8)
self.inventory = []
self.level = 1
self.exp = 0
self.exp_to_next_level = 50
# 初始技能
self.skills.append(Skill("火球术", 20, 10, 90, "释放一个火球攻击敌人"))
self.skills.append(Skill("重击", 25, 5, 80, "强力的一击,但命中率较低"))
def add_exp(self, amount):
"""增加经验值,可能升级"""
self.exp += amount
print(f"获得了{amount}点经验值!")
while self.exp >= self.exp_to_next_level:
self.level_up()
def level_up(self):
"""升级,提升属性"""
self.level += 1
self.exp -= self.exp_to_next_level
self.exp_to_next_level = int(self.exp_to_next_level * 1.5)
# 属性提升
self.max_hp += 30
self.hp = self.max_hp
self.max_mp += 15
self.mp = self.max_mp
self.base_attack += 5
self.base_defense += 3
self.speed += 1
print(f"恭喜!{self.name}升级到了{self.level}级!")
print(f"属性提升:HP+30, MP+15, 攻击+5, 防御+3, 速度+1")
def add_item(self, item):
"""添加物品到背包"""
self.inventory.append(item)
print(f"获得了{item.name}!")
def equip_item(self, index):
"""装备物品"""
if 0 <= index < len(self.inventory):
item = self.inventory[index]
if item.item_type == "weapon":
if self.weapon:
print(f"卸下了{self.weapon.name}")
self.weapon = item
print(f"装备了{self.weapon.name}")
elif item.item_type == "armor":
if self.armor:
print(f"卸下了{self.armor.name}")
self.armor = item
print(f"装备了{self.armor.name}")
return True
return False
def show_inventory(self):
"""显示背包"""
if not self.inventory:
print("背包是空的")
return False
print("\n===== 背包 =====")
for i, item in enumerate(self.inventory):
print(f"{i+1}. {item}")
print("================")
return True
class Monster(Character):
"""怪物类"""
def __init__(self, name, level):
# 根据等级生成属性
hp = 30 + level * 15
mp = 10 + level * 5
attack = 8 + level * 3
defense = 2 + level * 2
speed = 5 + level * 1
super().__init__(name, hp, mp, attack, defense, speed)
# 怪物可能拥有的技能
if level >= 2:
self.skills.append(Skill("爪击", 10 + level * 2, 3, 95, "用锋利的爪子攻击"))
if level >= 3:
self.skills.append(Skill("咆哮", 5 + level * 3, 5, 85, "发出震耳欲聋的咆哮"))
def get_reward(self):
"""返回击败怪物的奖励"""
exp = 10 + self.level * 15
gold = 5 + self.level * 5
# 随机掉落物品
item_chance = random.randint(1, 10)
item = None
if item_chance >= 8: # 20%的几率掉落物品
item_types = [
Item("铁剑", "weapon", 5 + self.level, 0, "一把坚固的铁剑"),
Item("皮甲", "armor", 0, 3 + self.level, "由坚韧皮革制成的护甲"),
Item("钢斧", "weapon", 7 + self.level, 0, "锋利的钢斧,伤害更高"),
Item("链甲", "armor", 0, 5 + self.level, "由金属链制成的护甲")
]
item = random.choice(item_types)
return exp, gold, item
def create_random_monster(level):
"""创建随机怪物"""
monster_names = [
"哥布林", "狼人", "骷髅兵", "史莱姆", "蜘蛛",
"食人魔", "吸血鬼", "僵尸", "巫师", "巨龙"
]
# 怪物等级在玩家等级附近波动
monster_level = max(1, level + random.randint(-1, 1))
name = random.choice(monster_names)
# 如果是精英怪,属性更强
is_elite = random.randint(1, 10) == 1 # 10%几率是精英怪
if is_elite:
monster = Monster(f"精英{name}", monster_level + 1)
monster.max_hp = int(monster.max_hp * 1.5)
monster.hp = monster.max_hp
monster.base_attack = int(monster.base_attack * 1.3)
return monster
return Monster(name, monster_level)
def battle(player, monster):
"""战斗系统"""
print(f"\n遭遇了{monster.name}!")
print(f"{monster.name} - 等级 {monster.level}")
# 决定先手
if player.speed >= monster.speed:
first, second = player, monster
else:
first, second = monster, player
# 战斗循环
while player.is_alive() and monster.is_alive():
print("\n" + "="*30)
print(f"{player.name}状态: HP {player.hp}/{player.max_hp} | MP {player.mp}/{player.max_mp}")
print(f"{monster.name}状态: HP {monster.hp}/{monster.max_hp}")
print("="*30 + "\n")
# 先手行动
if first == player:
# 玩家回合
print("你的回合!")
print("1. 普通攻击")
print("2. 使用技能")
choice = input("选择行动: ")
if choice == "1":
player.basic_attack(monster)
elif choice == "2":
if not player.skills:
print("你没有任何技能!")
player.basic_attack(monster)
else:
print("选择技能:")
for i, skill in enumerate(player.skills):
print(f"{i+1}. {skill}")
skill_choice = input("输入技能编号: ")
try:
skill_index = int(skill_choice) - 1
if 0 <= skill_index < len(player.skills):
player.use_skill(player.skills[skill_index], monster)
else:
print("无效的选择,将进行普通攻击")
player.basic_attack(monster)
except ValueError:
print("无效的输入,将进行普通攻击")
player.basic_attack(monster)
else:
print("无效的选择,将进行普通攻击")
player.basic_attack(monster)
else:
# 怪物回合
print(f"{monster.name}的回合!")
time.sleep(1)
# 怪物有30%几率使用技能
if monster.skills and random.randint(1, 10) <= 3 and monster.mp >= monster.skills[0].mp_cost:
skill = random.choice(monster.skills)
monster.use_skill(skill, player)
else:
monster.basic_attack(player)
# 检查是否有角色已死亡
if not player.is_alive() or not monster.is_alive():
break
# 后手行动
if second == player:
# 玩家回合
print("你的回合!")
print("1. 普通攻击")
print("2. 使用技能")
choice = input("选择行动: ")
if choice == "1":
player.basic_attack(monster)
elif choice == "2":
if not player.skills:
print("你没有任何技能!")
player.basic_attack(monster)
else:
print("选择技能:")
for i, skill in enumerate(player.skills):
print(f"{i+1}. {skill}")
skill_choice = input("输入技能编号: ")
try:
skill_index = int(skill_choice) - 1
if 0 <= skill_index < len(player.skills):
player.use_skill(player.skills[skill_index], monster)
else:
print("无效的选择,将进行普通攻击")
player.basic_attack(monster)
except ValueError:
print("无效的输入,将进行普通攻击")
player.basic_attack(monster)
else:
print("无效的选择,将进行普通攻击")
player.basic_attack(monster)
else:
# 怪物回合
print(f"{monster.name}的回合!")
time.sleep(1)
# 怪物有30%几率使用技能
if monster.skills and random.randint(1, 10) <= 3 and monster.mp >= monster.skills[0].mp_cost:
skill = random.choice(monster.skills)
monster.use_skill(skill, player)
else:
monster.basic_attack(player)
time.sleep(1)
# 战斗结束
if player.is_alive():
print(f"\n恭喜!你击败了{monster.name}!")
exp, gold, item = monster.get_reward()
player.add_exp(exp)
if item:
player.add_item(item)
# 战斗后恢复部分MP
player.mp = min(player.max_mp, player.mp + 10)
print(f"战斗结束,恢复了10点MP!")
return True
else:
print(f"\n很遗憾,你被{monster.name}击败了!")
return False
def main():
"""游戏主函数"""
print("欢迎来到冒险对战游戏!")
player_name = input("请输入你的名字: ")
player = Player(player_name)
# 给玩家初始装备
player.add_item(Item("木剑", "weapon", 3, 0, "一把简单的木剑"))
player.add_item(Item("布衣", "armor", 0, 2, "普通的布制衣服"))
player.equip_item(0) # 装备木剑
player.equip_item(1) # 装备布衣
print(f"\n欢迎,{player.name}!你的冒险开始了!")
while True:
print("\n===== 主菜单 =====")
print("1. 查看状态")
print("2. 查看技能")
print("3. 查看背包")
print("4. 装备物品")
print("5. 开始冒险(遭遇怪物)")
print("6. 退出游戏")
choice = input("请选择: ")
if choice == "1":
print("\n===== 角色状态 =====")
print(f"姓名: {player.name}")
print(f"等级: {player.level}")
print(f"经验: {player.exp}/{player.exp_to_next_level}")
print(f"HP: {player.hp}/{player.max_hp}")
print(f"MP: {player.mp}/{player.max_mp}")
print(f"攻击: {player.total_attack} (基础: {player.base_attack}{f', 武器: {player.weapon.attack_bonus}' if player.weapon else ''})")
print(f"防御: {player.total_defense} (基础: {player.base_defense}{f', 防具: {player.armor.defense_bonus}' if player.armor else ''})")
print(f"速度: {player.speed}")
print("====================")
elif choice == "2":
print("\n===== 技能列表 =====")
for skill in player.skills:
print(skill)
print("====================")
elif choice == "3":
player.show_inventory()
elif choice == "4":
if player.show_inventory():
try:
index = int(input("输入要装备的物品编号: ")) - 1
if not player.equip_item(index):
print("无效的物品编号")
except ValueError:
print("无效的输入")
elif choice == "5":
# 创建与玩家等级匹配的怪物
monster = create_random_monster(player.level)
result = battle(player, monster)
# 如果玩家战败,游戏结束
if not result:
print("\n游戏结束")
break
elif choice == "6":
print("感谢游玩!再见!")
break
else:
print("无效的选择,请重试")
input("\n按回车键继续...")
if __name__ == "__main__":
main()