Kaufleitfaden für Tornado Vape Deutschland

Tornado Vape Deutschland – Die Wahl der Vape-Enthusiasten

Willkommen bei tornado vape deutschland, Ihrem zuverlässigen Partner für alle Vape-Artikel in Deutschland! Unser neuester Star ist der Vape Tornadob, ein Modell, das nicht nur ästhetisch ansprechend, sondern auch technologisch fortschrittlich ist.

Technologie und Leistung

Der Vape Tornadob von Tornado Vape Deutschland ist mit fortschrittlicher Technologie ausgestattet, die einen einzigartigen Vaping-Erlebnis bietet. Mit einem leistungsstarken Chip können Sie eine gleichmäßige Hitze und eine optimale Vape-Experience genießen. Die Benutzerfreundlichkeit des Geräts ist ein weiterer Pluspunkt. Der intuitive Bildschirm ermöglicht es Ihnen, einfach und schnell Ihre bevorzugten Einstellungen vorzunehmen, ohne komplizierte Schritte durchlaufen zu müssen.

Design und Qualität

Bei Tornado Vape Deutschland legen wir großen Wert auf Detailqualität und Design. Der Vape Tornadob ist in einem schicken, minimalistischen Design erhältlich, das sowohl stilvoll als auch robust ist. Die Verwendung hochwertiger Materialien sorgt dafür, dass Ihr Gerät nicht nur schön anzusehen ist, sondern auch langlebig und widerstandsfähig gegen alltägliche Belastungen. Sein kompaktes Design macht den Vape Tornadob perfekt für Reisen oder täglichen Gebrauch.

Akku-Leistung und Ladezeit

Einer der Hauptgründe, warum unsere Kunden zu uns kommen, ist die hohe Akkuleistung unseres Vape Tornadob. Mit einer großen Batteriekapazität können Sie stundenlang vapeden, ohne sich um das Laden sorgen zu müssen. Die schnelle Ladezeit bedeutet, dass Sie nicht lange warten müssen, bis Sie wieder starten können. Unsere Tests haben gezeigt, dass die Ladezeit erheblich kürzer ist als bei vergleichbaren Produkten auf dem Markt.

Kundenservice und Garantie

Bei Tornado Vape Deutschland wissen wir, dass Kundenzufriedenheit Priorität hat. Deshalb bieten wir einen umfassenden Kundenservice an, der rund um die Uhr verfügbar ist, um Ihre Fragen zu beantworten und Probleme zu lösen. Zusätzlich erhalten Sie eine langfristige Garantie für Ihren Vape Tornadob, die Ihnen Sicherheit und Zuversicht gibt, wenn Sie unser Produkt kaufen.

Abschlussbemerkung

Tornado Vape Deutschland ist hier, um Ihnen die beste Vape-Erfahrung zu bieten. Der Vape Tornadob kombiniert perfekte Technologie, robustes Design und lange Akkulaufzeiten zu einem Produkt, das jeden Vape-Liebhaber begeistern wird. Wenn Sie auf der Suche nach einem neuen Vape-Gerät sind, das sowohl ästhetisch ansprechend als auch funktionell ist, dann sollten Sie unbedingt den Vape Tornadob von Tornado Vape Deutschland in Betracht ziehen.

Стек

Что нужно сделать

Мы уже говорили, что в программировании нередко необходимо создавать свои собственные структуры данных на основе уже существующих. Одной из таких «базовых» структур является стек.

Стек — это абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Простой пример: стек из книг на столе. Единственной книгой, чья обложка видна, является самая верхняя. Чтобы получить доступ к, например, третьей снизу книге, нам нужно убрать все книги, лежащие сверху, одну за другой.

Напишите класс, который реализует стек и его возможности (достаточно будет добавления и удаления элемента).

После этого напишите ещё один класс — «Менеджер задач». В менеджере задач можно выполнить команду «новая задача», в которую передаётся сама задача (str) и её приоритет (int). Сам менеджер работает на основе стека (не наследование!). При выводе менеджера в консоль все задачи должны быть отсортированы по приоритету: чем меньше число, тем выше задача.

Вот пример основной программы:

manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)

Результат:
1 отдохнуть
2 поесть; сдать дз
4 сделать уборку; помыть посуду

Дополнительно: реализуйте также удаление задач и подумайте, что делать с дубликатами.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
    • Для создания нового класса на основе уже существующего используется наследование.
  • Формат вывода соответствует примеру.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не a, b, c, d.
  • Классы и методы/функции имеют прописанную документацию.
class TaskManager:
    def __init__(self):
        self.__stack = list()

    def new_task(self, task: str, num: int):
        count_hit = 0
        if len(self.__stack) > 0:
            for i in self.__stack:
                if i[0] == num:
                    i[1] = f'{i[1]}; {task}'
                    count_hit += 1
            if count_hit == 0:
                self.__stack.append([num, task])
        else:
            self.__stack.append([num, task])
        self.__stack = self.__sort_stack(self.__stack)


    def __sort_stack(self, stack: list):
        return sorted(stack, key=lambda task: task[0])

    def del_task(self, num):
        count = 0
        for i in self.__stack:
            if i[0] == num:
                self.__stack.pop(count)
                print(f'Задача {num} удалена.\n')
                break
            count += 1

    def __str__(self):
        print('Список задач:')
        result = ''
        for i in self.__stack:
            result += f'{i[0]} {i[1]}\n'
        return result


manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)
manager.del_task(4)
print(manager)

RPG игра

Вася решил заняться разработкой компьютерных игр (кстати python применяется даже в геймдеве!). Ему поручили разрабатывать искусственный интеллект для союзников, которые сражаются бок о бок с реальными игроками. Но так как Вася пока не силён в теме машинного обучения и нейросетей — ему предстоит заменить эти знания смекалкой и набором if/else условий.

Вася уже написал код, описывающий монстров (файл monsters.py), этот код изменять нельзя. В файле heroes.py вы найдете заготовки системы классов: — базовый класс Hero, который нельзя изменять — наследники класса Tank/Healer/Attacker — их надо изменять

Помимо этого в main.py есть код который:

  1. запускает 1 год сражений — изменять нельзя
  2. создает команду для сражения с монстрами — изменять можно, но с условиями
  3. запускает 20 раз 1 год сражений и подсчитывает количество побед — изменять нельзя

Ваша задача:

  1. Дописать код в классы Tank/Healer/Attacker в файле heroes.py
  2. Сформировать команду в main.py
  3. Проверить, что с выбранной вами стратегией герои побеждают монстров как минимум в половине случаев (>=10 побед из 20)

Цель: Из 20 сражений нужно побеждать как минимум в 10 (в сражениях много случайностей, поэтому убедитесь в нескольких разных запусках ваша команда набирает нужное количество очков).

Советы и рекомендации:

  • Внимательно изучите код поведения монстров (изменять его нельзя, но изучать не запрещено)
  • При помощи команды принт выводите информацию о том кто и что делает в каждый день (особое внимание уделите информации, которая идёт в последние дни перед поражением героев)
  • На основе полученной информации попробуйте изменять приоритеты действий (обратите внимание, что вы можете не только выбирать действие для выполнения, но также выбрать цель для действия. Иногда может быть выгоднее атаковать монстров конкретного класса, чтобы уменьшить урон по вашей команде.)
import random


class Hero:
    # Базовый класс, который не подлежит изменению
    # У каждого наследника будут атрибуты:
    # - Имя
    # - Здоровье
    # - Сила
    # - Жив ли объект
    # Каждый наследник будет уметь:
    # - Атаковать
    # - Получать урон
    # - Выбирать действие для выполнения
    # - Описывать своё состояние

    max_hp = 150
    start_power = 10

    def __init__(self, name):
        self.name = name
        self.__hp = self.max_hp
        self.__power = self.start_power
        self.__is_alive = True

    def get_hp(self):
        return self.__hp

    def set_hp(self, new_value):
        self.__hp = max(new_value, 0)

    def get_power(self):
        return self.__power

    def set_power(self, new_power):
        self.__power = new_power

    def is_alive(self):
        return self.__is_alive

    # Все наследники должны будут переопределять каждый метод базового класса (кроме геттеров/сеттеров)
    # Переопределенные методы должны вызывать методы базового класса (при помощи super).
    # Методы attack и __str__ базового класса можно не вызывать (т.к. в них нету кода).
    # Они нужны исключительно для наглядности.
    # Метод make_a_move базового класса могут вызывать только герои, не монстры.
    def attack(self, target):
        # Каждый наследник будет наносить урон согласно правилам своего класса
        raise NotImplementedError("Вы забыли переопределить метод Attack!")

    def take_damage(self, damage):
        # Каждый наследник будет получать урон согласно правилам своего класса
        # При этом у всех наследников есть общая логика, которая определяет жив ли объект.
        print("\t", self.name, "Получил удар с силой равной = ", round(damage), ". Осталось здоровья - ", round(self.get_hp()))
        # Дополнительные принты помогут вам внимательнее следить за боем и изменять стратегию, чтобы улучшить выживаемость героев
        if self.get_hp() <= 0:
            self.__is_alive = False

    def make_a_move(self, friends, enemies):
        # С каждым днём герои становятся всё сильнее.
        self.set_power(self.get_power() + 0.1)

    def __str__(self):
        # Каждый наследник должен выводить информацию о своём состоянии, чтобы вы могли отслеживать ход сражения
        raise NotImplementedError("Вы забыли переопределить метод __str__!")


class Healer(Hero):

    def __init__(self, name):
        super().__init__(name)
        self.magic_power = (self.get_power() * 3)

    def attack(self, target):
        target.take_damage(self.get_power() / 2)

    def take_damage(self, damage):
        self.set_hp(self.get_hp() - (1.2 * damage))
        super().take_damage(damage)

    def healing(self, target):
        target.set_hp((target.get_hp() + self.magic_power))

    def make_a_move(self, friends, enemies):
        for hero in friends:
            if hero.get_hp() < 150:
                self.healing(hero)
        else:
            target = random.choice(enemies)
            self.attack(target)
        super().make_a_move(friends, enemies)

    def __str__(self):
        return f'{self.name} имеет {self.get_hp()} здоровья и {self.get_power()} силы.'


