Задачи
Задача 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 пользователюuser
post(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 ** 2
CubeSummator
: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
Ввод
Вывод