forked from Turonk/character_creation_module
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
135 lines (111 loc) · 6.19 KB
/
main.py
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
# Character_creation_module/main.py with classes
from random import randint
DEFAULT_ATTACK = 5
DEFAULT_DEFENCE = 10
DEFAULT_STAMINA = 80
class Character:
BREIF_DESC_CHAR_CLASS = 'отважный любитель приключений'
RANGE_VALUE_ATTACK = (1, 3)
RANGE_VALUE_DEFENCE = (1, 5)
SPECIAL_SKILL = 'Удача'
SPECIAL_BUFF = 15
def __init__(self, name):
self.name = name
def attack(self):
# Вместо диапазона записана переменная класса.
# Оператор * распаковывает передаваемый кортеж.
value_attack = DEFAULT_ATTACK + randint(*self.RANGE_VALUE_ATTACK)
return (f'{self.name} нанёс противнику урон, равный '
f'{value_attack}')
def defence(self):
value_defence = DEFAULT_DEFENCE + randint(*self.RANGE_VALUE_DEFENCE)
return (f'{self.name} блокировал {value_defence} ед. урона.')
def special(self):
return (f'{self.name} применил специальное умение '
f'"{self.SPECIAL_SKILL} {self.SPECIAL_BUFF}"')
def __str__(self):
return f'{self.__class__.__name__} - {self.BREIF_DESC_CHAR_CLASS}'
class Warrior(Character):
BREIF_DESC_CHAR_CLASS = (' дерзкий воин ближнего боя. '
'Сильный, выносливый и отважный')
RANGE_VALUE_ATTACK = (3, 5)
RANGE_VALUE_DEFENCE = (5, 10)
SPECIAL_BUFF = DEFAULT_STAMINA + 25
SPECIAL_SKILL = 'Выносливость'
# Move training prompt from start_training func into class constant
TRAINING_GREETING = ('ты Воитель — великий мастер ближнего боя.')
class Mage(Character):
BREIF_DESC_CHAR_CLASS = (' находчивый воин дальнего боя. '
'Обладает высоким интеллектом')
RANGE_VALUE_ATTACK = (5, 10)
RANGE_VALUE_DEFENCE = (-2, 2)
SPECIAL_BUFF = DEFAULT_ATTACK + 40
SPECIAL_SKILL = 'Атака'
# Move training prompt from start_training func into class constant
TRAINING_GREETING = ('ты Маг — превосходный укротитель стихий.')
class Healer(Character):
BREIF_DESC_CHAR_CLASS = (' могущественный заклинатель. '
'Черпает силы из природы, веры и духов')
RANGE_VALUE_ATTACK = (-3, -1)
RANGE_VALUE_DEFENCE = (2, 5)
SPECIAL_BUFF = DEFAULT_DEFENCE + 30
SPECIAL_SKILL = 'Защита'
# Move training prompt from start_training func into class constant
TRAINING_GREETING = ('ты Лекарь — чародей, способный исцелять раны.')
def start_training(character):
"""
Принимает на вход имя и класс персонажа.
Возвращает сообщения о результатах цикла тренировки персонажа.
"""
# Замените конструкцию условных операторов на словарь.
print(f'{character.name}, {character.TRAINING_GREETING}')
print('Потренируйся управлять своими навыками.')
print('Введи одну из команд: attack — чтобы атаковать противника, '
'defence — чтобы блокировать атаку противника или '
'special — чтобы использовать свою суперсилу.')
print('Если не хочешь тренироваться, введи команду skip.')
cmd = None
while cmd != 'skip':
cmd = input('Введи команду: ')
# Вместо блока условных операторов добавьте условие
# принадлежности введённой команды словарю.
# В функции print() будет вызываться метод класса,
# который соответствует введённой команде.
skills = {
'attack': character.attack,
'defence': character.defence,
'special': character.special
}
if cmd in skills:
print(skills[cmd]())
return 'Тренировка окончена.'
def choice_char_class(char_name: str) -> Character:
"""
Возвращает строку с выбранным
классом персонажа.
"""
# Добавили словарь, в котором соотносится ввод пользователя
# и класс персонажа.
game_classes = {'warrior': Warrior, 'mage': Mage, 'healer': Healer}
approve_choice: str = None
while approve_choice != 'y':
selected_class = input('Введи название персонажа, '
'за которого хочешь играть: Воитель — warrior, '
'Маг — mage, Лекарь — healer: ')
char_class: Character = game_classes[selected_class](char_name)
# Вывели в терминал описание персонажа.
print(char_class)
approve_choice = input('Нажми (Y), чтобы подтвердить выбор, '
'или любую другую кнопку, '
'чтобы выбрать другого персонажа ').lower()
return char_class
if __name__ == '__main__':
print('Приветствую тебя, искатель приключений!')
print('Прежде чем начать игру...')
char_name: str = input('...назови себя: ')
print(f'Здравствуй, {char_name}! '
f'Сейчас твоя выносливость — 80, атака — 5 и защита — 10.')
print('Ты можешь выбрать один из трёх путей силы:')
print('Воитель, Маг, Лекарь')
char_class: Character = choice_char_class(char_name)
print(start_training(char_class))