# Целитель:
    # Атрибуты:
    # - магическая сила - равна значению НАЧАЛЬНОГО показателя силы умноженному на 3 (self.__power * 3)
    # Методы:
    # - атака - может атаковать врага, но атакует только в половину силы self.__power
    # - получение урона - т.к. защита целителя слаба - он получает на 20% больше урона (1.2 * damage)
    # - исцеление - увеличивает здоровье цели на величину равную своей магической силе
    # - выбор действия - получает на вход всех союзников и всех врагов и на основе своей стратегии выполняет ОДНО из действий (атака,
    # исцеление) на выбранную им цель


class Tank(Hero):
    def __init__(self, name):
        super().__init__(name)
        self.protection = 1
        self.shied_raised = True

    def attack(self, target):
        target.take_damage(self.get_power() / 2)

    def take_damage(self, damage):
        self.set_hp(self.get_hp() - (1.2 * damage))
        super().take_damage(damage)

    def raise_shield(self):
        if self.shied_raised == False:
            self.shied_raised = True
        if self.shied_raised == True:
            self.protection *= 2
            self.set_power(self.get_power() / 2)

    def lower_shield(self):
        if self.shied_raised == True:
            self.shied_raised = False
        if self.shied_raised == False:
            self.protection /= 2
            self.set_power(self.get_power() * 2)


    def make_a_move(self, friends, enemies):
        target = random.choice(enemies)
        self.attack(target)
        if self.shied_raised == False:
            self.raise_shield()
        super().make_a_move(friends, enemies)

    def __str__(self):
        return f'{self.name} имеет {self.get_hp()} здоровья и {self.get_power()} силы.'

    # Танк:
    # Атрибуты:
    # - показатель защиты - изначально равен 1, может увеличиваться и уменьшаться
    # - поднят ли щит - танк может поднимать щит, этот атрибут должен показывать поднят ли щит в данный момент
    # Методы:
    # - атака - атакует, но т.к. доспехи очень тяжелые - наносит половину урона (self.__power)
    # - получение урона - весь входящий урон делится на показатель защиты (damage/self.defense) и только потом отнимается от здоровья
    # - поднять щит - если щит не поднят - поднимает щит. Это увеличивает показатель брони в 2 раза, но уменьшает показатель силы в 2 раза.
    # - опустить щит - если щит поднят - опускает щит. Это уменьшает показатель брони в 2 раза, но увеличивает показатель силы в 2 раза.
    # - выбор действия - получает на вход всех союзников и всех врагов и на основе своей стратегии выполняет ОДНО из действий (атака,
    # поднять щит/опустить щит) на выбранную им цель


class Attacker(Hero):

    def __init__(self, name):
        super().__init__(name)
        self.damage_factor = 0

    def attack(self, target):
        target.take_damage(self.get_power() * self.damage_factor)
        self.power_dawn()

    def take_damage(self, damage):
        self.set_hp(self.get_hp() - (damage * (self.damage_factor / 2)))
        super().take_damage(damage)

    def power_dawn(self):
        self.damage_factor /= 2

    def power_up(self):
        self.damage_factor *= 2

    def make_a_move(self, friends, enemies):
        target = random.choice(enemies)
        if self.damage_factor < 5:
            self.power_up()
        else:
            self.attack(target)
        super().make_a_move(friends, enemies)

    def __str__(self):
        return f'{self.name} имеет {self.get_hp()} здоровья и {self.get_power()} силы.'

    # Убийца:
    # Атрибуты:
    # - коэффициент усиления урона (входящего и исходящего)
    # Методы:
    # - атака - наносит урон равный показателю силы (self.__power) умноженному на коэффициент усиления урона (self.power_multiply)
    # после нанесения урона - вызывается метод ослабления power_down.
    # - получение урона - получает урон равный входящему урона умноженному на половину коэффициента усиления урона - damage * (
    # self.power_multiply / 2)
    # - усиление (power_up) - увеличивает коэффициента усиления урона в 2 раза
    # - ослабление (power_down) - уменьшает коэффициента усиления урона в 2 раза
    # - выбор действия - получает на вход всех союзников и всех врагов и на основе своей стратегии выполняет ОДНО из действий (атака,
    # усиление, ослабление) на выбранную им цель
import random


