import random
import time
from enum import Enum
class ItemType(Enum):
WEAPON = 1
ARMOR = 2
POTION = 3
TREASURE = 4
class Item:
def __init__(self, name, item_type, value, description):
self.name = name
self.item_type = item_type
self.value = value # 对于武器是攻击力,对于防具是防御力,对于药水是恢复量,对于财宝是价值
self.description = description
def __str__(self):
return f"{self.name} - {self.description}"
class Character:
def __init__(self, name, health, attack, defense):
self.name = name
self.health = health
self.max_health = health
self.attack = attack
self.defense = defense
self.inventory = []
self.equipped_weapon = None
self.equipped_armor = None
def is_alive(self):
return self.health > 0
def take_damage(self, damage):
actual_damage = max(1, damage - self.get_total_defense() // 3)
self.health = max(0, self.health - actual_damage)
return actual_damage
def attack_enemy(self, enemy):
total_attack = self.get_total_attack()
damage = random.randint(total_attack - 2, total_attack + 2)
return enemy.take_damage(damage)
def heal(self, amount):
self.health = min(self.max_health, self.health + amount)
return amount
def add_item(self, item):
self.inventory.append(item)
# 如果是武器或防具,自动装备更好的
if item.item_type == ItemType.WEAPON:
if not self.equipped_weapon or item.value > self.equipped_weapon.value:
self.equipped_weapon = item
return f"你装备了新的武器: {item.name} (攻击力+{item.value})"
elif item.item_type == ItemType.ARMOR:
if not self.equipped_armor or item.value > self.equipped_armor.value:
self.equipped_armor = item
return f"你装备了新的防具: {item.name} (防御力+{item.value})"
return f"你获得了: {item.name}"
def use_potion(self):
# 找到第一个药水
for i, item in enumerate(self.inventory):
if item.item_type == ItemType.POTION:
potion = self.inventory.pop(i)
healed = self.heal(potion.value)
return (True, f"你使用了{potion.name},恢复了{healed}点生命值!")
return (False, "你没有药水了!")
def get_total_attack(self):
weapon_attack = self.equipped_weapon.value if self.equipped_weapon else 0
return self.attack + weapon_attack
def get_total_defense(self):
armor_defense = self.equipped_armor.value if self.equipped_armor else 0
return self.defense + armor_defense
def show_inventory(self):
if not self.inventory:
return "你的背包是空的。"
result = "背包物品:\n"
for i, item in enumerate(self.inventory, 1):
result += f"{i}. {item}\n"
return result
def __str__(self):
return (f"{self.name} - 生命值: {self.health}/{self.max_health}, "
f"攻击力: {self.get_total_attack()}, 防御力: {self.get_total_defense()}")
class Player(Character):
def __init__(self, name):
super().__init__(name, 100, 10, 5)
self.gold = 0
self.level = 1
self.xp = 0
self.xp_to_next_level = 100
def add_gold(self, amount):
self.gold += amount
return amount
def add_xp(self, amount):
self.xp += amount
leveled_up = False
while self.xp >= self.xp_to_next_level:
self.xp -= self.xp_to_next_level
self.level += 1
self.max_health += 20
self.health = self.max_health
self.attack += 3
self.defense += 2
self.xp_to_next_level = int(self.xp_to_next_level * 1.5)
leveled_up = True
return leveled_up
def __str__(self):
return (f"{super().__str__()}, 等级: {self.level}, "
f"经验值: {self.xp}/{self.xp_to_next_level}, 金币: {self.gold}")
class Enemy(Character):
def __init__(self, name, health, attack, defense, xp_reward, gold_reward):
super().__init__(name, health, attack, defense)
self.xp_reward = xp_reward
self.gold_reward = gold_reward
def drop_loot(self):
# 30%几率掉落物品
if random.random() < 0.3:
loot_table = [
Item("生锈的剑", ItemType.WEAPON, 3, "一把生锈的剑,增加3点攻击力"),
Item("皮甲", ItemType.ARMOR, 2, "一件简单的皮甲,增加2点防御力"),
Item("小瓶治疗药水", ItemType.POTION, 20, "恢复20点生命值"),
Item("金币袋", ItemType.TREASURE, 15, "装有15金币的钱袋")
]
return random.choice(loot_table)
return None
class Location:
def __init__(self, name, description, enemies, items, connected_locations=None):
self.name = name
self.description = description
self.enemies = enemies # 可能遇到的敌人列表
self.items = items # 可能找到的物品列表
self.connected_locations = connected_locations if connected_locations else []
self.visited = False
def get_random_enemy(self):
if self.enemies and random.random() < 0.6: # 60%几率遇到敌人
return random.choice(self.enemies)
return None
def search_for_items(self):
if self.items and random.random() < 0.4: # 40%几率找到物品
return self.items.pop(random.randint(0, len(self.items)-1))
return None
def __str__(self):
return self.name
class Game:
def __init__(self):
self.player = None
self.locations = self.create_locations()
self.current_location = self.locations[0] # 从村庄开始
self.game_over = False
self.victory = False
def create_locations(self):
# 创建敌人
goblin = Enemy("哥布林", 30, 8, 2, 20, 5)
wolf = Enemy("野狼", 40, 10, 3, 30, 8)
bandit = Enemy("强盗", 60, 12, 5, 50, 15)
ogre = Enemy("食人魔", 100, 15, 8, 80, 25)
dragon = Enemy("绿龙", 200, 25, 15, 200, 50)
# 创建物品
sword = Item("铁剑", ItemType.WEAPON, 5, "一把坚固的铁剑,增加5点攻击力")
shield = Item("木盾", ItemType.ARMOR, 3, "一个木制盾牌,增加3点防御力")
potion = Item("治疗药水", ItemType.POTION, 30, "恢复30点生命值")
treasure = Item("黄金雕像", ItemType.TREASURE, 50, "价值50金币的黄金雕像")
magic_sword = Item("魔法剑", ItemType.WEAPON, 10, "一把附魔剑,增加10点攻击力")
magic_armor = Item("魔法盔甲", ItemType.ARMOR, 8, "一件魔法盔甲,增加8点防御力")
great_potion = Item("强效治疗药水", ItemType.POTION, 50, "恢复50点生命值")
# 创建地点
village = Location(
"宁静村庄",
"一个和平的小村庄,是你的冒险起点。村民们很友好,但最近受到怪物困扰。",
[], # 村庄没有敌人
[potion, Item("铜剑", ItemType.WEAPON, 2, "一把简单的铜剑,增加2点攻击力")]
)
forest = Location(
"黑暗森林",
"一片茂密的森林,阳光很难穿透树冠。你能听到奇怪的叫声。",
[goblin, wolf],
[sword, shield, potion]
)
cave = Location(
"幽深洞穴",
"一个黑暗潮湿的洞穴,墙壁上有发光的苔藓。深处传来隆隆声。",
[goblin, ogre],
[treasure, magic_sword, great_potion]
)
castle = Location(
"废弃城堡",
"一座古老的城堡废墟,曾经是王国的要塞,现在被强盗占据。",
[bandit, ogre],
[magic_armor, great_potion, treasure]
)
dragon_lair = Location(
"龙巢",
"绿龙的巢穴,地面上铺满了金币和骨头。空气中弥漫着硫磺味。",
[dragon],
[Item("龙鳞甲", ItemType.ARMOR, 15, "由龙鳞制成的盔甲,增加15点防御力"),
Item("龙之剑", ItemType.WEAPON, 20, "蕴含龙之力的剑,增加20点攻击力")]
)
# 设置连接的地点
village.connected_locations = [forest]
forest.connected_locations = [village, cave, castle]
cave.connected_locations = [forest, dragon_lair]
castle.connected_locations = [forest, dragon_lair]
dragon_lair.connected_locations = [cave, castle]
return [village, forest, cave, castle, dragon_lair]
def print_slow(self, text, delay=0.03):
for char in text:
print(char, end='', flush=True)
time.sleep(delay)
print()
def create_player(self):
self.print_slow("\n欢迎来到冒险探索游戏!")
name = input("请输入你的名字: ")
self.player = Player(name)
self.print_slow(f"你好,{self.player.name}!准备好开始你的冒险了吗?")
self.print_slow("你的目标是探索这片土地,击败绿龙,拯救王国!")
def travel(self, location):
self.current_location = location
self.current_location.visited = True
self.print_slow(f"\n你来到了{self.current_location.name}")
self.print_slow(self.current_location.description)
# 检查是否是龙巢并且是第一次来
if self.current_location.name == "龙巢" and len(self.current_location.enemies) > 0:
self.print_slow("\n绿龙发现了你!准备战斗!")
enemy = self.current_location.enemies[0]
self.battle(enemy)
# 战斗后移除龙,避免重复战斗
self.current_location.enemies = []
return
# 随机遇敌
enemy = self.current_location.get_random_enemy()
if enemy:
self.print_slow(f"\n你遇到了一只{enemy.name}!")
self.battle(enemy)
if self.game_over:
return
def battle(self, enemy):
self.print_slow(f"\n--- 与{enemy.name}的战斗开始! ---")
while self.player.is_alive() and enemy.is_alive():
self.print_slow(f"\n{self.player}")
self.print_slow(f"{enemy.name}: 生命值 {enemy.health}/{enemy.max_health}")
self.print_slow("\n请选择行动:")
self.print_slow("1. 攻击")
self.print_slow("2. 使用治疗药水")
self.print_slow("3. 尝试逃跑")
choice = input("你的选择: ")
if choice == "1":
# 玩家攻击
damage = self.player.attack_enemy(enemy)
self.print_slow(f"你对{enemy.name}造成了{damage}点伤害!")
if not enemy.is_alive():
break
# 敌人反击
enemy_damage = enemy.attack_enemy(self.player)
self.print_slow(f"{enemy.name}对你造成了{enemy_damage}点伤害!")
elif choice == "2":
# 使用药水
success, message = self.player.use_potion()
self.print_slow(message)
if success:
# 敌人攻击
enemy_damage = enemy.attack_enemy(self.player)
self.print_slow(f"{enemy.name}对你造成了{enemy_damage}点伤害!")
elif choice == "3":
# 尝试逃跑
if random.random() < 0.4: # 40%成功率
self.print_slow("你成功逃脱了!")
return
else:
self.print_slow("逃跑失败!")
# 敌人趁机攻击
enemy_damage = enemy.attack_enemy(self.player)
self.print_slow(f"{enemy.name}趁机对你造成了{enemy_damage}点伤害!")
else:
self.print_slow("无效的选择,你犹豫了一下...")
# 敌人趁机攻击
enemy_damage = enemy.attack_enemy(self.player)
self.print_slow(f"{enemy.name}对你造成了{enemy_damage}点伤害!")
if self.player.is_alive():
self.print_slow(f"\n你击败了{enemy.name}!")
# 获得奖励
self.print_slow(f"你获得了{enemy.xp_reward}点经验值和{enemy.gold_reward}枚金币!")
self.player.add_xp(enemy.xp_reward)
self.player.add_gold(enemy.gold_reward)
# 检查是否升级
leveled_up = self.player.add_xp(enemy.xp_reward)
if leveled_up:
self.print_slow(f"恭喜!你升级到了{self.player.level}级!")
self.print_slow(f"你的属性提升了:生命值 {self.player.health}/{self.player.max_health}, "
f"攻击力 {self.player.get_total_attack()}, 防御力 {self.player.get_total_defense()}")
# 掉落物品
loot = enemy.drop_loot()
if loot:
message = self.player.add_item(loot)
self.print_slow(message)
# 检查是否击败了最终BOSS
if enemy.name == "绿龙":
self.victory = True
self.game_over = True
else:
self.print_slow(f"\n你被{enemy.name}击败了...")
self.game_over = True
def search_area(self):
self.print_slow("\n你开始搜索这个区域...")
time.sleep(1)
item = self.current_location.search_for_items()
if item:
message = self.player.add_item(item)
self.print_slow(message)
if item.item_type == ItemType.TREASURE:
self.player.add_gold(item.value)
self.print_slow(f"你获得了{item.value}枚金币!")
else:
self.print_slow("你没有找到任何有价值的东西。")
# 搜索可能惊动敌人
if random.random() < 0.3: # 30%几率惊动敌人
enemy = self.current_location.get_random_enemy()
if enemy:
self.print_slow(f"\n你的搜索惊动了一只{enemy.name}!")
self.battle(enemy)
def show_map(self):
self.print_slow("\n--- 地图 ---")
self.print_slow(f"当前位置: {self.current_location.name}")
self.print_slow("已探索的地点:")
for loc in self.locations:
if loc.visited:
marker = "✓" if loc == self.current_location else "•"
self.print_slow(f"{marker} {loc.name}")
self.print_slow("\n可前往的地点:")
for i, loc in enumerate(self.current_location.connected_locations, 1):
self.print_slow(f"{i}. {loc.name}")
def play(self):
self.create_player()
while not self.game_over:
self.print_slow(f"\n--- {self.current_location.name} ---")
self.print_slow("你可以:")
self.print_slow("1. 查看周围环境")
self.print_slow("2. 前往其他地点")
self.print_slow("3. 搜索该区域")
self.print_slow("4. 查看状态")
self.print_slow("5. 查看背包")
self.print_slow("6. 退出游戏")
choice = input("请选择: ")
if choice == "1":
self.print_slow(self.current_location.description)
elif choice == "2":
self.show_map()
if self.current_location.connected_locations:
loc_choice = input("请输入要前往的地点编号: ")
try:
index = int(loc_choice) - 1
if 0 <= index < len(self.current_location.connected_locations):
self.travel(self.current_location.connected_locations[index])
else:
self.print_slow("无效的选择。")
except ValueError:
self.print_slow("请输入一个数字。")