forked from Turonk/character_creation_module
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
150 lines (128 loc) · 7.47 KB
/
main.py
File metadata and controls
150 lines (128 loc) · 7.47 KB
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
# Импортируем функцию стандартного модуля random.
from random import randint
# Вот она — новая глобальная константа.
DEFAULT_ATTACK = 5
# Новая константа — стандартное значение защиты.
DEFAULT_DEFENCE = 10
DEFAULT_STAMINA = 80
class Character:
# Константа для диапазона очков урона.
RANGE_VALUE_ATTACK = (1, 3)
# Новая переменная класса — диапазон значения защиты.
RANGE_VALUE_DEFENCE = (1, 5)
SPECIAL_BUFF = 15
SPECIAL_SKILL = 'Удача'
BRIEF_DESC_CHAR_CLASS = 'отважный любитель приключений'
# Объявляем конструктор класса.
def __init__(self, name):
self.name = name
# Объявляем метод атаки
def attack(self):
# Вместо диапазона записана переменная класса.
# Оператор * распаковывает передаваемый кортеж.
value_attack = DEFAULT_ATTACK + randint(*self.RANGE_VALUE_ATTACK)
return (f'{self.name} нанёс противнику урон, равный {value_attack}')
# Объявляем метод защиты.
def defence(self):
# Вычисляем значение защиты в переменной value_defence.
value_defence = DEFAULT_DEFENCE + randint(*self.RANGE_VALUE_DEFENCE)
return (f'{self.name} блокировал {value_defence} ед. урона.')
# Объявляем метод специального умения.
def special(self):
# Здесь описано тело метода special().
return (f'{self.name} применил специальное умение '
f'"{self.SPECIAL_SKILL} {self.SPECIAL_BUFF}".')
# Новый метод базового класса.
def __str__(self):
return f'{self.__class__.__name__} - {self.BRIEF_DESC_CHAR_CLASS}.'
# Далее описываем классы-наследники.
class Warrior(Character):
BRIEF_DESC_CHAR_CLASS = (' дерзкий воин ближнего боя. '
'Сильный, выносливый и отважный')
RANGE_VALUE_ATTACK = (3, 5)
RANGE_VALUE_DEFENCE = (5, 10)
SPECIAL_BUFF = DEFAULT_STAMINA + 25
SPECIAL_SKILL = 'Выносливость'
class Mage(Character):
BRIEF_DESC_CHAR_CLASS = (' находчивый воин дальнего боя. '
'Обладает высоким интеллектом')
RANGE_VALUE_ATTACK = (5, 10)
RANGE_VALUE_DEFENCE = (-2, 2)
SPECIAL_BUFF = DEFAULT_ATTACK + 40
SPECIAL_SKILL = 'Атака'
class Healer(Character):
BRIEF_DESC_CHAR_CLASS = (' могущественный заклинатель. '
'Черпает силы из природы, веры и духов')
RANGE_VALUE_ATTACK = (-3, -1)
RANGE_VALUE_DEFENCE = (2, 5)
SPECIAL_BUFF = DEFAULT_DEFENCE + 30
SPECIAL_SKILL = 'Защита'
warrior = Warrior('Кодослав')
print(warrior)
print(warrior.attack())
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
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
def start_training(character):
"""
Принимает на вход имя и класс персонажа.
Возвращает сообщения о результатах цикла тренировки персонажа.
"""
char_descriptions = {
'warrior':' ты Воитель — великий мастер ближнего боя.',
'mage': ' ты Маг — превосходный укротитель стихий.',
'healer': ', ты Лекарь — чародей, способный исцелять раны.'
}
print(f'{char_name}, {char_descriptions[char_class]}')
print('Потренируйся управлять своими навыками.')
print('Введи одну из команд: attack — чтобы атаковать противника, '
'defence — чтобы блокировать атаку противника или '
'special — чтобы использовать свою суперсилу.')
print('Если не хочешь тренироваться, введи команду skip.')
commands = {'attack': attack, 'defence': defence, 'special': special}
cmd = None
while cmd != 'skip':
cmd = input('Введи команду: ')
# Замените блок условных операторов на словарь
# и вынесите его из цикла. Здесь останется одно условие
# принадлежности введённой команды словарю.
# В функции print() будет вызываться метод класса,
# который соответствует введённой команде.
if cmd in commands.keys():
print(commands[cmd](char_name, char_class))
return 'Тренировка окончена.'