class Monster:
    max_hp = 150
    start_power = 10

    def __init__(self, name):
        self.name = name
        self.__hp = self.max_hp
        self.__power = self.start_power
        self.__is_alive = True

    def get_hp(self):
        return self.__hp

    def set_hp(self, new_value):
        self.__hp = max(new_value, 0)

    def get_power(self):
        return self.__power

    def set_power(self, new_power):
        self.__power = new_power

    def attack(self, target):
        pass

    def is_alive(self):
        return self.__is_alive

    def take_damage(self, damage):
        print("\t", self.name, "Получил удар с силой равной = ", round(damage), ". Осталось здоровья - ", round(self.get_hp()))
        if self.get_hp() <= 0:
            self.__is_alive = False

    def make_a_move(self, friends, enemies):
        pass

    def __str__(self):
        return 'Name: {0} | HP: {1}'.format(self.name, self.get_hp())


class MonsterBerserk(Monster):

    def __init__(self, name):
        super().__init__(name)
        self.madness = 1

    def attack(self, target):
        target.take_damage(self.get_power() * self.madness)
        self.madness += 0.1

    def take_damage(self, power):
        self.set_hp(self.get_hp() - power * (self.madness / 2))
        if self.get_hp() < 50:
            self.madness *= 2
        super().take_damage(power)

    def make_a_move(self, friends, enemies):
        print(self.name, end=' ')
        self.madness = min(self.madness, 4)
        if not enemies:
            return
        if self.madness < 3:
            print("Атакую того, кто стоит ближе -", enemies[0].name)
            self.attack(enemies[0])
        else:
            target = random.choice(enemies)
            print("BERSERK MODE!!! Уровень безумия - " + str(self.madness) + " Случайно атакую -", target.name)
            print()
            self.attack(target)
        print('\n')


class MonsterHunter(Monster):

    def __init__(self, name):
        super().__init__(name)
        self.potions = 10

    def attack(self, target):
        target.take_damage(self.get_power() + (10 - self.potions))

    def take_damage(self, power):
        self.set_hp(self.get_hp() - power)
        if random.randint(1, 10) == 1:
            self.potions -= 1
        super().take_damage(power)

    def give_a_potion(self, target):
        self.potions -= 1
        target.set_hp(target.get_hp() + self.get_power())

    def make_a_move(self, friends, enemies):
        print(self.name, end=' ')
        target_of_potion = friends[0]
        min_health = target_of_potion.get_hp()
        for friend in friends:
            if friend.get_hp() < min_health:
                target_of_potion = friend
                min_health = target_of_potion.get_hp()

        if min_health < 60 and self.potions > 0:
            print("Исцеляю", target_of_potion.name)
            self.give_a_potion(target_of_potion)
        else:
            if not enemies:
                return
            print("Атакую ближнего -", enemies[0].name)
            self.attack(enemies[0])
        print('\n')
import random
from monsters import MonsterBerserk, MonsterHunter
from heroes import Tank, Healer, Attacker


def one_year_of_war():
    # Ниже приведен пример составления команды
    # Вы можете изменять состав команды, НО размер команды не должен быть более 5.

    tank = Tank("Танк Пётр")
    attacker = Attacker("Убийца Ольга")
    #second_attacker = Attacker("Убийца Траур")
    newhealer = Healer('Феофан Мудрый')
    healer = Healer("Монах Игнат")
    second_healer = Healer("Монах Ирэна")
    good_team = [tank, attacker, newhealer, second_healer, healer]

    # Код ниже изменять нельзя!

    # Функция запускает симуляцию одного года сражений.
    # В цикле запускается 365 итераций (1 итерация = 1 день)
    # Каждый день каждый герой и монстр выбирают и совершают ОДНО действие.
    # Если монстры умирают - они пропадают из списка
    # Если умирают герои - цикл завершается - битва считается проигранной (возвращается 0)
    # Если герои выживают - битва считается выигранной (возвращается 1)
    if sum([isinstance(hero, (MonsterHunter, MonsterBerserk)) for hero in good_team]) > 1:
        print("В команде героев может быть только 1 монстр!")
        return 0

    evil_names = ["Абвыргл", "Мефисто", "Драник", "Диабло", "Пусечка", "Стаут"]
    mob_warrior = MonsterBerserk("Берсерк " + random.choice(evil_names))
    mob_ranger = MonsterHunter("Рейнджер " + random.choice(evil_names))
    evil_team = [mob_warrior, mob_ranger]

    for day in range(1, 366):
        print("=" * 50 + "\nНачало дня №" + str(day) + "\n" + "=" * 50)

        # В циклах у героев и монстров вызывается метод make_a_move, который должен выбирать и совершать одно действие
        # Для наглядности вы можете добавлять в каждое действие принты с подробностями (чтобы знать кто когда и что совершает)
        # При помощи этой информации вы сможете искать проблемы и ошибки в вашем коде и в конечном итоге это поможет вам улучшить стратегию
        print("\nКоманда добра:\n" + '-' * 50)
        for hero in good_team:
            hero.make_a_move(good_team, evil_team)

        print("\nКоманда зла:\n" + '-' * 50)
        for mob in evil_team:
            mob.make_a_move(evil_team, good_team)

        print(f"Итоги дня сражений №{day}")

        # В итогах дня у каждого героя и каждого монстра вызывается метод __str__ который должен описывать их текущее состояние
        print("\nКоманда добра:\n" + '-' * 50)
        for hero in good_team:
            print(hero)

        print("\nКоманда зла:\n" + '-' * 50)
        for mob in evil_team:
            print(mob)

        # Мёртвые монстры удаляются из списка
        evil_team = [mob for mob in evil_team if mob.is_alive()]
        # Новые монстры в чётные дни добавляются в список (но их не может быть больше 4)
        if day % 2 == 0 and len(evil_team) < 4:
            newborn_evils = [MonsterBerserk("Берсерк " + random.choice(evil_names)), MonsterHunter("Рейнджер " + random.choice(evil_names))]
            evil_team.append(random.choice(newborn_evils))

        if any([not hero.is_alive() for hero in good_team]):
            print("Вы проиграли!")
            return 0
        else:
            print("Сражение продолжается!")

    else:
        print("Вы одержали победу!")
        return 1


