import random, time 
 
class Characters: 
    def __init__(self, name, hp, attack): 
        self.name = name 
        self.max_hp = hp 
        self.hp = hp 
        self.attack_power = attack 
 
    def is_alive(self): 
        return self.hp > 0 
 
    def show(self): 
        print(f'{self.name}: {self.hp}/{self.max_hp} HP') 
 
    def attack(self, other): 
        damage = random.randint(1, self.attack_power) 
        other.hp -= damage 
        print(f'{self.name} deels {other.name} {damage} damage') 
        other.show 
        time.sleep(0.5) 
 
class hero(Characters): 
    def __init__(self, name, level=1): 
        super().__init__(name, hp=50, attack=5) 
        self.level = level 

    def fight(self, Characters):
        while self.is_alive() and Characters.is_alive():
            self.attack(Characters)
            if Characters.is_alive():
                Characters.attack(self)
 
 
class Player(hero): 
    def __init__(self, name): 
        super().__init__(name, level=1) 
        self.exp = 0 
        self.inventory = [] 
    def gain_exp(self, amount): 
        self.exp += amount 
        if self.exp >= self.level * 10: 
            self.level_up() 
    def level_up(self): 
        self.level += 1 
        self.exp = 0 
        self.max_hp += 5 
        self.attack_power += 2 
        self.hp = self.max_hp
        print(f'{self.name} level up! current level is {self.level}')

    def fight(self, Characters):
        super().fight(Characters)
        if self.is_alive():
            self.gain_exp(Characters.exp_reward)
            
class Monster(Characters):
    def __init__(self, name, hp, attack, exp_reward):
        super().__init__(name, hp, attack)
        self.exp_reward = exp_reward

class Goblin(Monster):
    def __init__(self):
        super().__init__("Goblin", hp = 15, attack = 4, exp_reward = 5)

class Orc(Monster):
    def __init__(self):
        super().__init__("Orc", hp = 35, attack = 6, exp_reward = 10)

class Megalodon(Monster):
    def __init__(self):
        super().__init__("Megalodon", hp = 100, attack = 20, exp_reward = 25)