from random import randint choice class Character def __init__ self mi

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
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