# Код ниже не подлежит изменению
# Он запускает 20 симуляций. Для зачёта по заданию вам надо стабильно набирать 10 или более побед.
count_of_wins = 0
for year in range(1, 21):
    count_of_wins += one_year_of_war()

print("Из 20 раз команда героев одержала", count_of_wins, "побед")
if count_of_wins < 10:
    print("Героям нужна другая тактика, попробуйте ещё!")
else:
    print("Герои готовы к реальному сражению, задание выполнено!")

Свой словарь

Что нужно сделать

В силу обстоятельств Васе постоянно приходится работать со словарями и их данными. В том числе и с методом get, который по умолчанию возвращает None, если такого ключа в словаре нет. Однако Васю это не устраивает: для нормальной работы ему нужно возвращать число 0.

Реализуйте класс MyDict, который будет вести себя точно так же, как и обычный словарь, за исключением того, что метод get по умолчанию будет возвращать не None, а число 0.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • Сообщения о процессе получения результата осмыслены и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не a, b, c, d.
  • Классы и методы/функции имеют прописанную документацию.
class MyDict(dict):

    def get(self, key, default=None):
        return super().get(key, 0)


mydict = MyDict()

a = MyDict()
a['1'] = 1

print(a)
print(a.get('1'))

Карма

Что нужно сделать

Один буддист-программист решил создать свой симулятор жизни, в котором нужно набрать 500 очков кармы (это константа), чтобы достичь просветления.

Каждый день вызывается специальная функция one_day(), которая возвращает количество кармы от 1 до 7 и может с вероятностью 1 к 10 выкинуть одно из исключений:

  • KillError;
  • DrunkError;
  • CarCrashError;
  • GluttonyError;
  • DepressionError.

Напишите такую программу. Функцию оберните в бесконечный цикл, выход из которого возможен только при накоплении кармы до уровня константы. Исключения обработайте и запишите в отдельный лог karma.log.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
    • Для создания нового класса на основе уже существующего используется наследование.
  • Сообщения о процессе получения результата осмыслены и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не a, b, c, d.
  • Классы и методы/функции имеют прописанную документацию.
  • Названия используемых файлов соответствуют тем, которые написаны в задаче.
from random import randint, choice

class Karma:
    def __init__(self):
        self.__karma_points = 0
        self.__days_count = 0

    def one_day(self, value):
        self.set_day()
        try:
            if value == 10:
                exepts_tuple = ('KillError', 'DrunkEror', 'CarCrashError', 'GluttonyError', 'DepressionError')
                raise Exception(choice(exepts_tuple))
            else:
                point = randint(1, 7)
                self.set_karma_point(point)
        except Exception as exc:
            with open('karma.log', 'a', encoding='UTF-8') as file:
                file.writelines(f'\nДень {self.get_day()}, ошибка: {exc}')

    def set_karma_point(self, point):
        self.__karma_points += point

    def get_karma(self):
        return self.__karma_points

    def get_day(self):
        return self.__days_count

    def set_day(self):
        self.__days_count += 1

    def toconstant(self):
        while True:
            finish = self.get_karma()
            if finish >= 500:
                print(f'День {self.get_day()}, набрано {finish} очков кармы.')
                break
            else:
                value = randint(1, 10)
                self.one_day(value)

gokarma = Karma()
gokarma.toconstant()

Налоги

Что нужно сделать

Реализуйте иерархию классов, описывающих имущество налогоплательщиков. Она должна состоять из базового класса Property и производных от него классов Apartment, Car и CountryHouse.

Базовый класс должен иметь атрибут worth (стоимость), который передаётся в конструктор, и метод расчёта налога, переопределённый в каждом из производных классов. Налог на квартиру вычисляется как 1/1000 её стоимости, на машину — 1/200, на дачу — 1/500.

Каждый дочерний класс должен иметь конструктор с одним параметром, передающий свой параметр конструктору базового класса.

Разработайте интерфейс программы. Пусть она запрашивает у пользователя количество его денег и стоимость имущества, а затем выдаёт налог на соответствующее имущество и показывает, сколько денег ему не хватает (если это так). Хамелеоны маскируются, меняя цвет.

