Задачи
Задача 1
В игре Minecraft все игровые объекты делятся на три типа: блоки, сущности и предметы. Блоки – это «кирпичики», из которых состоит весь игровой мир. Сущности – это все динамические и движущиеся игровые объекты. Предметы – это все остальные объекты. Реализуйте иерархию классов для игры Minecraft:
BaseObject– базовый класс для всех объектов. Интерфейс этого класса состоит из двух методов:__init__(x, y, z)– конструктор класса, который принимает на вход 3 числа (координаты объекта в игровом мире)get_coordinates()– метод, возвращающий список координатx,y,z(именно в таком порядке)
Block– класс, наследующийся отBaseObject. У этого класса есть дополнительный методshatter(), который ничего не принимает на вход и ничего не возвращает. При вызове этого метода все три координаты объектаBlockдолжны стать равныNone.Entity– класс, наследующийся отBaseObject. У этого класса есть дополнительный методmove(x, y, z), который принимает на вход 3 числа (новые координаты объекта) и ничего не возвращает. При вызове этого метода координаты объекта должны стать равныx,y,zсоответственно.Thing– класс, наследующийся отBaseObject. У этого класса нет дополнительных методов.
Задача 2
Рассмотрим следующую упрощенную классификацию живых существ:
Живые существа делятся на бесклеточных (к ним относятся вирусы) и клеточных.
Клеточные в свою очередь делятся на прокариотов (их клетки не содержат ядер; к прокариотам относятся бактерии) и эукариотов (их клетки имеют ядра).
Эукариоты – одноклеточные, грибы, растения и животные. Постройте иерархию классов для данной классификации. Для именования классов используйте латинские названия:
Бесклеточные:
AcellulariaКлеточные:
CellulariaПрокариоты:
ProkaryotaЭукариоты:
EukaryotaОдноклеточные:
UnicellulariaГрибы:
FungiРастения:
PlantaeЖивотные:
Animalia
Задача 3
Разобьём пользователей интернет-обучения на три группы: администраторы, преподаватели и ученики. Все пользователи могут решать задачи. Также администраторы могут редактировать задачи, а преподаватели могут проверять решения учеников. Также среди администраторов есть особенные «супер-администраторы», которые могут сделать администратором любого пользователя портала. Реализуйте следующую иерархию классов:
User– базовый класс с методомsolve(n), гдеn– целое число (идентификатор задачи).Student– класс, наследующийся отUser.Teacher– класс, наследующийся отUserи имеющий дополнительный методcheck_solution(user, n), гдеuser– объект типаUser, аn– целое число (идентификатор задачи).Admin– класс, наследующийся отUserи имеющий дополнительный методedit(n), гдеn– целое число (идентификатор задачи).SuperAdmin– класс, наследующийся отAdminи имеющий дополнительный методgrant(user), гдеuser– объект типаUser.
Сами методы solve, check_solution, edit и grant реализовывать не нужно. То есть, например, для метода solve достаточно написать
Задача 4
В социальной сети есть два вида пользователей: люди и сообщества. Все пользователи должны указывать свое имя. Люди могут также указывать свою дату рождения, а сообщества – своё краткое описание. Все пользователи (и люди, и сообщества) могут отправлять сообщения друг другу, а также выкладывать посты на своей стене. Люди могут подписываться на других людей и на сообщества. Реализуйте иерархию классов в соответствии с этим описанием.
User– базовый класс. Его конструктор должен принимать один аргумент – имя. Также этот класс должен предоставлять методыsend_message(user, message)– отправить сообщение message пользователюuserpost(message)– отправить сообщениеmessageсебе на стенуinfo()– вернуть строку с дополнительной информацией о пользователе. Для классаUserэто пустая строка, методinfo()будет переопределяться в производных классахdescribe()– напечатать имя пользователя и дополнительную информацию о нем (т.е. результат работы методаinfo())
Person– производный от классаUser. Его конструктор должен принимать на вход два аргумента – имя и дату рождения. Методinfo()классаPersonдолжен возвращать строку вида « Дата рождения: ...» Также уPersonдолжен быть реализован дополнительный методsubscribe(user), гдеuser– объект классаUser.Community– производный от классаUser. Его конструктор должен принимать на вход два аргумента – имя и краткое описание. Методinfo()классаCommunityдолжен возвращать строку вида « Описание: ...»
Задача 5
Все животные обладают некоторыми общими свойствами; в частности, они дышат кислородом и чем-то питаются. К животным относятся рыбы, которые умеют плавать, и птицы, которые откладывают яйца. Большинство птиц (но не все!) также умеют летать. Реализуйте следующую иерархию классов:
Animal– базовый класс с методамиbreathe()иeat()Fish– наследник классаAnimalс дополнительным методомswim()Bird– наследник классаAnimalс дополнительным методомlay_eggs()FlyingBird– наследник классаBirdс дополнительным методомfly()Сами методыbreathe,eat,swim,lay_eggsиflyреализовывать не нужно. То есть, например, для методаbreatheдостаточно написать
Задача 6
Реализуйте иерархию транспортных средств. За основу можно взять такую:
Водный транспорт.
Воздушный транспорт. Можно поделить на авиацию (самолёты) и воздухоплавание (дирижабли и воздушные шары).
Наземный транспорт. Делится на железнодорожный, автомобильный, велосипедный и движимый животными.
Космический транспорт 😊
Постарайтесь реализовать иерархию максимально подробно, дополните предложенный вариант своими классами. Имена классов выберите самостоятельно.
Задача 7
С помощью наследования постройте иерархию геометрических фигур, состоящую из следующих классов:
Shape(Фигура)Polygon(Многоугольник)Triangle(Треугольник)IsoscelesTriangle(Равнобедренный треугольник)EquilateralTriangle(Равносторонний треугольник)Quadrilateral(Четырехугольник)Parallelogram(Параллелограмм)Rectangle(Прямоугольник)Square(Квадрат) Иерархия должна быть построена в соответствии со следующим условием: классBдолжен наследоваться от классаA, еслиBявляется частным случаемA. Сами классы реализовывать не нужно.
Задача 8
Реализуйте несколько классов, вычисляющих суммы следующих последовательностей натуральных чисел от 1 до N:
Сделайте это с помощью наследования. Базовым классом будет Summator, который реализует методы transform(n) и sum(N).
Метод
transform(n)выполняет преобразование элемента последовательности. Для классаSummatorэто будет тождественное преобразование, т.е.transform(n) == n. Методtransform(n)будет переопределяться в производных классах.Метод
sum(N)должен вычислять сумму значенийtransform(n)для всех значенийnот 1 до N. Производные классы должны переопределять методtransform(n):SquareSummator:transform(n) == n ** 2CubeSummator:transform(n) == n ** 3Методsum(N)переопределять не нужно.
Задача 9
На сайте поиска вакансий есть два типа объектов: вакансии и резюме. Каждый такой объект имеет название профессии (в вакансии – предлагаемая профессия, в резюме – желаемая профессия). Также в вакансиях указывается название компании и предлагаемая зарплата, а в резюме – стаж работы. Реализуйте иерархию классов для такого сайта.
Profile– базовый класс. Его конструктор должен принимать один аргумент – название профессии. Также этот класс должен представлять методыinfo(), который должен возвращать строку с дополнительной информацией. Для классаProfileэта строка должна быть пустой, в производных классах этот метод будет переопределяться.describe(), который печатает название и дополнительную информацию (т.е. результат работы методаinfo())
Vacancy– наследник классаProfile. Его конструктор должен принимать два аргумента – название профессии и предлагаемую зарплату. При написании конструктора используйте конструктор базового класса.Метод info()классаVacancyдолжен возвращать строку вида «Предлагаемая зарплата: ...»Resume– наследник классаProfile. Его конструктор должен принимать два аргумента – название профессии и стаж работы. При написании конструктора используйте конструктор базового класса. Методinfo()классаResumeдолжен возвращать строку вида «Стаж работы: ...»
Задача 10
Создайте класс Triangle, представляющий треугольник. Конструктор этого класса должен принимать на вход 3 числа (длины сторон треугольника). Также у этого класса должен быть метод perimeter(), возвращающий периметр. Отнаследуйте от класса Triangle класс EquilateralTriangle, представляющий равносторонний треугольник. Переопределите конструктор этого класса с использованием конструктора базового класса. Конструктор класса EquilateralTriangle должен принимать на вход 1 число (длину стороны).
Задача 11
Реализуйте класс PowerSummator, вычисляющий сумму последовательности натуральных чисел от 1 до N:
где b – произвольное вещественное число. Как и в задаче 8, класс PowerSummator должен наследоваться от класса Summator. Напомним, что класс Summator должен иметь методы transform(n) и sum(N).
Метод
transform(n)выполняет преобразование элемента последовательности. Для классаSummatorэто будет тождественное преобразование, т.е.transform(n) == n. Методtransform(n)должен быть переопределен в классеPowerSummator.Метод
sum(N)должен вычислять сумму значенийtransform(n)для всех значений n от 1 до N. Помимо методаtransform, для классаPowerSummatorтакже нужно переопределить конструктор. Конструктор классаPowerSummatorдолжен принимать один параметр – степеньb, в которую нужно возводить элементы последовательности. Также отнаследуйте от классаPowerSummatorклассыSquareSummatorиCubeSummator, которые (как и в классной задаче 8) должны вычислять суммы квадратов и кубов соответственно. Конструкторы классовSquareSummatorиCubeSummatorне должны принимать аргументов. В классахSquareSummatorиCubeSummatorдолжен быть переопределён только конструктор; переопределять другие методы нельзя.
Задача 12
Создайте класс A, в котором определены:
метод приведения к строке, возвращающий
A.__str__ methodметод
hello(), выводящий на экран строкуHelloСоздайте классB, в котором определены:метод приведения к строке, возвращающий
B.__str__ methodметод
good_evening(), выводящий на экран строкуGood eveningСоздайте классC, унаследованный отAиB, который при приведении к строке использует метод классаA(сам классCне должен содержать методов__str__или__repr__). Создайте классD, унаследованный отAиB, который при приведении к строке использует метод классаB(сам классDне должен содержать методов__str__или__repr__).
Пример 1
Ввод
Вывод
Пример 2
Ввод
Вывод
Задача 13
При разработке компьтерных игр зачастую создаётся очень сложная система классов. В этой задаче Вам будет необходимо сделать небольшую заготовку, которую потом можно будет использовать для создания своей игры.
Реализуйте класс Weapon для оружия, который при инициализации должен принимать:
имя оружия
nameнаносимый урон
damageрадиус, на котором оружие может достать до врага –
range.
В классе Weapon должны быть реализованы следующие методы:
hit(actor, target)– удар персонажемactorперсонажаtarget. Метод должен проверять, жив ли персонажtarget, если нет, то выводить сообщение «Враг уже повержен», иначе должна проводится проверка расстояния отactorдоtarget. Если расстояние большеrangeоружия, тогда надо выводить сообщение «Враг слишком далеко для оружияname». В случае, еслиtargetжив и оружие имеет достаточныйrange, вывести сообщение «Врагу нанесен урон оружиемnameв размереdamage» и нанести уронtarget.приведение к строке – при приведении к строке должно возвращаться имя оружия.
Реализуйте класс BaseCharacter для создания базовых персонажей, который при инициализации должен принимать pos_x и pos_y – позицию персонажа в мире, hp – количество жизней персонажа. Класс BaseCharacter должен реализовывать методы:
move(delta_x, delta_y)– для перемещения персонажа наdelta_xиdelta_yв игровом мире.is_alive()– проверка, жив ли персонаж. ВозвращаетTrue, если жив, иначе –False.get_damage(amount)– убавляет количество жизней персонажа наamount. При достижении0или отрицательного значения персонаж считается мёртвым.get_coords()– возвращает кортеж с текущими координатами персонажа.
Реализуйте класс BaseEnemy для создания противников, который расширяет класс BaseCharacter. При инициализации он должен принимать pos_x и pos_y – позицию персонажа в мире, weapon – оружие, hp – количество жизней персонажа. Класс должен использовать инициализатор BaseCharacter. Класс BaseEnemy должен реализовывать следующие методы:
hit(target)– для удара персонажаtarget. Метод должен позволять ударить только персонажа классаMainHero. Для всех других классов должно печататься сообщение «Могу ударить только Главного героя».приведение к строке – при приведении к строке должно возвращаться «Враг на позиции (
pos_x,pos_y) с оружиемweapon»
Реализуйте класс MainHero для создания главного героя, который расширяет класс BaseCharacter. При инициализации он должен принимать pos_x и pos_y – позицию персонажа в мире, name – имя персонажа, hp – количество жизней персонажа. Класс должен использовать инициализатор BaseCharacter. Класс MainHero должен реализовывать следующие методы:
hit(target)– для удара персонажаtarget. Метод должен проверять, есть ли у персонажа оружие, если его нет выводить - «Я безоружен», иначе позволять ударить только персонажа классаBaseEnemy. Для всех других классов должно печататься сообщение «Могу ударить только Врага».add_weapon(weapon)– добавляет оружие в инвентарь персонажа, если это оружие единственное, то оно должно экипироваться сразу же. Метод должен печатать: «Подобралweapon». Метод должен работать только для переданных объектов классаWeapon, для всего остального он должен печатать сообщение «Это не оружие».next_weapon()– для смены оружия. Если оружия нет, то должно выводиться «Я безоружен», если есть только одно оружие – «У меня только одно оружие», иначе должна производиться смена оружия на следующее (в порядке подбора, по кругу) и выводиться сообщение «Сменил оружие наweapon».heal(amount)– для повышения количества жизней персонажа наamount. При этом максимальный уровень здоровья главного героя –200. Также должно выводиться сообщение «Полечился, теперь здоровьяhp».
Пример 1
Ввод
Вывод