import random import time
XP_TO_LEVEL_UP = { 2: 100, 3: 250, 4: 500, 5: 800, }
CLASSES = { “guerreiro”: { “bonus_hp”: 30, “dano_extra”: 5, “mana_max”: 20, “habilidade”: { “nome”: “Golpe Poderoso”, “custo”: 10, “descricao”: “Causa o dobro do dano do seu próximo ataque.”, “efeito”: “dobro_dano_proximo_ataque” }, “descricao”: “Um mestre do combate corpo a corpo, com mais vida e dano.” }, “arqueiro”: { “bonus_hp”: 0, “dano_extra”: 0, “mana_max”: 30, “habilidade”: { “nome”: “Tiro Preciso”, “custo”: 15, “descricao”: “Garante um acerto crítico no próximo ataque.”, “efeito”: “garante_critico_proximo_ataque” }, “critico_chance”: 0.3, “critico_dano”: 2, “descricao”: “Ágil e preciso, capaz de causar dano crítico massivo.” } }
WEAPONS = { “espada de madeira”: { “dano_min”: 5, “dano_max”: 10, “valor”: 10, “descricao”: “Uma espada simples.” }, “espada de aço”: { “dano_min”: 15, “dano_max”: 25, “valor”: 100, “descricao”: “Uma espada afiada.” }, “arco curto”: { “dano_min”: 5, “dano_max”: 15, “valor”: 10, “descricao”: “Um arco simples.” }, “arco longo”: { “dano_min”: 10, “dano_max”: 30, “valor”: 100, “descricao”: “Um arco poderoso.” } }
ENEMIES = { “goblin”: { “hp”: 50, “dano_min”: 5, “dano_max”: 15, “xp_drop”: 20, “gold_drop_min”: 5, “gold_drop_max”: 15, “loot_chance”: {“poção de cura”: 0.3, “elixir de força”: 0.1} }, “orc”: { “hp”: 80, “dano_min”: 10, “dano_max”: 25, “xp_drop”: 50, “gold_drop_min”: 10, “gold_drop_max”: 25, “loot_chance”: {“poção de cura”: 0.4, “elixir de força”: 0.2, “espada de aço”: 0.05} }, “troll”: { “hp”: 120, “dano_min”: 15, “dano_max”: 35, “xp_drop”: 80, “gold_drop_min”: 20, “gold_drop_max”: 40, “loot_chance”: {“poção de cura”: 0.5, “elixir de força”: 0.3, “arco longo”: 0.05} } }
SHOP_ITEMS = { “poção de cura”: {“valor”: 20}, “elixir de força”: {“valor”: 50}, “espada de aço”: {“valor”: 100}, “arco longo”: {“valor”: 100} }
player_class = None player_max_hp = 0 player_hp = 0 player_xp = 0 player_level = 1 player_gold = 0 player_weapon = None player_buffs = {} player_mana = 0 player_max_mana = 0
inventory = { “poção de cura”: 3, “elixir de força”: 0 }
def check_level_up(): “"”Verifica se o jogador tem XP suficiente para subir de nível.””” global player_xp, player_level, player_hp, player_max_hp, player_max_mana, player_mana
xp_needed = XP_TO_LEVEL_UP.get(player_level + 1)
if xp_needed and player_xp >= xp_needed:
player_level += 1
print(f"\n--- Parabéns! Você subiu para o nível {player_level}! ---")
player_max_hp += 20
player_hp = player_max_hp
if player_weapon:
player_weapon["dano_max"] += 5
player_max_mana += 10
player_mana = player_max_mana
print(f"Sua vida máxima aumentou para {player_max_hp}, seu dano máximo para {player_weapon['dano_max']} e sua mana para {player_max_mana}!")
time.sleep(1)
def player_turn(enemy_hp, enemy_type): “"”Gerencia as ações do jogador durante a batalha.””” global player_hp, player_mana
habilidade_nome = player_class["habilidade"]["nome"]
action = input(f"\nO que você quer fazer? [A] Atacar | [P] Poção | [E] Elixir | [H] {habilidade_nome} | [F] Fugir: ").lower()
if action == "a":
base_damage = random.randint(player_weapon["dano_min"], player_weapon["dano_max"])
final_damage = base_damage + player_class["dano_extra"]
if player_buffs.get("dobro_dano_proximo_ataque"):
final_damage *= 2
if player_buffs.get("força"):
final_damage += player_buffs["força"] * 5
is_critical = False
if player_buffs.get("garante_critico", False) or (player_class.get("critico_chance") and random.random() < player_class["critico_chance"]):
final_damage *= player_class.get("critico_dano", 2)
is_critical = True
enemy_hp -= final_damage
message = f"Você ataca o {enemy_type} com sua {player_weapon['descricao'].split()[1]} e causa {int(final_damage)} de dano!"
if is_critical:
message = "Acerto crítico! " + message
print(message)
player_buffs.pop("dobro_dano_proximo_ataque", None)
player_buffs.pop("garante_critico", None)
if "força" in player_buffs:
player_buffs["força"] -= 1
if player_buffs["força"] <= 0:
del player_buffs["força"]
print("O efeito do Elixir de Força se esgotou.")
elif action == "p":
if inventory["poção de cura"] > 0:
heal_amount = 30
player_hp += heal_amount
inventory["poção de cura"] -= 1
if player_hp > player_max_hp:
player_hp = player_max_hp
print(f"Você usa uma poção e recupera {heal_amount} de vida. Você tem {inventory['poção de cura']} poções restantes.")
else:
print("Você não tem mais poções de cura!")
elif action == "e":
if inventory["elixir de força"] > 0:
inventory["elixir de força"] -= 1
player_buffs["força"] = 3
print("Você bebe o Elixir de Força! Seus próximos ataques serão mais fortes por 3 turnos.")
else:
print("Você não tem Elixires de Força!")
elif action == "h":
habilidade = player_class["habilidade"]
if player_mana >= habilidade["custo"]:
player_mana -= habilidade["custo"]
print(f"Você usa {habilidade['nome']}!")
if habilidade["efeito"] == "dobro_dano_proximo_ataque":
player_buffs["dobro_dano_proximo_ataque"] = True
elif habilidade["efeito"] == "garante_critico_proximo_ataque":
player_buffs["garante_critico"] = True
else:
print("Mana insuficiente!")
elif action == "f":
print("Você tenta fugir...")
time.sleep(1)
if random.random() > 0.5:
print("Você conseguiu fugir da batalha!")
return "flee"
else:
print("A fuga falhou! O inimigo te impede de sair.")
else:
print("Ação inválida. Escolha 'A', 'P', 'E', 'H' ou 'F'.")
return enemy_hp
def enemy_turn(enemy_stats): “"”Gerencia o ataque do inimigo.””” global player_hp
enemy_damage = random.randint(enemy_stats["dano_min"], enemy_stats["dano_max"])
player_hp -= enemy_damage
print(f"O inimigo contra-ataca e te causa {enemy_damage} de dano.")
def battle(enemy_type): “"”Loop principal de batalha.””” global player_hp, player_xp, player_gold, player_weapon
enemy_stats = ENEMIES[enemy_type]
current_enemy_hp = enemy_stats["hp"]
print(f"\n--- Um {enemy_type} aparece! ---")
time.sleep(1)
while player_hp > 0 and current_enemy_hp > 0:
elixir_info = f" | Elixir: {inventory['elixir de força']}" if inventory["elixir de força"] > 0 else ""
print(f"\nNível: {player_level} | Vida: {player_hp}/{player_max_hp} | Mana: {player_mana}/{player_max_mana} | Ouro: {player_gold} | Vida do {enemy_type}: {current_enemy_hp}")
result = player_turn(current_enemy_hp, enemy_type)
if result == "flee":
return
current_enemy_hp = result
if current_enemy_hp <= 0:
print(f"\n--- Você derrotou o {enemy_type}! ---")
xp_ganha = enemy_stats["xp_drop"]
player_xp += xp_ganha
print(f"Você ganhou {xp_ganha} pontos de experiência. Total: {player_xp}")
gold_ganho = random.randint(enemy_stats["gold_drop_min"], enemy_stats["gold_drop_max"])
player_gold += gold_ganho
print(f"Você encontrou {gold_ganho} moedas de ouro. Total: {player_gold}")
check_level_up()
for item, chance in enemy_stats["loot_chance"].items():
if random.random() <= chance:
if item in WEAPONS:
print(f"Você encontrou a arma '{item.capitalize()}'!")
while True:
equipar = input(f"Você quer equipar o(a) {item}? (dano {WEAPONS[item]['dano_min']}-{WEAPONS[item]['dano_max']}) [S/N]: ").lower()
if equipar == 's':
player_weapon = WEAPONS[item]
print(f"Você equipou {item.capitalize()}!")
break
elif equipar == 'n':
print(f"Você continua com seu(sua) {player_weapon['descricao'].split()[1]}.")
break
else:
print("Resposta inválida.")
else:
inventory[item] += 1
print(f"Você vasculha o corpo do inimigo e encontra um(a) {item.capitalize()}!")
break
time.sleep(1)
enemy_turn(enemy_stats)
time.sleep(1)
if player_hp <= 0:
print("\n--- Você morreu... Fim de jogo. ---")
return "game_over"
def visit_shop(): “"”Permite ao jogador visitar a loja.””” global player_gold, player_weapon
print("\n--- Bem-vindo à Loja! ---")
time.sleep(1)
while True:
print(f"\nSeu Ouro: {player_gold}")
print("Itens disponíveis:")
for item, stats in SHOP_ITEMS.items():
print(f"[{item.capitalize()}] - Custo: {stats['valor']} ouro")
if item in WEAPONS:
print(f" - Dano: {WEAPONS[item]['dano_min']}-{WEAPONS[item]['dano_max']}")
print("\n[V] Voltar | Digite o nome do item para comprar.")
choice = input("Sua escolha: ").lower()
if choice == "v":
print("Até logo!")
break
elif choice in SHOP_ITEMS:
item_cost = SHOP_ITEMS[choice]["valor"]
if player_gold >= item_cost:
player_gold -= item_cost
print(f"Você comprou {choice.capitalize()} por {item_cost} ouro.")
if choice in WEAPONS:
player_weapon = WEAPONS[choice]
print(f"Você equipou {choice.capitalize()}!")
else:
inventory[choice] += 1
else:
print("Você não tem ouro suficiente para comprar este item.")
else:
print("Escolha inválida.")
def rest(): “"”Permite ao jogador descansar para recuperar vida e mana.””” global player_hp, player_mana, player_max_hp, player_max_mana
print("\nVocê decide descansar em um lugar seguro.")
time.sleep(1)
player_hp = player_max_hp
player_mana = player_max_mana
print("Sua vida e mana foram totalmente restauradas.")
print("Você se sente revigorado, mas um novo inimigo pode ter te encontrado!")
time.sleep(2)
if random.random() > 0.3:
available_enemies = ["goblin"]
if player_level >= 2:
available_enemies.append("orc")
if player_level >= 3:
available_enemies.append("troll")
chosen_enemy = random.choice(available_enemies)
return battle(chosen_enemy)
return None
def choose_class(): “"”Permite ao jogador escolher a classe inicial.””” global player_class, player_max_hp, player_hp, player_mana, player_max_mana
print("Escolha sua classe:")
for cls, stats in CLASSES.items():
print(f"[{cls.capitalize()}] - {stats['descricao']}")
time.sleep(0.5)
while True:
choice = input("Digite o nome da sua classe: ").lower()
if choice in CLASSES:
player_class = CLASSES[choice]
player_max_hp = 100 + player_class["bonus_hp"]
player_hp = player_max_hp
player_max_mana = player_class["mana_max"]
player_mana = player_max_mana
print(f"\nVocê escolheu a classe {choice}!")
time.sleep(1)
break
else:
print("Escolha inválida. Por favor, digite 'guerreiro' ou 'arqueiro'.")
def choose_weapon(): “"”Permite ao jogador escolher a arma inicial.””” global player_weapon
print("Você encontrou uma Espada de Madeira e um Arco Curto. Qual arma você quer levar?")
start_weapons = {name: data for name, data in WEAPONS.items() if data["valor"] == 10}
for weapon, stats in start_weapons.items():
print(f"[{weapon.capitalize()}] - Dano: {stats['dano_min']}-{stats['dano_max']} | {stats['descricao']}")
time.sleep(0.5)
while True:
choice = input("Digite o nome da sua escolha: ").lower()
if choice in start_weapons:
player_weapon = WEAPONS[choice]
print(f"\nVocê escolheu o {choice}!")
time.sleep(1)
break
else:
print("Escolha inválida.")
if name == “main”: print(“Bem-vindo à aventura de texto!”) time.sleep(1)
choose_class()
choose_weapon()
while True:
print("\n--- O que você quer fazer? ---")
action = input("[A] Aventure-se | [L] Visitar Loja | [D] Descansar | [S] Sair: ").lower()
if action == "a":
available_enemies = ["goblin"]
if player_level >= 2:
available_enemies.append("orc")
if player_level >= 3:
available_enemies.append("troll")
chosen_enemy = random.choice(available_enemies)
game_status = battle(chosen_enemy)
if game_status == "game_over":
break
elif action == "l":
visit_shop()
elif action == "d":
game_status = rest()
if game_status == "game_over":
break
elif action == "s":
print("Obrigado por jogar! Fim da aventura.")
break
else:
print("Opção inválida.")