Что оценивается

  • Результат вычислений корректен.
  • input содержит корректные приглашения для ввода.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
    • Для создания нового класса на основе уже существующего используется наследование.
  • Сообщения о процессе получения результата осмыслены и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не a, b, c, d.
  • Классы и методы/функции имеют прописанную документацию.
from random import randint

class Unit:
    def __init__(self, name):
        self.name = name
        self.health = 100
        self.__power = 20
        self.__dead = False

    def __str__(self):
        return f'Юнит {self.name} имеет {self.health} HP.'


    def damage(self, obj):
        print(f'\n{self.name} нанес урон {obj.name}.')
        obj.health -= self.get_power()
        print(obj.__str__())
        obj.set_dead()

    def get_power(self):
        return self.__power

    def set_dead(self):
        if self.health <= 0:
            self.__dead = True

    def get_dead(self):
        return self.__dead

class Game:
    def __init__(self):
        self.__count = 0
        self.war1 = Unit('Викинг')
        self.war2 = Unit('Крестьянин')

    def battle(self):
        while True:
            if self.get_count() == 0:
                self.present()
                self.set_count()
            hit = randint(1, 2)
            if hit == 1:
                self.war1.damage(self.war2)
                if self.war2.get_dead() == True:
                    self.finish(self.war1)
                    break
            else:
                self.war2.damage(self.war1)
                if self.war1.get_dead() == True:
                    self.finish(self.war2)
                    break

    def present(self):
        print('\t\t\tДа начнется великая битва!')

    def set_count(self):
        self.__count += 1

    def get_count(self):
        return self.__count

    def finish(self, obj):
        print(f'Победил {obj.name}. Славная победа!')

game = Game()
game.battle()

Крестики-нолики

Что нужно сделать

Напишите программу, которая реализует игру «Крестики-нолики». Да, это всё условие задачи.

Ваши классы в этой задаче могут выглядеть так:

class Cell:
    #  Клетка, у которой есть значения
    #   - занята она или нет
    #   - номер клетки
    pass

class Board:
    #  Класс поля, который создаёт у себя экземпляры клетки
    pass

class Player:
    #  У игрока может быть
    #   - имя
    #   - на какую клетку ходит
    pass

class Game:    
    # класс «Игры» содержит атрибуты:
    # состояние игры,
    # игроки,
    # поле.
    # А также методы:
    # Метод запуска одного хода игры. Получает одного из игроков, запрашивает у игрока номер клетки, изменяет поле, проверяет, выиграл ли игрок. Если игрок победил, возвращает True, иначе False.
    # Метод запуска одной игры. Очищает поле, запускает цикл с игрой, который завершается победой одного из игроков или ничьей. Если игра завершена, метод возвращает True, иначе False.
    # Основной метод запуска игр. В цикле запускает игры, запрашивая после каждой игры, хотят ли игроки продолжать играть. После каждой игры выводится текущий счёт игроков.
    pass

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • Сообщения о процессе получения результата осмысленны и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, не a, b, c, d.
class Cell:
    title = 'Клетка'
    def __init__(self, index, busy=False):
        self.index = index
        self.busy = busy

class Player:
    title = 'Игрок'
    __num_player = 0
    def __init__(self):
        Player.__num_player += 1
        if Player.__num_player < 2:
            self.index = 'X'
        else:
            self.index = 'O'

class Board:
    title = 'Доска'
    cell1 = Cell('1')
    cell2 = Cell('2')
    cell3 = Cell('3')
    cell4 = Cell('4')
    cell5 = Cell('5')
    cell6 = Cell('6')
    cell7 = Cell('7')
    cell8 = Cell('8')
    cell9 = Cell('9')
    cellset = (cell1, cell2, cell3, cell4, cell5, cell6, cell7, cell8, cell9)

