Preview:
import random
import os
import time

class Character:
    def __init__(self, name, hp, attack):
        self.name = name
        self.hp = hp
        self.max_hp = hp
        self.attack = attack
        self.curses = 0
        self.burned = False
        self.critical = False
        self.piercing = False

    def is_alive(self):
        return self.hp > 0

    def take_damage(self, damage):
        self.hp -= damage
        self.hp = max(0, self.hp)

    def attack_enemy(self, enemy):
        damage = random.randint(1, self.attack)
        print(f"{self.name} attacks {enemy.name} for {damage} damage!")
        enemy.take_damage(damage)
        if random.random() < 0.25:  # 25% chance to apply debuffs
            enemy.inflict_debuff()

    def apply_curse(self):
        if self.curses < 5:
            self.curses += 1
            print(f"{self.name} is cursed! Curse level: {self.curses}")
        else:
            print("Curse maxed out!")

    def remove_curse(self):
        if self.curses > 0:
            self.curses -= 1
            print(f"{self.name} removes a curse. Curse level: {self.curses}")
        else:
            print("No curses to remove.")

    def inflict_debuff(self):
        debuffs = ["Burned", "Critical", "Piercing"]
        debuff = random.choice(debuffs)
        if debuff == "Burned":
            if not self.burned:
                self.burned = True
                print(f"{self.name} is burned!")
            else:
                print(f"{self.name} is already burned!")
        elif debuff == "Critical":
            if not self.critical:
                self.critical = True
                print(f"{self.name} receives a critical hit!")
            else:
                print(f"{self.name} is already under the effect of a critical hit!")
        elif debuff == "Piercing":
            if not self.piercing:
                self.piercing = True
                print(f"{self.name} ignores defenses!")
            else:
                print(f"{self.name} is already ignoring defenses!")

    def display_health_bar(self):
        bar_length = 20
        filled_length = int(round(bar_length * self.hp / self.max_hp))
        curses_display = "^" * self.curses
        bar = '♥' * filled_length + '-' * (bar_length - filled_length)
        print(f"{self.name} Hearts: [{bar}] {self.hp}/{self.max_hp} {curses_display}")


class Enemy(Character):
    def __init__(self, name, hp, attack):
        super().__init__(name, hp, attack)

    def attack_enemy(self, player):
        damage = random.randint(1, self.attack)
        print(f"{self.name} attacks {player.name} for {damage} damage!")
        if random.random() < 0.25:  # 25% chance to apply debuffs
            player.inflict_debuff()
        player.take_damage(damage)

class Boss(Character):
    def __init__(self, name, hp, attack):
        super().__init__(name, hp, attack)

    def display_health_bar(self):
        bar_length = 20
        filled_length = int(round(bar_length * self.hp / self.max_hp))
        bar = '♥' * filled_length + '-' * (bar_length - filled_length)
        print(f"{self.name} Hearts: [{bar}] {self.hp}/{self.max_hp}")

    def attack_enemy(self, player):
        damage = random.randint(1, self.attack)
        print(f"{self.name} attacks {player.name} for {damage} damage!")
        if random.random() < 0.25:  # 25% chance to apply debuffs
            player.inflict_debuff()
        player.take_damage(damage)
        
import os
import time

