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} zadaje {other.name} {damage} obrażeń')
        other.show()
        time.sleep(1)

class hero(characters):
    def __init__(self, name, level=1):
        super().__init__(name, hp=55, 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 += 1
        self.hp = self.max_hp

    def fight(self, characters):
        super().fight(characters)
        if self.is_alive():
            self.gain_exp(characters.exp_reward)
            print (f"{self.name} zdobywa {characters.exp_reward} exp")
        else:
            print(f"{self.name} został pokonany")

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 Zombie(Monster):
    def __init__(self):
        super().__init__("Zombie", hp = 30, attack = 10, exp_reward = 15)