class Game:
    title = 'Игра'

    count = 0
    p1 = Player()
    p2 = Player()
    board1 = Board()

    winline1 = (Board.cellset[0], Board.cellset[1], Board.cellset[2])
    winline2 = (Board.cellset[3], Board.cellset[4], Board.cellset[5])
    winline3 = (Board.cellset[6], Board.cellset[7], Board.cellset[8])
    winline4 = (Board.cellset[0], Board.cellset[4], Board.cellset[8])
    winline5 = (Board.cellset[2], Board.cellset[4], Board.cellset[6])
    winline6 = (Board.cellset[0], Board.cellset[3], Board.cellset[6])
    winline7 = (Board.cellset[1], Board.cellset[4], Board.cellset[7])
    winline8 = (Board.cellset[2], Board.cellset[5], Board.cellset[8])
    winset = (winline1, winline2, winline3, winline4, winline5, winline6, winline7, winline8)

    def finish(self, winset):
        buscount = 0
        for set in winset:
            if set[0].busy == True and set[1].busy == True and set[2].busy == True:
                if set[0].index == set[1].index and set[0].index == set[2].index:
                    print(f'Победа игрока {set[0].index}!')
                    return True
        for i in Board.cellset:
            if i.busy == True:
                buscount += 1
                if buscount == 9:
                    print(f'Ничья!')
                    return True

    def start(self):
        self.fin = False
        while True:
            self.fin = self.finish(self.winset)
            if self.fin == True:
                break
            print(f'Игрок {self.p1.index}, ', end='')
            move_p1 = int(input('введите индекс клетки для хода: '))
            if Board.cellset[move_p1 - 1].busy == False:
                Board.cellset[move_p1 - 1].index = self.p1.index
                Board.cellset[move_p1 - 1].busy = True
                self.gameinfo()
            else:
                print('Пропуск хода...')

            self.fin = self.finish(self.winset)
            if self.fin == True:
                break
            print(f'Игрок {self.p2.index}, ', end='')
            move_p2 = int(input('введите индекс клетки для хода: '))
            if Board.cellset[move_p2 - 1].busy == False:
                Board.cellset[move_p2 - 1].index = self.p2.index
                Board.cellset[move_p2 - 1].busy = True
                self.gameinfo()
            else:
                print('Пропуск хода...')

    def gameinfo(self):
        self.count += 1
        if self.count == 1:
            print('\tДобро пожаловать в игру "крестики-нолики"!')
        print(f'''
\t\t\t\t[{Board.cellset[0].index}] [{Board.cellset[1].index}] [{Board.cellset[2].index}]
\t\t\t\t[{Board.cellset[3].index}] [{Board.cellset[4].index}] [{Board.cellset[5].index}]
\t\t\t\t[{Board.cellset[6].index}] [{Board.cellset[7].index}] [{Board.cellset[8].index}]''')

game = Game()
game.gameinfo()
game.start()

Совместное проживание

Что нужно сделать

Чтобы понять, стоит ли ему жить с кем-то или всё же лучше остаться в гордом одиночестве, Артём решил провести довольно необычное исследование. Для этого он реализовал модель человека и модель дома.

Человек может:

  1. Есть (+ сытость, − еда).
  2. Работать (− сытость, + деньги).
  3. Играть (− сытость).
  4. Ходить в магазин за едой (+ еда, − деньги).

У человека есть имя, степень сытости (изначально 50) и дом.

В доме есть холодильник с едой (изначально 50 еды) и тумбочка с деньгами (изначально 0 денег).

Если сытость человека становится меньше нуля, то человек умирает.

Логика действий человека определяется следующим образом:

  1. Генерируется число кубика от 1 до 6.
  2. Если сытость < 20, то поесть.
  3. Иначе, если еды в доме < 10, то сходить в магазин.
  4. Иначе, если денег в доме < 50, то работать.
  5. Иначе, если кубик равен 1, то работать.
  6. Иначе, если кубик равен 2, то поесть.
  7. Иначе играть.

По такой логике эксперимента человеку надо прожить 365 дней.

Реализуйте такую программу и создайте двух людей, живущих в одном доме. Проверьте работу программы несколько раз.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • Сообщения о процессе получения результата осмысленны и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, не a, b, c, d.
from random import randint

class Homo:
    def __init__(self, name, home, hungry=50):
        self.name = name
        self.hungry = hungry
        self.home = home

    def eating(self):
        if self.home.food > 0:
            self.home.food -= 1
            self.hungry += 1

    def shoping(self):
        if self.home.money > 0:
            self.home.money -= 1
            self.home.food += 1
        else:
            self.working()

    def working(self):
        self.home.money += 1
        self.hungry -= 1

    def gaming(self):
        self.hungry -= 1

    def die(self):
        if self.hungry < 0:
            return True

    def action(self):
        act = randint(1, 6)
        if self.hungry < 20:
            self.eating()
        elif self.home.food < 10:
            self.shoping()
        elif self.home.money < 50:
            self.working()
        elif act == 1:
            self.working()
        elif act == 2:
            self.eating()
        elif act in (3, 4, 5, 6):
            self.gaming()

    def info(self):
        print(f'{self.name} голод: {self.hungry}')

class Home:
    def __init__(self, food=50, money=0):
        self.food = food
        self.money = money

    def info(self):
        print(f'Запасы в доме: еда({self.food}), деньги({self.money})')

def sim(p1, p2):
    day = 0
    while day != 365:
        if p1.die() is not True and p2.die() is not True:
            day += 1
            p1.action()
            p2.action()
        else:
            print(f'Один из персонажей умер')
            break
    print(f'Персонажи прожили {day} дней.\n')

sweet_home = Home()
person_1 = Homo('Bob', sweet_home)
person_2 = Homo('Alexa', sweet_home)

sim(person_1, person_2)
sweet_home.info()
person_1.info()
person_2.info()

Магия

Что нужно сделать

Для одной игры необходимо реализовать механику магии, где при соединении двух элементов получается новый. У нас есть четыре базовых элемента: «Вода», «Воздух», «Огонь», «Земля». Из них как раз и получаются новые: «Шторм», «Пар», «Грязь», «Молния», «Пыль», «Лава».

