From 83d2b9e719726fe4619a3addbc1efc2109683012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=91=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sun, 20 Mar 2022 20:07:45 +0600 Subject: [PATCH 1/3] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=201,?= =?UTF-8?q?=20=D0=BE=D1=87=D0=B5=D0=BD=D1=8C=20=D1=81=D1=8B=D1=80=D0=B0?= =?UTF-8?q?=D1=8F,=20=D0=BD=D0=BE=20=D1=83=D0=B6=D0=B5=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++ .idea/inspectionProfiles/Project_Default.xml | 12 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + .idea/ya_36_hack_oop.iml | 8 ++ Arena.py | 130 ++++++++++++++++++ 8 files changed, 182 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/ya_36_hack_oop.iml create mode 100644 Arena.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..d1889b6 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..13fecf3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..70ff506 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/ya_36_hack_oop.iml b/.idea/ya_36_hack_oop.iml new file mode 100644 index 0000000..786dd58 --- /dev/null +++ b/.idea/ya_36_hack_oop.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Arena.py b/Arena.py new file mode 100644 index 0000000..19a17f6 --- /dev/null +++ b/Arena.py @@ -0,0 +1,130 @@ +import random + +possible_paladin_names = ['Ярза', 'Виллирал', 'Фарельльт', 'Утер', + 'Тэйфест', 'Болвар', 'Арбнэнам', 'Кейсэна', + 'Гегель', 'Довастин', 'Берлен', 'Лисорба', + 'Грелек', 'Гуон', 'Семкиль', 'Сайданлия', + 'Тариса', 'Джелейса', 'Ломанир', 'Гайя'] +possible_warrior_names = ['Хольгор', 'Гаррош', 'Кайру', 'Тройлин', + 'Винелен', 'Расельмир', 'Лирозаэль', 'Удлан', + 'Лоти', 'Завак', 'Делрани', 'Гритейр', 'Рикхэйл', + 'Скузза', 'Мар', 'Хасижоу', 'Варриан', 'Магни', + 'Меветал', 'Виллорн', 'Холекта'] + + +class Thing: + def __init__(self, name, hit_points, attack_rate, defence): + self.name = name + self.hit_points = hit_points + self.attack_rate = attack_rate + self.defence = defence + + +wooden_sword = Thing('деревянный меч', 0, 3, 0) +legendary_sword = Thing('легендарный меч', 20, 30, 10) +straw_hat = Thing('соломенная шляпа', 0, 0, 2) +all_thing_list = [wooden_sword, legendary_sword, straw_hat] + + +class Person: + def __init__(self, name, + hit_points=100, + attack_rate=20, + defence=10, + inventory=0): + self.name = name + self.hit_points = hit_points + self.attack_rate = attack_rate + self.defence = defence + self.inventory = inventory + + +class Warrior(Person): + WARRIOR_ATTACK_MULTIPLIER = 2 + + def __init__(self, + name, + hit_points=100, + attack_rate=20 * WARRIOR_ATTACK_MULTIPLIER, + defence=10, + inventory=0): + self.name = name + self.hit_points = hit_points + self.attack_rate = attack_rate + self.defence = defence + self.inventory = inventory + super().__init__(name, hit_points, attack_rate, defence, inventory) + + +class Paladin(Person): + PALADIN_HIT_POINTS_MULTIPLIER = 2 + PALADIN_DEFENCE_MULTIPLIER = 2 + + def __init__(self, + name, + hit_points=100 * PALADIN_HIT_POINTS_MULTIPLIER, + attack_rate=20, + defence=10 * PALADIN_DEFENCE_MULTIPLIER, + inventory=0): + self.name = name + self.hit_points = hit_points + self.attack_rate = attack_rate + self.defence = defence + self.inventory = inventory + super().__init__(name, hit_points, attack_rate, defence, inventory) + + +def create_things(): + created_thing_list = [] + for i in range(random.randint(10, 40)): + new_thing = random.choice(all_thing_list) + created_thing_list.append(new_thing) + return created_thing_list + + +def create_characters(): + created_characters_list = [] + for i in range(10): + random_class = random.choice([Paladin, Warrior]) + new_character = random_class(random.choice(possible_paladin_names)) + # print(new_character.name, new_character.__class__.__name__) + created_characters_list.append(new_character) + return created_characters_list + + +def things_distribution(characters_list, thing_list): + for i in range(len(thing_list)): + random_character = random.choice(characters_list) + if random_character.inventory == 4: + continue + setattr(random_character, 'hit_points', random_character.hit_points + + thing_list[i].hit_points) + setattr(random_character, 'attack_rate', random_character.attack_rate + + thing_list[i].attack_rate) + setattr(random_character, 'defence', random_character.defence + + thing_list[i].defence) + setattr(random_character, 'inventory', random_character.inventory + 1) + + return characters_list + + +ready_for_battle_characters = things_distribution(create_characters(), + create_things()) +while len(ready_for_battle_characters) != 1: + attacking_character = random.choice(ready_for_battle_characters) + defending_character = random.choice(ready_for_battle_characters) + if attacking_character == defending_character: + continue + print(f'{attacking_character.name} наносит ' + f'{(attacking_character.attack_rate - attacking_character.attack_rate * (defending_character.defence/100)):.0f} урона по ' + f'{defending_character.name}') + setattr(defending_character, 'hit_points', defending_character.hit_points + - (attacking_character.attack_rate + - attacking_character.attack_rate + * (defending_character.defence/100))) + print(f'теперь у него {defending_character.hit_points:.0f} здоровья') + print('-------------------------------------------------') + if defending_character.hit_points < 0: + ready_for_battle_characters.remove(defending_character) + if len(ready_for_battle_characters) == 1: + print(ready_for_battle_characters[0].name, 'победил') \ No newline at end of file From 3f2d654fe2522f7c3bd87e543e87a1590eaf40ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=91=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Mon, 21 Mar 2022 00:17:59 +0600 Subject: [PATCH 2/3] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=202,?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=B2=D0=B5=D1=89=D0=B5?= =?UTF-8?q?=D0=B9,=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B5,=20=D1=83=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B0=20=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=81=D0=BB=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B5=D1=89=D0=B5=D0=B9,=20=D1=83?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=20=D0=B2=D0=B5=D1=89=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Arena.py | 136 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 42 deletions(-) diff --git a/Arena.py b/Arena.py index 19a17f6..8797255 100644 --- a/Arena.py +++ b/Arena.py @@ -13,68 +13,105 @@ class Thing: - def __init__(self, name, hit_points, attack_rate, defence): + """Класс вещей""" + def __init__(self, name, hit_points, attack_rate, defence, slot): self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - - -wooden_sword = Thing('деревянный меч', 0, 3, 0) -legendary_sword = Thing('легендарный меч', 20, 30, 10) -straw_hat = Thing('соломенная шляпа', 0, 0, 2) -all_thing_list = [wooden_sword, legendary_sword, straw_hat] + self.slot = slot + + +wooden_sword = Thing('деревянный меч', 0, 3, 0, 'weapon') +legendary_sword = Thing('легендарный меч', 20, 30, 5, 'weapon') +steel_sword = Thing('стальной меч', 0, 8, 0, 'weapon') +war_hammer = Thing('боевой молот', 0, 15, 0, 'weapon') +straw_hat = Thing('соломенная шляпа', 0, 0, 2, 'helm') +mail_hood = Thing('кольчужный капюшон', 8, 0, 5, 'helm') +bascinet = Thing('бацинет', 12, 0, 8, 'helm') +legendary_helm = Thing('легендарный шлем', 20, 0, 10, 'helm') +rabbit_foot = Thing('кроличья лапка', 1, 1, 1, 'accessory') +magic_ring = Thing('волшебное кольцо', 3, 3, 3, 'accessory') +amulet_of_strength = Thing('амулет силы', 0, 12, 0, 'accessory') +ring_of_omnipotence = Thing('кольцо всевластия', 10, 10, 5, 'accessory') +home_bathrobe = Thing('домашний халат', 0, 0, 2, 'armor') +chain_mail = Thing('кольчуга', 10, 0, 5, 'armor') +full_armor = Thing('полные латы', 15, 0, 8, 'armor') +legendary_armor = Thing('легендарная броня', 20, 0, 10, 'armor') + +all_thing_list = [wooden_sword, steel_sword, war_hammer, legendary_sword, + straw_hat, mail_hood, bascinet, legendary_helm, + rabbit_foot, magic_ring, amulet_of_strength, + ring_of_omnipotence, home_bathrobe, chain_mail, full_armor, + legendary_armor] class Person: - def __init__(self, name, - hit_points=100, - attack_rate=20, - defence=10, - inventory=0): + """Базовый класс персонажей""" + def __init__(self, name, hit_points=100, attack_rate=20, defence=10): self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory + + def get_damage(self, attacker): + """Получить количество урона""" + return (attacker.attack_rate - attacker.attack_rate + * (self.defence/100)) + + def get_hitpoints(self, attacker): + """Получить количество хп оставшихся после удара""" + return (self.hit_points - (attacker.attack_rate - attacker.attack_rate + * (self.defence/100))) class Warrior(Person): + """Класс воина""" + WARRIOR_ATTACK_MULTIPLIER = 2 - def __init__(self, - name, - hit_points=100, - attack_rate=20 * WARRIOR_ATTACK_MULTIPLIER, - defence=10, - inventory=0): + def __init__(self, name, hit_points=100, + attack_rate=20 * WARRIOR_ATTACK_MULTIPLIER, defence=10, + weapon='ничего нет(!)', helm='повязка', + accessory='серьга в носу', armor='рубаха'): + """Добавлены слоты для вещей, чтобы они не дублировались, + и значения по умолчанию, чтобы бойцы не выступали голыми""" self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory - super().__init__(name, hit_points, attack_rate, defence, inventory) + self.weapon = weapon + self.helm = helm + self.accessory = accessory + self.armor = armor + super().__init__(name, hit_points, attack_rate, defence) class Paladin(Person): + """Класс паладина""" + PALADIN_HIT_POINTS_MULTIPLIER = 2 PALADIN_DEFENCE_MULTIPLIER = 2 - def __init__(self, - name, - hit_points=100 * PALADIN_HIT_POINTS_MULTIPLIER, - attack_rate=20, - defence=10 * PALADIN_DEFENCE_MULTIPLIER, - inventory=0): + def __init__(self, name, hit_points=100 * PALADIN_HIT_POINTS_MULTIPLIER, + attack_rate=20, defence=10 * PALADIN_DEFENCE_MULTIPLIER, + weapon='ничего нет(!)', helm='повязка', + accessory='священный символ', armor='ряса'): + """Добавлены слоты для вещей, чтобы они не дублировались, + и значения по умолчанию, чтобы бойцы не выступали голыми""" self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory - super().__init__(name, hit_points, attack_rate, defence, inventory) + self.weapon = weapon + self.helm = helm + self.accessory = accessory + self.armor = armor + super().__init__(name, hit_points, attack_rate, defence) def create_things(): + """Создаем случайное количество вещей из списка доступных""" created_thing_list = [] for i in range(random.randint(10, 40)): new_thing = random.choice(all_thing_list) @@ -83,48 +120,63 @@ def create_things(): def create_characters(): + """Создаем 10 бойцов""" created_characters_list = [] for i in range(10): random_class = random.choice([Paladin, Warrior]) new_character = random_class(random.choice(possible_paladin_names)) - # print(new_character.name, new_character.__class__.__name__) created_characters_list.append(new_character) return created_characters_list def things_distribution(characters_list, thing_list): + """Раздаем вещи бойцам""" for i in range(len(thing_list)): random_character = random.choice(characters_list) - if random_character.inventory == 4: - continue + slot = thing_list[i].slot setattr(random_character, 'hit_points', random_character.hit_points + thing_list[i].hit_points) setattr(random_character, 'attack_rate', random_character.attack_rate + thing_list[i].attack_rate) setattr(random_character, 'defence', random_character.defence + thing_list[i].defence) - setattr(random_character, 'inventory', random_character.inventory + 1) - + setattr(random_character, slot, thing_list[i].name) return characters_list +def info_message(): + """Сообщение с информацией о бойцах""" + print('На арену выходят!') + for i in range(len(ready_for_battle_characters)): + print(f'{ready_for_battle_characters[i].__class__.__name__} ' + f'{ready_for_battle_characters[i].name} у него в руках ' + f'{ready_for_battle_characters[i].weapon}, на голове ' + f'{ready_for_battle_characters[i].helm}, на теле ' + f'{ready_for_battle_characters[i].armor}, его аксессуар ' + f'{ready_for_battle_characters[i].accessory} ХАРАКТЕРИСТИКИ: ' + f'Здоровье - {ready_for_battle_characters[i].hit_points}, ' + f'Сила удара - {ready_for_battle_characters[i].attack_rate}, ' + f'Защита - {ready_for_battle_characters[i].defence}%') + + ready_for_battle_characters = things_distribution(create_characters(), create_things()) -while len(ready_for_battle_characters) != 1: +info_message() +while len(ready_for_battle_characters) != 1: # Главный цикл attacking_character = random.choice(ready_for_battle_characters) defending_character = random.choice(ready_for_battle_characters) if attacking_character == defending_character: continue print(f'{attacking_character.name} наносит ' - f'{(attacking_character.attack_rate - attacking_character.attack_rate * (defending_character.defence/100)):.0f} урона по ' + f'{Person.get_damage(defending_character, attacking_character):.0f} ' + f'урона по ' f'{defending_character.name}') - setattr(defending_character, 'hit_points', defending_character.hit_points - - (attacking_character.attack_rate - - attacking_character.attack_rate - * (defending_character.defence/100))) + setattr(defending_character, 'hit_points', + Person.get_hitpoints(defending_character, attacking_character)) print(f'теперь у него {defending_character.hit_points:.0f} здоровья') - print('-------------------------------------------------') if defending_character.hit_points < 0: ready_for_battle_characters.remove(defending_character) + print(f'{defending_character.name} погибает') + print('-------------------------------------------------') if len(ready_for_battle_characters) == 1: - print(ready_for_battle_characters[0].name, 'победил') \ No newline at end of file + print(ready_for_battle_characters[0].name, 'побеждает!') From 745257ab554d6e2c70f33df52b1787e8b5754bb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=91=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Mon, 21 Mar 2022 00:17:59 +0600 Subject: [PATCH 3/3] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=202=20?= =?UTF-8?q?=D0=9D=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Arena.py | 136 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 42 deletions(-) diff --git a/Arena.py b/Arena.py index 19a17f6..8797255 100644 --- a/Arena.py +++ b/Arena.py @@ -13,68 +13,105 @@ class Thing: - def __init__(self, name, hit_points, attack_rate, defence): + """Класс вещей""" + def __init__(self, name, hit_points, attack_rate, defence, slot): self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - - -wooden_sword = Thing('деревянный меч', 0, 3, 0) -legendary_sword = Thing('легендарный меч', 20, 30, 10) -straw_hat = Thing('соломенная шляпа', 0, 0, 2) -all_thing_list = [wooden_sword, legendary_sword, straw_hat] + self.slot = slot + + +wooden_sword = Thing('деревянный меч', 0, 3, 0, 'weapon') +legendary_sword = Thing('легендарный меч', 20, 30, 5, 'weapon') +steel_sword = Thing('стальной меч', 0, 8, 0, 'weapon') +war_hammer = Thing('боевой молот', 0, 15, 0, 'weapon') +straw_hat = Thing('соломенная шляпа', 0, 0, 2, 'helm') +mail_hood = Thing('кольчужный капюшон', 8, 0, 5, 'helm') +bascinet = Thing('бацинет', 12, 0, 8, 'helm') +legendary_helm = Thing('легендарный шлем', 20, 0, 10, 'helm') +rabbit_foot = Thing('кроличья лапка', 1, 1, 1, 'accessory') +magic_ring = Thing('волшебное кольцо', 3, 3, 3, 'accessory') +amulet_of_strength = Thing('амулет силы', 0, 12, 0, 'accessory') +ring_of_omnipotence = Thing('кольцо всевластия', 10, 10, 5, 'accessory') +home_bathrobe = Thing('домашний халат', 0, 0, 2, 'armor') +chain_mail = Thing('кольчуга', 10, 0, 5, 'armor') +full_armor = Thing('полные латы', 15, 0, 8, 'armor') +legendary_armor = Thing('легендарная броня', 20, 0, 10, 'armor') + +all_thing_list = [wooden_sword, steel_sword, war_hammer, legendary_sword, + straw_hat, mail_hood, bascinet, legendary_helm, + rabbit_foot, magic_ring, amulet_of_strength, + ring_of_omnipotence, home_bathrobe, chain_mail, full_armor, + legendary_armor] class Person: - def __init__(self, name, - hit_points=100, - attack_rate=20, - defence=10, - inventory=0): + """Базовый класс персонажей""" + def __init__(self, name, hit_points=100, attack_rate=20, defence=10): self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory + + def get_damage(self, attacker): + """Получить количество урона""" + return (attacker.attack_rate - attacker.attack_rate + * (self.defence/100)) + + def get_hitpoints(self, attacker): + """Получить количество хп оставшихся после удара""" + return (self.hit_points - (attacker.attack_rate - attacker.attack_rate + * (self.defence/100))) class Warrior(Person): + """Класс воина""" + WARRIOR_ATTACK_MULTIPLIER = 2 - def __init__(self, - name, - hit_points=100, - attack_rate=20 * WARRIOR_ATTACK_MULTIPLIER, - defence=10, - inventory=0): + def __init__(self, name, hit_points=100, + attack_rate=20 * WARRIOR_ATTACK_MULTIPLIER, defence=10, + weapon='ничего нет(!)', helm='повязка', + accessory='серьга в носу', armor='рубаха'): + """Добавлены слоты для вещей, чтобы они не дублировались, + и значения по умолчанию, чтобы бойцы не выступали голыми""" self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory - super().__init__(name, hit_points, attack_rate, defence, inventory) + self.weapon = weapon + self.helm = helm + self.accessory = accessory + self.armor = armor + super().__init__(name, hit_points, attack_rate, defence) class Paladin(Person): + """Класс паладина""" + PALADIN_HIT_POINTS_MULTIPLIER = 2 PALADIN_DEFENCE_MULTIPLIER = 2 - def __init__(self, - name, - hit_points=100 * PALADIN_HIT_POINTS_MULTIPLIER, - attack_rate=20, - defence=10 * PALADIN_DEFENCE_MULTIPLIER, - inventory=0): + def __init__(self, name, hit_points=100 * PALADIN_HIT_POINTS_MULTIPLIER, + attack_rate=20, defence=10 * PALADIN_DEFENCE_MULTIPLIER, + weapon='ничего нет(!)', helm='повязка', + accessory='священный символ', armor='ряса'): + """Добавлены слоты для вещей, чтобы они не дублировались, + и значения по умолчанию, чтобы бойцы не выступали голыми""" self.name = name self.hit_points = hit_points self.attack_rate = attack_rate self.defence = defence - self.inventory = inventory - super().__init__(name, hit_points, attack_rate, defence, inventory) + self.weapon = weapon + self.helm = helm + self.accessory = accessory + self.armor = armor + super().__init__(name, hit_points, attack_rate, defence) def create_things(): + """Создаем случайное количество вещей из списка доступных""" created_thing_list = [] for i in range(random.randint(10, 40)): new_thing = random.choice(all_thing_list) @@ -83,48 +120,63 @@ def create_things(): def create_characters(): + """Создаем 10 бойцов""" created_characters_list = [] for i in range(10): random_class = random.choice([Paladin, Warrior]) new_character = random_class(random.choice(possible_paladin_names)) - # print(new_character.name, new_character.__class__.__name__) created_characters_list.append(new_character) return created_characters_list def things_distribution(characters_list, thing_list): + """Раздаем вещи бойцам""" for i in range(len(thing_list)): random_character = random.choice(characters_list) - if random_character.inventory == 4: - continue + slot = thing_list[i].slot setattr(random_character, 'hit_points', random_character.hit_points + thing_list[i].hit_points) setattr(random_character, 'attack_rate', random_character.attack_rate + thing_list[i].attack_rate) setattr(random_character, 'defence', random_character.defence + thing_list[i].defence) - setattr(random_character, 'inventory', random_character.inventory + 1) - + setattr(random_character, slot, thing_list[i].name) return characters_list +def info_message(): + """Сообщение с информацией о бойцах""" + print('На арену выходят!') + for i in range(len(ready_for_battle_characters)): + print(f'{ready_for_battle_characters[i].__class__.__name__} ' + f'{ready_for_battle_characters[i].name} у него в руках ' + f'{ready_for_battle_characters[i].weapon}, на голове ' + f'{ready_for_battle_characters[i].helm}, на теле ' + f'{ready_for_battle_characters[i].armor}, его аксессуар ' + f'{ready_for_battle_characters[i].accessory} ХАРАКТЕРИСТИКИ: ' + f'Здоровье - {ready_for_battle_characters[i].hit_points}, ' + f'Сила удара - {ready_for_battle_characters[i].attack_rate}, ' + f'Защита - {ready_for_battle_characters[i].defence}%') + + ready_for_battle_characters = things_distribution(create_characters(), create_things()) -while len(ready_for_battle_characters) != 1: +info_message() +while len(ready_for_battle_characters) != 1: # Главный цикл attacking_character = random.choice(ready_for_battle_characters) defending_character = random.choice(ready_for_battle_characters) if attacking_character == defending_character: continue print(f'{attacking_character.name} наносит ' - f'{(attacking_character.attack_rate - attacking_character.attack_rate * (defending_character.defence/100)):.0f} урона по ' + f'{Person.get_damage(defending_character, attacking_character):.0f} ' + f'урона по ' f'{defending_character.name}') - setattr(defending_character, 'hit_points', defending_character.hit_points - - (attacking_character.attack_rate - - attacking_character.attack_rate - * (defending_character.defence/100))) + setattr(defending_character, 'hit_points', + Person.get_hitpoints(defending_character, attacking_character)) print(f'теперь у него {defending_character.hit_points:.0f} здоровья') - print('-------------------------------------------------') if defending_character.hit_points < 0: ready_for_battle_characters.remove(defending_character) + print(f'{defending_character.name} погибает') + print('-------------------------------------------------') if len(ready_for_battle_characters) == 1: - print(ready_for_battle_characters[0].name, 'победил') \ No newline at end of file + print(ready_for_battle_characters[0].name, 'побеждает!')