from random import randint, choice
class Character():
def __init__(self, min_attack, max_attack, defence, hp, energy = 100, block_chance = 0, lvl = 1, current_exp = 0):
self._name = None
self._max_attack = max_attack
self._min_attack = min_attack
self._defence = defence
self._hp = hp
self._current_hp = hp
self._energy = energy
self._current_energy = energy
self._block_chance = block_chance
self._lvl = lvl
self._current_exp = current_exp
self._exp_before_lvl_up = int((100 * self._lvl) + (100 * self._lvl) * 0.1)
self._inventory = {'Зелье маны' : 0}
def attack(self, character):
damage = randint(self._min_attack, self._max_attack) - int(character._defence * 0.2)
if character._current_energy < 10:
print('Вы измотаны. Количество энергии:', character._current_energy, 'Ваш урон будет уменьшен')
damage = int(damage * 0.3)
result_damage = damage if damage > 0 else 1
character._current_hp -= result_damage
return result_damage
def __str__(self):
return self._name
def stats(self):
st = {'Атака':(int((self._max_attack + self._min_attack)/2)),
'Защита':self._defence, 'Здоровье':(self._current_hp, self._hp), 'Энергия':(self._current_energy, self._energy),
'Уровень':self._lvl, 'Опыт':(self._current_exp, self._exp_before_lvl_up)}
for keys, values in st.items():
#if keys == 'Опыт': проверка для пропуска выведения опыта мобов. Но для перса работает некорректно
#continue начисление опыта некорретно при разовом получении опыта больше нескольких уровней
print('|', keys, '-', values, '|')
def block(self):
if randint(1, 100) < 50:
self._current_hp += int(self._hp / 5)
if self._current_hp > self._hp:
self._current_hp = self._hp
print('[ Вы восстановили', int(self._hp / 5), 'единиц здоровья ]')
if randint (1, 100) < self._block_chance:
return True
def show_inventory(self):
return self._inventory
class Warrior(Character):
def __init__(self):
Character.__init__(self, 30, 40, 20, 220, block_chance = 40)
self._name = "Воин"
class Paladin(Character):
def __init__(self):
Character.__init__(self, 25, 30, 30, 250, block_chance = 60)
self._name = "Паладин"
class Goblin(Character):
def __init__(self):
Character.__init__(self, 10, 15, 5, 70)
self._name = "Гоблин"
self._drop = (('Зелье здоровья', 1, 10), ('Зелье здоровья', 2, 5), ('Зелье здоровья', 3, 2),
('Золото', randint(30, 70), 100), ('Грязный рубин', 1, 1))
self._exp = randint(50, 70)
class Rat(Character):
def __init__(self):
Character.__init__(self, 5, 9, 1, 30)
self._name = "Крыса"
self._drop = (('Зелье здоровья', 1, 10), ('Золото', randint(10,20), 100))
self._exp = randint(30, 40)
class Dog(Character):
def __init__(self):
Character.__init__(self, 7, 12, 1, 60)
self._name = "Овчарка"
self._drop = (('Зелье здоровья', 1, 10), ('Зелье здоровья', 2, 5), ('Золото', randint(40, 50), 100))
self._exp = randint(50, 60)
class RB(Character):
def __init__(self):
Character.__init__(self, 150, 220, 100, 2600)
self._name = "РЕЙДБОСС - Гнилостный трупоед"
self._drop = (('Зелье здоровья', 1, 10), ('Зелье здоровья', 2, 5), ('Зелье здоровья', 3, 2), ('Стальной топор разложения (50 - 70)', 1, 100))
self._exp = randint(550, 630)
def use_hp_flask_in_battle(character, enemy):
heal_value = 20
character._current_hp += heal_value
try:
if character._inventory['Зелье здоровья'] > 0:
if character._current_hp > character._hp:
character._current_hp = character._hp
print('<<<Вы восстановили', heal_value, 'единиц здоровья>>>')
print('<<<Текущее здоровье', character._current_hp, 'единиц>>>' )
character._inventory['Зелье здоровья'] -= 1
except KeyError:
print('<<<У вас нет зелий здоровья>>>')
damage = enemy.attack(character)
print('<<<{} нанес вам {}. Осталось {} единиц здоровья>>>'.format(damage, str(enemy),
str(character._current_hp)))
def buy_hp_flask(character):
try:
character._inventory['Зелье здоровья'] += 1
except KeyError:
character._inventory['Зелье здоровья'] = 1
print('Вы купили зелье здоровья. Теперь у вас их', character._inventory['Зелье здоровья'])
def add_exp(character, enemy):
added_exp = enemy._exp
character._current_exp += added_exp
print('Вы получили', added_exp, 'опыта.')
if character._current_exp > character._exp_before_lvl_up:
character._lvl += 1
print('Поздравляем, ваш уровень повышен и теперь', character._lvl, '.')
character._current_exp -= character._exp_before_lvl_up
character._min_attack = int(character._min_attack + (character._min_attack *0.05))
print('Ваша минимальная атака повышена до', character._min_attack, '.')
character._max_attack = int(character._max_attack + (character._max_attack * 0.05))
print('Ваша максимальная атака повышена до', character._max_attack, '.')
character._hp = int(character._hp + (character._hp * 0.1))
print('Ваше здоровье повышено до', character._hp, '.')
character._exp_before_lvl_up = int((100 * character._lvl) + (((30 * character._lvl) * 0.1)**2) * 0.7)
def punch(character, enemy):
print('')
damage = character.attack(enemy)
character._current_energy -= 10
if enemy._current_hp <= 0:
print('<<<Вы нанесли врагу {} урона.>>>'.format(damage))
print(enemy._name, 'убит.')
print('')
else:
print('<<<Вы нанесли врагу {} урона. У врага осталось {} единиц здоровья>>>'.format(damage,
str(enemy._current_hp)))
if enemy._current_hp > 0:
damage = enemy.attack(character)
print('<<<{} урона нанес вам {}. Осталось {} единиц здоровья>>>'.format(damage, str(enemy),
str(character._current_hp)))
def block_failed(character, enemy):
enemy.attack(character)
print('<<<Блокирование неуспешно. {} ударил вас. Осталось {} единиц здоровья.>>>'.format(str(enemy),
str(
character._current_hp)))
def start_battle_text():
print('')
print('Выберете действие:')
print('1. Удар.[1]')
print('2. Блок.[2]')
print('3. Умение "Уничтожение" - мгновенно убивает любое указанное существо.[3]')
print('4. Использовать зелье[зелье]')
print('Введите "стат" для отображения характеристик')
print('Введите "инв" для отображения содержимого инвентаря')
print('')
def way_text():
print('Куда желаете отправиться?')
print('1. Искать другого монстра[охота]')
print('2. Напасть на РЕЙДБОССА Гнилостный трупоед')
print('3. Идти к торговцу[торг]')
def vendor_welcome_text():
print('1. Зелье здоровья[1]')
print('Покинуть лавку[0]')
def get_drop(character, enemy):
count = 0
item = 0
chance = 2
stuff = chance - 2
volume = chance - 1
while count < len(enemy._drop):
if randint(1, 100) < enemy._drop[item][chance]:
if enemy._drop[item][stuff] not in character._inventory:
character._inventory[enemy._drop[item][stuff]] = enemy._drop[item][volume]
print('Ваша добыча:', enemy._drop[item][stuff], enemy._drop[item][volume])
else:
character._inventory[enemy._drop[item][stuff]] += enemy._drop[item][volume]
print('Ваша добыча:', enemy._drop[item][stuff], enemy._drop[item][volume])
count += 1
item += 1
#Spells
def annihil(character, enemy, energy = 100):
if character._current_energy < 100:
print('Невозможно использовать умение. Недостаточно энергии:', energy - character._current_energy)
else:
character._current_energy -= energy
enemy._current_hp = 0
#Characters
enemies = [Goblin, Rat, Dog]
print('Выберите класс:')
print('1. Воин [1]')
print('2. Паладин [2]')
character = input()
if character == 1:
character = Warrior()
elif character == 2:
character = Paladin()
while character._current_hp > 0:
enemy = choice(enemies)()
print('')
print('Вам повстречался враг {}. Хотите ли вступить в схватку?[Да/Нет]'.format(str(enemy)))
print('[', enemy, ']')
enemy.stats()
print('')
answer_start_battle = input().lower()
if answer_start_battle == 'да':
print('<<<Битва начинается>>>')
while enemy._current_hp > 0:
if character._current_hp <= 0:
print('<<<YOU DIED>>>')
break
start_battle_text()
answer_action = input().lower()
if answer_action == '1':
punch(hero_warrior, enemy)
if answer_action == '2':
if character.block():
print('<<<Вы успешно заблокировали удар>>>')
else:
block_failed(character, enemy)
if answer_action == '3':
annihil(character, enemy)
if answer_action == 'зелье':
use_hp_flask_in_battle(character, enemy)
if answer_action == 'стат':
print(character.stats())
if answer_action == 'инв':
print(character.show_inventory())
if enemy._current_hp <= 0:
print('Вы победили')
add_exp(character, enemy)
get_drop(character, enemy)
if character._current_hp <= 0:
print('<<<YOU DIED>>>')
break
elif answer_start_battle == 'нет':
way_text()
answer_action = input().lower()
if answer_action == str(1):
continue
elif answer_action == str(2):
enemy = RB()
print('Перед вами стоит огромный монстр Гнилостный трупоед. У вас все еще есть шанс передумать и уйти.[Уйти/Бой]')
answer_action = input().lower()
if answer_action == 'уйти':
continue
if answer_action == 'бой':
while enemy._hp > 0:
start_battle_text()
answer_action = input().lower()
if answer_action == '1':
punch(character, enemy)
if answer_action == '2':
if character.block():
print('<<<Вы успешно заблокировали удар>>>')
else:
block_failed(character, enemy)
if answer_action == '3':
annihil(character, enemy)
if character._current_hp <= 0:
print('<<<YOU DIED>>>')
break
if rb._current_hp <= 0:
print('<<<Вы победили>>>')
add_exp(character, enemy)
get_drop(character, enemy)
break
elif answer_action == 'торг':
while True:
vendor_welcome_text()
answer_action = input().lower()
if answer_action == '1':
buy_hp_flask(character)
print('Продолжить покупки? [Да/Нет]')
if input().lower() == 'да':
continue
else:
break
elif answer_action == '0':
break
else:
continue