Top.Mail.Ru
Ответы
Аватар пользователя
7 месяцев назад
от

Помогите решить задачу по Python

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

Вася уже написал код, описывающий монстров (файл monsters.py), этот код изменять нельзя.

В файле heroes.py вы найдёте заготовки системы классов:

базовый класс hero, который нельзя изменять;
наследники класса tank/healer/attacker — их надо изменять.
Помимо этого, в main.py есть код, который:

запускает один год сражений — изменять нельзя;
создаёт команду для сражения с монстрами — изменять можно, но с условиями;
запускает 20 раз один год сражений и подсчитывает количество побед — изменять нельзя.
Ваша задача:

Дописать код в классы tank/healer/attacker в файле heroes.py.
Сформировать команду в main.py.
Проверить, что с выбранной вами стратегией герои побеждают монстров как минимум в половине случаев (>= 10 побед из 20).
Цель: из 20 сражений нужно побеждать как минимум в 10. В сражениях много случайностей, поэтому убедитесь, что в нескольких разных запусках ваша команда набирает нужное количество очков.

Советы и рекомендации
Внимательно изучите код поведения монстров. Изменять его нельзя, но изучать не запрещено.
При помощи команды print выводите информацию о том, кто и что делает каждый день. Особое внимание уделите информации, которая идёт в последние дни перед поражением героев.
На основе полученной информации попробуйте изменять приоритеты действий. Обратите внимание, что вы можете не только выбирать действие для выполнения, но также выбрать цель для действия. Иногда может быть выгоднее атаковать монстров конкретного класса, чтобы уменьшить урон по вашей команде.
Что оценивается
Как минимум в трёх запусках из пяти команда героев побеждает 10+ раз.
Модели реализованы в стиле ООП, основной функционал описан в методах классов и отдельных функциях.
Модели реализованы согласно инструкциям.
При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
Для создания нового класса на основе уже существующего используется наследование.
Сообщения о процессе получения результата осмысленны и понятны пользователю.
Переменные, функции и собственные методы классов имеют значащие имена, а не a, b, c, d.
Классы и методы/функции имеют прописанную документацию.
https://cloud.mail.ru/public/TN9j/Kq8Kd9LU4 файлы здесь

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Мудрец
7мес

Пример реализации класса Tank

1234567891011121314151617181920
 class Tank(Hero): 
    """Класс танка, который принимает на себя урон и защищает других героев.""" 
     
    def __init__(self, name): 
        super().__init__(name) 
        self.health = 150  # Здоровье танка 
        self.defense = 10   # Защита танка 
 
    def take_damage(self, damage): 
        damage_taken = max(0, damage - self.defense) 
        self.health -= damage_taken 
        print(f"{self.name} принимает {damage_taken} урона. Осталось здоровья: {self.health}") 
 
    def attack(self, target): 
        damage = 20  # Урон от атаки 
        print(f"{self.name} атакует {target.name} и наносит {damage} урона.") 
        target.take_damage(damage) 
 
    def defend(self): 
        print(f"{self.name} готовится к защите!") 

Пример реализации класса Healer

12345678910111213141516
 class Healer(Hero): 
    """Класс целителя, который восстанавливает здоровье союзников.""" 
     
    def __init__(self, name): 
        super().__init__(name) 
        self.health = 100  # Здоровье целителя 
 
    def heal(self, target): 
        healing_amount = 30  # Количество восстанавливаемого здоровья 
        target.health += healing_amount 
        print(f"{self.name} исцеляет {target.name} на {healing_amount}. Здоровье {target.name}: {target.health}") 
 
    def attack(self, target): 
        damage = 10  # Урон от атаки целителя 
        print(f"{self.name} атакует {target.name} и наносит {damage} урона.") 
        target.take_damage(damage) 

Пример реализации класса Attacker

1234567891011
 class Attacker(Hero): 
    """Класс атакующего, который наносит большой урон.""" 
     
    def __init__(self, name): 
        super().__init__(name) 
        self.health = 120  # Здоровье атакующего 
 
    def attack(self, target): 
        damage = 40  # Урон от атаки 
        print(f"{self.name} атакует {target.name} и наносит {damage} урона.") 
        target.take_damage(damage) 

Шаг 2: Формирование команды в main.py
Теперь давайте создадим команду в main.py. Предположим, что вы можете создать команду из одного танка, одного целителя и двух атакующих.

123456789101112131415161718192021
 from heroes import Tank, Healer, Attacker 
 
def create_team(): 
    """Создание команды из героев.""" 
    tank = Tank("Танк") 
    healer = Healer("Целитель") 
    attacker1 = Attacker("Атакующий 1") 
    attacker2 = Attacker("Атакующий 2") 
     
    return [tank, healer, attacker1, attacker2] 
 
# Основной код для запуска игры 
if __name__ == "__main__": 
    victories = 0 
    for _ in range(20):  # Запускаем 20 сражений 
        team = create_team() 
         
        # Логика сражений здесь (неизменяемая часть кода) 
         
        if victories >= 10: 
            print("Команда победила!")