Вот таблица преобразований:

  • Вода + Воздух = Шторм
  • Вода + Огонь = Пар
  • Вода + Земля = Грязь
  • Воздух + Огонь = Молния
  • Воздух + Земля = Пыль
  • Огонь + Земля = Лава

Напишите программу, которая реализует все эти элементы. Каждый элемент необходимо организовать как отдельный класс. Если результат не определён, то возвращается None.

Примечание: сложение объектов можно реализовывать через магический метод __add__, вот пример использования:

class Example_1:
    def __add__(self, other):
        return Example_2()

class Example_2:
    answer = 'сложили два класса и вывели'

a = Example_1()
b = Example_2()
c = a + b
print(c.answer)

Дополнительно: придумайте свой элемент (или элементы), а также реализуйте его взаимодействие с остальными элементами.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • Переменные, функции и собственные методы классов имеют значащие имена, не a, b, c, d.
class Water:
    title = '*>Вода<*'
    def __add__(self, other):
        if isinstance(other, Ground):
            return Dirt()
        elif isinstance(other, Fire):
            return Steam()
        elif isinstance(other, Air):
            return Storm()
        else:
            return None

class Ground:
    title = '-=Земля=-'
    def __add__(self, other):
        if isinstance(other, Water):
            return Dirt()
        elif isinstance(other, Air):
            return Dust()
        elif isinstance(other, Fire):
            return Lava()
        else:
            return None

class Fire:
    title = '\Огонь/'
    def __add__(self, other):
        if isinstance(other, Ground):
            return Lava()
        elif isinstance(other, Air):
            return Lightning()
        elif isinstance(other, Water):
            return Steam()
        else:
            return None

class Air:
    title = '~Воздух~'
    def __add__(self, other):
        if isinstance(other, Fire):
            return Lightning()
        elif isinstance(other, Ground):
            return Dust()
        elif isinstance(other, Water):
            return Storm()
        else:
            return None

class Dirt:
    title = '|Грязь|'

class Storm:
    title = '>>>Шторм<<<'

class Steam:
    title = '}Пар{'

class Lightning:
    title = 'z-Молния-z'

class Dust:
    title = '.:Пыль:.'

class Lava:
    title = '^Лава^'

fire = Fire()
air = Air()
magic = air + fire

print(f'''Смешиваем {fire.title} и {air.title}:
И получаем {magic.title}.''')

Отцы, матери и дети

Что нужно сделать

Реализуйте два класса: «Родитель» и «Ребёнок». У родителя есть:

  1. Имя.
  2. Возраст.
  3. Список детей.

И он может:

  1. Сообщить информацию о себе.
  2. Успокоить ребёнка.
  3. Покормить ребёнка.

У ребёнка есть:

  1. Имя.
  2. Возраст (должен быть меньше возраста родителя хотя бы на 16 лет).
  3. Состояние спокойствия.
  4. Состояние голода.

Реализация состояний на ваше усмотрение. Это может быть и простой «флаг», и словарь состояний, и что-нибудь ещё интереснее.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • Переменные, функции и собственные методы классов имеют значащие имена, не a, b, c, d.
class Parent:
    def __init__(self, name, age, child_list):
        self.name = name
        self.age = age
        self.child_list = child_list

    def info(self):
        print(f'''\nИмя: {self.name}
Возраст: {self.age}
Список детей: {[child.name for child in self.child_list]}''')

    def feeding(self, children):
        children.hunger += 1
    def lull(self, children):
        children.mood = True


class Children:
    def __init__(self, name, age, mood=False, hunger=0):
        self.name = name
        self.age = age
        self.mood = mood
        self.hunger = hunger

    def info(self):
        if self.mood == False:
            moodnow = 'Неспокоен'
        else:
            moodnow = 'Спокоен'
        if self.hunger < 3:
            hungernow = 'Голоден'
        else:
            hungernow = 'Сыт'
        print(f'''\nРебенок: {self.name}
Возраст: {self.age}
Состояние: {moodnow}
Сытость: {hungernow}''')

def interaction(parent, child_list):
    while True:
        print('\nСостояние детей:')
        for i in child_list:
            i.info()

        action = int(input(f'''\n1- Покормить {child_list[0].name}
2- покормить {child_list[1].name}
11- успокоить {child_list[0].name}
22- успокоить {child_list[1].name}
9 - информация о родителе
0 - выйти 
Введите нужное значение: '''))

        if action == 1:
            parent.feeding(child_list[0])
        if action == 11:
            parent.lull(child_list[0])
        if action == 2:
            parent.feeding(child_list[1])
        if action == 22:
            parent.lull(child_list[1])
        if action == 9:
            parent.info()
        if action == 0:
            print('\nПрограмма завершена.')
            break

chlist = [Children('Bob', 1), Children('Coralina', 8)]
mother = Parent('Luba', 28, chlist)

interaction(mother, chlist)