def battle(player, enemy):
    print(f"A wild {enemy.name} appears!")
    while player.is_alive() and enemy.is_alive():
        os.system('clear')  # Clear the screen
        player.display_health_bar()
        enemy.display_health_bar()

        print("\nYour Turn")
        print("1. Attack")
        choice = input("Enter your choice: ")

        if choice == "1":
            player.attack_enemy(enemy)
            if not enemy.is_alive():
                print(f"{enemy.name} has been defeated!")
                player.inventory.append(f"{enemy.name}'s loot")
                gold_dropped = 0
                # Calculate gold dropped based on enemy type
                if isinstance(enemy, Boss):
                    gold_dropped = random.randint(150, 400)
                else:
                    gold_chance = random.random()
                    if gold_chance < 0.7:
                        gold_dropped = random.randint(15, 15)
                    elif gold_chance < 0.9:
                        gold_dropped = random.randint(20, 20)
                    else:
                        gold_dropped = random.randint(25, 25)
                player.gold += gold_dropped
                print(f"{enemy.name} dropped {gold_dropped} gold!")
                time.sleep(2)  # Wait for 2 seconds to display the loot message
                os.system('clear')  # Clear the screen after loot message
                break
            else:
                time.sleep(1)  # Wait for 1 second before clearing the screen
        else:
            print("Invalid choice. Try again.")

        # Enemy's turn
        if enemy.is_alive():
            os.system('clear')  # Clear the screen before enemy's turn
            print("\nEnemy Turn")
            enemy.attack_enemy(player)
            time.sleep(1)  # Wait for 1 second before clearing the screen
            os.system('clear')  # Clear the screen after enemy's attack

            if player.burned:
                print(f"{player.name} is burned!")
                player.burned = False  # Remove the burned debuff after displaying it
            elif player.critical:
                print(f"{player.name} is under the effect of a critical hit!")
                player.critical = False  # Remove the critical debuff after displaying it
            elif player.piercing:
                print(f"{player.name} ignores defenses!")
                player.piercing = False  # Remove the piercing debuff after displaying it

    if player.is_alive():
        print("You win!")
    if not player.is_alive():
      print("Game over!")
      time.sleep(2)  # Wait for 2 seconds before clearing the screen
      os.system('clear')  # Clear the screen after game over
      print("""
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⠀⠀⠀⢀⣴⣿⡶⠀⣾⣿⣿⡿⠟⠛⠁
⠀⠀⠀⠀⠀⠀⣀⣀⣄⣀⠀⠀⠀⠀⣶⣶⣦⠀⠀⠀⠀⣼⣿⣿⡇⠀⣠⣿⣿⣿⠇⣸⣿⣿⣧⣤⠀⠀⠀
⠀⠀⢀⣴⣾⣿⡿⠿⠿⠿⠇⠀⠀⣸⣿⣿⣿⡆⠀⠀⢰⣿⣿⣿⣷⣼⣿⣿⣿⡿⢀⣿⣿⡿⠟⠛⠁⠀⠀
⠀⣴⣿⡿⠋⠁⠀⠀⠀⠀⠀⠀⢠⣿⣿⣹⣿⣿⣿⣿⣿⣿⡏⢻⣿⣿⢿⣿⣿⠃⣼⣿⣯⣤⣴⣶⣿⡤⠀
⣼⣿⠏⠀⣀⣠⣤⣶⣾⣷⠄⣰⣿⣿⡿⠿⠻⣿⣯⣸⣿⡿⠀⠀⠀⠁⣾⣿⡏⢠⣿⣿⠿⠛⠋⠉⠀⠀⠀
⣿⣿⠲⢿⣿⣿⣿⣿⡿⠋⢰⣿⣿⠋⠀⠀⠀⢻⣿⣿⣿⠇⠀⠀⠀⠀⠙⠛⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀
⠹⢿⣷⣶⣿⣿⠿⠋⠀⠀⠈⠙⠃⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⣴⣶⣦⣤⡀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⡇⢰⣶⣶⣾⡿⠷⣿⣿⣿⡟⠛⣉⣿⣿⣿⠆
⠀⠀⠀⠀⠀⠀⢀⣤⣶⣿⣿⡎⣿⣿⣦⠀⠀⠀⢀⣤⣾⠟⢀⣿⣿⡟⣁⠀⠀⣸⣿⣿⣤⣾⣿⡿⠛⠁⠀
⠀⠀⠀⠀⣠⣾⣿⡿⠛⠉⢿⣦⠘⣿⣿⡆⠀⢠⣾⣿⠋⠀⣼⣿⣿⣿⠿⠷⢠⣿⣿⣿⠿⢻⣿⣧⠀⠀⠀
⠀⠀⠀⣴⣿⣿⠋⠀⠀⠀⢸⣿⣇⢹⣿⣷⣰⣿⣿⠃⠀⢠⣿⣿⢃⣀⣤⣤⣾⣿⡟⠀⠀⠀⢻⣿⣆⠀⠀
⠀⠀⠀⣿⣿⡇⠀⠀⢀⣴⣿⣿⡟⠀⣿⣿⣿⣿⠃⠀⠀⣾⣿⣿⡿⠿⠛⢛⣿⡟⠀⠀⠀⠀⠀⠻⠿⠀⠀
⠀⠀⠀⠹⣿⣿⣶⣾⣿⣿⣿⠟⠁⠀⠸⢿⣿⠇⠀⠀⠀⠛⠛⠁⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠈⠙⠛⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
""")
      exit()  # Exit the game after displaying the game over message

import platform

