import random
import time
from typing import List, Dict, Callable
class Skill:
def __init__(self, name: str, description: str, cost: int, effect: Callable):
self.name = name
self.description = description
self.mana_cost = cost
self.effect = effect # 效果函数,接收施法者和目标作为参数
class Character:
def __init__(self, name: str, health: int, mana: int, attack: int, defense: int):
self.name = name
self.health = health
self.max_health = health
self.mana = mana
self.max_mana = mana
self.attack = attack
self.defense = defense
self.skills: List[Skill] = []
def is_alive(self) -> bool:
return self.health > 0
def take_damage(self, amount: int) -> int:
actual = max(1, amount - self.defense // 2)
self.health = max(0, self.health - actual)
return actual
def restore_mana(self, amount: int) -> int:
restored = min(amount, self.max_mana - self.mana)
self.mana += restored
return restored
class Player(Character):
def __init__(self, name: str, faction: str):
# 根据阵营设定不同基础属性
if faction == "圣殿骑士":
super().__init__(name, 150, 60, 12, 10)
elif faction == "暗影兄弟会":
super().__init__(name, 100, 100, 15, 5)
else: # 法师议会
super().__init__(name, 80, 150, 8, 7)
self.faction = faction
self.level = 1
self.exp = 0
self.choices: Dict[str, str] = {} # 记录关键选择
self.inventory = {"治疗药水": 2}
# 初始技能
self._init_faction_skills()
def _init_faction_skills(self):
if self.faction == "圣殿骑士":
self.skills.append(Skill(
"神圣打击", "造成1.5倍伤害,恢复少量生命值", 10,
lambda caster, target: [
target.take_damage(int(caster.attack * 1.5)),
caster.take_damage(-5) # 负伤害即治疗
]
))
elif self.faction == "暗影兄弟会":
self.skills.append(Skill(
"潜行突袭", "高概率造成双倍伤害,失败则自身受伤", 15,
lambda caster, target: [
target.take_damage(caster.attack * 2) if random.random() > 0.3
else caster.take_damage(5)
]
))
else:
self.skills.append(Skill(
"火球术", "造成范围伤害", 20,
lambda caster, target: target.take_damage(caster.attack * 2)
))
def gain_exp(self, amount: int) -> bool:
self.exp += amount
if self.exp >= self.level * 100:
self.level_up()
return True
return False
def level_up(self):
self.level += 1
self.exp -= (self.level - 1) * 100
self.max_health += 30
self.health = self.max_health
self.max_mana += 20
self.mana = self.max_mana
self.attack += 3
self.defense += 2
# 升级解锁技能
if self.level == 3:
self._unlock_skill()
print(f"\n你升级到了{self.level}级!属性大幅提升!")
def _unlock_skill(self):
if self.faction == "圣殿骑士":
skill = Skill("守护光环", "大幅提升防御力3回合", 25,
lambda caster, _: setattr(caster, 'defense', caster.defense * 2))
elif self.faction == "暗影兄弟会":
skill = Skill("毒刃", "造成持续伤害", 20,
lambda _, target: [target.take_damage(5) for _ in range(3)])
else:
skill = Skill("魔法护盾", "吸收伤害", 30,
lambda caster, _: setattr(caster, 'defense', caster.defense + 10))
self.skills.append(skill)
print(f"你学会了新技能: {skill.name} - {skill.description}")
class Enemy(Character):
def __init__(self, name: str, level: int, is_boss: bool = False):
health = 50 + level * 20
attack = 8 + level * 3
defense = 3 + level * 1
mana = 30 + level * 10 if not is_boss else 100 + level * 20
super().__init__(name, health, mana, attack, defense)
self.is_boss = is_boss
self.exp_reward = 50 + level * 20
self.turns_in_defense = 0
if is_boss:
self.max_health *= 2
self.health = self.max_health
self.attack *= 1.5
self._add_boss_skills()
def _add_boss_skills(self):
self.skills.append(Skill(
"狂怒一击", "造成巨大伤害但消耗大量魔力", 30,
lambda caster, target: target.take_damage(int(caster.attack * 2))
))
def print_dramatic(text: str, delay: float = 0.08) -> None:
"""带有戏剧效果的文本打印"""
print("\n" + "=" * 40)
for char in text:
print(char, end='', flush=True)
time.sleep(delay)
print("\n" + "=" * 40 + "\n")
time.sleep(1)
def print_slow(text: str, delay: float = 0.05) -> None:
for char in text:
print(char, end='', flush=True)
time.sleep(delay)
print()
def battle(player: Player, enemy: Enemy) -> bool:
print_slow(f"\n遭遇了{enemy.name}!{'这是一场BOSS战!' if enemy.is_boss else ''}")
turns = 0
while player.is_alive() and enemy.is_alive():
turns += 1
print_slow(f"\n----- 第{turns}回合 -----")
print_slow(f"你的状态: 生命 {player.health}/{player.max_health} 魔力 {player.mana}/{player.max_mana}")
print_slow(f"{enemy.name}状态: 生命 {enemy.health}/{enemy.max_health}")
# 玩家行动
print_slow("\n选择行动:")
print_slow("1. 普通攻击")
print_slow("2. 使用技能")
print_slow("3. 使用物品")
print_slow("4. 交谈 (仅对部分敌人有效)")
choice = input("你的选择: ")
if choice == "1":
damage = random.randint(player.attack - 2, player.attack + 2)
actual = enemy.take_damage(damage)
print_slow(f"你对{enemy.name}造成了{actual}点伤害!")
elif choice == "2":
if not player.skills:
print_slow("你还没有学会任何技能!")
continue
print_slow("可用技能:")
for i, skill in enumerate(player.skills, 1):
print_slow(f"{i}. {skill.name} - {skill.description} (消耗{skill.mana_cost}魔力)")
skill_choice = input("选择技能: ")
try:
skill = player.skills[int(skill_choice) - 1]
if player.mana >= skill.mana_cost:
player.mana -= skill.mana_cost
print_slow(f"你使用了{skill.name}!")
skill.effect(player, enemy)
else:
print_slow("魔力不足,无法使用技能!")
except:
print_slow("无效选择!")
elif choice == "3":
if not player.inventory:
print_slow("背包空空如也!")
continue
print_slow("物品:")
for i, (item, count) in enumerate(player.inventory.items(), 1):
print_slow(f"{i}. {item} (x{count})")
item_choice = input("选择物品: ")
try:
item = list(player.inventory.keys())[int(item_choice) - 1]
if item == "治疗药水":
player.health = min(player.max_health, player.health + 50)
player.inventory[item] -= 1
if player.inventory[item] == 0:
del player.inventory[item]
print_slow("你使用了治疗药水,恢复了50点生命!")
except:
print_slow("无效选择!")
elif choice == "4":
# 特定敌人可以交谈
if "守卫" in enemy.name or "信使" in enemy.name:
print_slow(f"{enemy.name}: '你来这里做什么?'")
response = input("你的回应: ")
if any(word in response.lower() for word in ["和平", "任务", "联盟"]):
print_slow(f"{enemy.name}似乎被说服了,让开了道路!")
return True
else:
print_slow(f"{enemy.name}被激怒了!")
else:
print_slow("这个敌人无法沟通!")
else:
print_slow("犹豫不决让你失去了行动机会!")
# 敌人行动
if enemy.is_alive():
if enemy.is_boss and enemy.mana > 30 and random.random() < 0.3:
# BOSS使用技能
skill = enemy.skills[0]
enemy.mana -= skill.mana_cost
print_slow(f"{enemy.name}使用了{skill.name}!")
skill.effect(enemy, player)
else:
damage = random.randint(int(enemy.attack * 0.8), int(enemy.attack * 1.2))
actual = player.take_damage(damage)
print_slow(f"{enemy.name}对你造成了{actual}点伤害!")
if not player.is_alive():
print_slow("你倒下了...")
return False
# 每回合恢复少量魔力
player.restore_mana(3)
enemy.restore_mana(2)
# 战斗胜利
print_slow(f"你成功击败了{enemy.name}!")
player.gain_exp(enemy.exp_reward)
return True
def story_chapter(chapter: int, player: Player) -> bool:
"""剧情章节,返回是否继续游戏"""
if chapter == 1:
print_dramatic("第一章:起源")
print_slow("你站在十字路口,三个阵营的使者在等待你的选择...")
print_slow("1. 圣殿骑士 - 崇尚正义与秩序,擅长防御与治疗")
print_slow("2. 暗影兄弟会 - 信奉力量与隐秘,擅长突袭与诡计")
print_slow("3. 法师议会 - 追求知识与魔法,擅长元素攻击与控制")
# 阵营选择已在初始化完成,这里直接推进剧情
print_slow(f"\n你选择了加入{player.faction},开始了你的冒险...")
return battle(player, Enemy("森林守卫", 1))
elif chapter == 2:
print_dramatic("第二章:背叛的迹象")
print_slow("你来到边境小镇,村民们神色慌张...")
print_slow("村长:'黑暗正在蔓延,我们的信使失踪了!'")
choice = input("你要:1. 立即寻找信使 2. 先调查小镇周边: ")
player.choices["chapter2"] = choice
enemy = Enemy("堕落的猎人", 2) if choice == "1" else Enemy("变异的狼", 2)
return battle(player, enemy)
elif chapter == 3:
print_dramatic("第三章:古老的秘密")
print_slow("你发现了一座古老的神殿,里面有一个神秘的祭坛...")
print_slow("祭坛上有三个物品:1. 发光的宝石 2. 生锈的剑 3. 密封的卷轴")
choice = input("你选择拿起:")
player.choices["chapter3"] = choice
if choice == "1":
player.mana += 50
print_slow("宝石融入你的身体,魔力大幅提升!")
elif choice == "2":
player.attack += 5
print_slow("剑变得锋利,你的攻击力提升了!")
else:
player.defense += 5
print_slow("卷轴传授了你防御的秘诀!")
return battle(player, Enemy("神殿守护者", 3, is_boss=True))
elif chapter == 4:
print_dramatic("第四章:最终决战")
print_slow("你终于找到了黑暗之源,一个巨大的阴影出现在你面前...")
return battle(player, Enemy("暗影领主", 5, is_boss=True))
def determine_ending(player: Player) -> str:
"""根据玩家选择决定结局"""
if "chapter2" not in player.choices:
return "你在中途放弃了冒险,成为了一个传说中的谜..."
if player.faction == "圣殿骑士":
return "你净化了黑暗,建立了新的秩序,成为了人们敬仰的英雄。" if player.choices["chapter2"] == "1" \
else "你选择了谨慎行事,虽然拯救了世界,但人们对你的评价褒贬不一。"
elif player.faction == "暗影兄弟会":
return "你吸收了暗影领主的力量,成为了新的黑暗统治者。" if player.choices["chapter3"] == "2" \
else "你选择了不同的道路,成为了一个亦正亦邪的孤独游侠。"
else:
return "你用魔法封印了黑暗,建立了新的魔法学院,培养了无数魔法师。" if player.choices["chapter3"] == "3" \
else "你选择了研究黑暗魔法,最终成为了一个神秘的隐士。"
def main():
print_dramatic("史诗冒险:暗影与光明")
name = input("请输入你的名字: ")
print_slow("\n请选择你的阵营:")
print_slow("1. 圣殿骑士")
print_slow("2. 暗影兄弟会")
print_slow("3. 法师议会")
faction_choices = {
"1": "圣殿骑士",
"2": "暗影兄弟会",
"3": "法师议会"
}
faction = faction_choices.get(input("选择: "), "圣殿骑士")
player = Player(name, faction)
input("\n按回车键开始你的冒险...")
# 游戏主流程
for chapter in range(1, 5):
if not story_chapter(chapter, player):
print_dramatic("冒险提前结束")
print_slow(f"{player.name}的故事在这里画上了句号...")
return
if chapter < 4:
print_slow("\n准备好继续前进了吗?")
input("按回车键进入下一章...")
# 结局
print_dramatic("结局")
print_slow(determine_ending(player))
print_slow(f"你的最终等级: {player.level}")
print_slow("感谢体验这场冒险!")
if __name__ == "__main__":
main()