class Player(Character):
    def __init__(self, name):
        super().__init__(name, hp=100, attack=10)
        self.inventory = []
        self.stunned = False  # Initialize stunned attribute
        self.defense = 5
        self.resistance = 0
        self.gold = 0  # Initialize gold currency
        self.experience = 0
        self.level = 15
        self.exp_required = 100  # Initial experience required to level up
        self.max_hp_increase_per_level = 30
        self.attack_increase_per_level = 0.004  # 0.4%
        self.defense_increase_per_level = 0.005  # 0.5%
        self.resistance_increase_per_level = 0.0015  # 0.15%

    def gain_experience(self, amount):
        self.experience += amount
        while self.experience >= self.exp_required:
            self.level_up()

    def level_up(self):
        self.level += 1
        self.experience -= self.exp_required
        self.exp_required += 50  # Increase experience required for next level
        self.max_hp += self.max_hp_increase_per_level  # Increase maximum health upon leveling up
        self.hp = self.max_hp  # Heal player to full health upon leveling up
        self.attack = int(self.attack * (1 + self.attack_increase_per_level))  # Increase attack power upon leveling up
        self.defense = int(self.defense * (1 + self.defense_increase_per_level))  # Increase defense upon leveling up
        self.resistance = int(self.resistance * (1 + self.resistance_increase_per_level))  # Increase resistance upon leveling up
        print(f"Congratulations! You've reached level {self.level}!")

    def display_stats(self):
        print(f"Character Name: {self.name}")
        print(f"Level: {self.level}")
        print(f"Experience: {self.experience}/{self.exp_required}")
        print(f"Health: {self.hp}/{self.max_hp}")
        print(f"Attack: {self.attack}")
        print(f"Defense: {self.defense} ({self.defense * 0.2}%)")
        print(f"Resistance: {self.resistance} ({self.resistance * 0.2}%)")
        print(f"Curses: {self.curses}")
        if self.burned:
            print("Burned!")
        if self.critical:
            print("Critical!")
        if self.piercing:
            print("Piercing!")
        print(f"Gold: {self.gold}")

        while True:
            print("\nPlayer Menu:")
            print("1. Back to Game")
            print("2. Shop")
            print("3. Inventory")
            choice = input("Enter your choice: ")

            if choice == "1":
                os.system('clear')  # Clear the screen after choosing to go back to the game
                break
            elif choice == "2":
                print("Welcome to the Shop!")
                # Implement shop functionality here
            elif choice == "3":
                print("Inventory:")
                for item in self.inventory:
                    print(item)
                print("End of Inventory")
            else:
                print("Invalid choice. Please enter a valid option.")

import os

def main():
    while True:
        print("\nWelcome to BeaVenture!")
        print("1. Start")
        print("2. Exit")
        choice = input("Enter your choice: ")

        if choice == "1":
            os.system('clear')  # Clear the screen after pressing "Start"
            player_name = input("Enter your character's name: ")
            os.system('clear')  # Clear the screen after entering the player's name
            player = Player(player_name)
            print(f"\nWelcome, {player.name}!")
            player.display_stats()
            while True:
                print("How do you want to start?")
                print("\n1. Continue")
                print("2. Back")
                choice = input("Enter your choice: ")
                if choice == "1":
                    enemies = [
                        Enemy("Goblin", 50, 5),
                        Enemy("Orc", 70, 10),
                        Enemy("Dragon", 100, 20),
                        Enemy("Skeleton", 40, 7),
                        Enemy("Witch", 60, 12),
                        Boss("Red Leaf", 300, 40),  # Boss enemy type starts here
                        Boss("Lubricant", 500, 60),
                        Boss("The OverSeer", 700, 80),
                        Boss("The Insight", 1000, 100),
                        Boss("Surgeragon", 1500, 150)  # Last boss enemy
                    ]
                    while player.is_alive():
                        enemy = random.choice(enemies)
                        if isinstance(enemy, Boss):  # Check if the enemy is a boss
                            print("Doomed!")
                            print("The Boss Is1 Approaching!")
                        battle(player, enemy)
                        if input("Do you want to play again? (yes/no): ").lower() != "yes":
                            break
                    break
                elif choice == "2":
                    break
                else:
                    print("Invalid choice. Please enter 1 or 2.")
        elif choice == "2":
            print("Exiting the game. Goodbye!")
            break
        else:
            print("Invalid choice. Please enter 1 or 2.")

if __name__ == "__main__":
    main()

downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter