2.52M
Category: programmingprogramming

Объектно-ориентированное программирование. Наследование Ссылка на методичку. Модуль 5. Урок 6

1.

Модуль 5. Урок 6.
Объектно-ориентированное
программирование. Наследование
Ссылка на методичку

2.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
Обсуждение:
Игра «Hit It!»

3.

Завершаем игру «Hit It!»
В заключительный день тренинга по созданию собственных объектов мы
завершаем игру «Hit It!».
Цель игры — обойти препятствия и поймать целевой объект.
Обсуждение
рабочих задач
Ожидаемый вид игры:
Алёна,
менеджер проектов

4.

Техническое задание
Цель игры — обойти препятствия и поймать целевой объект.
Требования к игре:
1. Основной объект управляется пользователем с клавиатуры.
3. Условие победы: игрок касается целевого объекта.
Тогда исчезают препятствия.
Условие поражения: игрок касается любого препятствия.
Тогда исчезает целевой объект.
Обсуждение
рабочих задач
2. Не менее двух объектов перемещаются по экрану автоматически и мешают
достижению цели.

5.

Техническое задание
Объекты игры
Игрок
Управляется с
клавиатуры
Препятствие
Перемещается
автоматически
Целевой объект
Стоит на месте
Касание
игрока и цели
Препятствия
исчезают
Касание игрока
и препятствия
Целевой объект
исчезает
Игра «Hit It!»
События игры
Схема может дополняться по мере разработки игры
Обсуждение
рабочих задач
Функционал проекта мы изображали с помощью mind map:

6.

Техническое задание
Для спрайтов мы
создали
собственный
класс Sprite.
Объекты игры
Игрок
Управляется с
клавиатуры
Препятствие
Перемещается
автоматически
Целевой объект
Стоит на месте
Касание
игрока и цели
Препятствия
исчезают
Касание игрока
и препятствия
Целевой объект
исчезает
Игра «Hit It!»
События игры
Схема может дополняться по мере разработки игры
Обсуждение
рабочих задач
Функционал проекта мы изображали с помощью mind map:

7.

Что готово на настоящий момент?
Обсуждение
рабочих задач
В прошлый раз была создана заготовка игры со всеми спрайтами и управлением
спрайтом-игроком с клавиатуры.
Каким функционалом нужно дополнить игру?

8.

Техническое задание
Функционал проекта мы изображали с помощью mind map:
Объекты игры
Препятствие
Перемещается
автоматически
Целевой объект
Игра «Hit It!»
Касание
игрока и цели
События игры
Касание игрока
и препятствия
А также метод,
определяющий,
было ли касание
спрайтов.
Обсуждение
рабочих задач
Игрок
Реализуем
автоматическое
перемещение спрайта.

9.

Цель рабочего дня —
изучить и применить на практике наследование классов.
Третий день тренинга по созданию и использованию собственных объектов
посвятим игре «Hit It!».
● продолжите работу с собственным классом Sprite
(наследником класса Turtle);
● дополните класс новыми методами;
● завершите создание интерактивной игры «Hit It!».
Обсуждение
рабочих задач
Сегодня вы:

10.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
Подтверждение
квалификации

11.

Чтобы приступить к рабочим задачам,
продемонстрируйте уровень своих
знаний.
Подтверждение
квалификации
Покажите, что вы готовы к «мозговому
штурму»!

12.

В чём смысл наследования?
Подтверждение
квалификации
Что такое суперкласс и класс-наследник?

13.

Наследование
Наследование классов помогает перенести все умения, написанные ранее для
более общего класса, в другой, более частный класс, класс-наследник.
Свойства
Методы
+
Свойства
Методы
Класс-наследник
A
B
Свойства
Методы
B
Суперкласс
Класс A вложен в класс B
Подтверждение
квалификации
A

14.

Подтверждение
квалификации
Приведите примеры классов и
подклассов из реальной жизни

15.

Классы и подклассы
Все кометы — это небесные тела
Все машины — это транспорт
A
B
Подтверждение
квалификации
Практически все классы являются родителями одних и наследниками
других классов.

16.

Подтверждение
квалификации
Как создать класс-наследник
с добавлением новых методов?

17.

Создание класса-наследника
при создании наследника указать имя суперкласса;
дополнить класс-наследник необходимыми методами.
Имя наследника
class Application(
Название метода
def print_info
Имя суперкласса
):
(self, Значение ):
Действие с объектом и св-вами
Название метода
def print_info
(self,
Значение
Действие с объектом и св-вами
):
Вариант с введением
только новых методов.
При создании экземпляра
наследника будет вызван
конструктор суперкласса!
Подтверждение
квалификации
Пусть суперкласс уже написан, тогда,
чтобы создать класс-наследник нужно:

18.

Подтверждение
квалификации
Как создать класс-наследник
с добавлением новых свойств и
методов?

19.

Создание класса-наследника
при создании наследника указать имя суперкласса;
создать конструктор, ввести свойства суперкласса и добавить новые;
дополнить класс-наследник необходимыми методами.
Имя наследника
class Application(
Имя суперкласса
def __init__(self,
):
Значение
,
Значение
Значение
super().__init__(
self.
Новое св-во
Название метода
def print_info
=
(self,
)Вариант с введением
нового свойства.
Значение
Значение
з
Действие с объектом и св-вами
):
):
Конструктор
перенимает свойства
суперкласса и добавляет
новое.
Подтверждение
квалификации
Чтобы создать класс-наследник нужно:

20.

Квалификация подтверждена!
Подтверждение
квалификации
Отлично, вы готовы к «мозговому штурму» и
реализации рабочей задачи!

21.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
«Мозговой штурм»:
Игра «Hit It!»

22.

Касание спрайтов
По техническому заданию игра должна продолжаться, пока:
➔ спрайт-игрок не коснётся целевого спрайта;
«Мозговой
штурм»
➔ спрайт-игрок не коснётся любого препятствия хотя бы 1 раз.

23.

Схема работы программы:
total = 0 — касания цели
Нет
Касаний цели меньше 3?
Да
Смещение препятствий (?)
Игрок коснулся
целевого спрайта?
Да
Увеличить total на
1
Переместить игрока обратно
Игрок коснулся препятствия?
Скрыть целевой спр.
Выйти из цикла
«Мозговой
штурм»
Нет

24.

Схема работы программы:
Усложним игру для
пользователя! Пусть
надо «поймать» целевой
спрайт не менее 3 раз.
total = 0 — касания цели
Нет
Касаний цели меньше 3?
Да
Смещение препятствий (?)
Игрок коснулся
целевого спрайта?
Да
Увеличить total на
1
Переместить игрока обратно
Игрок коснулся препятствия?
Скрыть целевой спр.
Выйти из цикла
«Мозговой
штурм»
Нет

25.

Схема работы программы:
total = 0 — касания цели
Нет
Касаний цели меньше 3?
Создадим метод,
определяющий,
произошло ли
столкновение
спрайтов.
Смещение препятствий (?)
Нет
Игрок коснулся
целевого спрайта?
Да
Увеличить total на
1
Переместить игрока обратно
Игрок коснулся препятствия?
Скрыть целевой спр.
Выйти из цикла
Как выявить
касание?
«Мозговой
штурм»
Да

26.

Касание спрайтов
Определить расстояние между двумя спрайтами поможет метод класса Turtle.
Вид
dist = turtle.distance(x, y)
Комментарий
Метод, возвращающий расстояние
между объектом Turtle и точкой с
координатами (x, y)
Как использовать данный метод, чтобы найти расстояние между двумя
спрайтами, а не спрайтом и точкой?
«Мозговой
штурм»
turtle.distance(x, y)

27.

Касание спрайтов
Определить расстояние между двумя спрайтами поможет метод класса Turtle.
Вид
dist = turtle.distance(x, y)
Комментарий
Метод, возвращающий расстояние
между объектом Turtle и точкой с
координатами (x, y)
dist = t1.distance(t2.xcor(), t2.ycor())
turtle.distance(спрайт)
Положение второго
объекта Turtle получаем с
помощью методов xcor() и
ycor().
Каким должно быть
расстояние между
спрайтами при касании?
«Мозговой
штурм»
turtle.distance(x, y)

28.

Касание спрайтов
Определить расстояние между двумя спрайтами поможет метод класса Turtle.
Вид
Комментарий
Метод, возвращающий расстояние
между объектом Turtle и точкой с
координатами (x, y)
dist = turtle.distance(x, y)
?
Учтём, что метод возвращает расстояние между центрами.
Расстояние, равное 0, слишком маленькое!
Правдоподобное условие касания спрайтов: расстояние < 30.
«Мозговой
штурм»
turtle.distance(точка
)

29.

Касание спрайтов
Добавим в класс Sprite метод is_collide(), определяющий, произошло ли касание
спрайтов.
class Sprite(Turtle):
Уже реализованная часть класса
def is_collide(self, sprite):
dist = self.distance(sprite.xcor(), sprite.ycor())
return True
else:
return False
player.is_collide(goal)
Правдоподобное условие касания
«Мозговой
штурм»
if dist < 30:

30.

Касание спрайтов
Добавим в класс Sprite метод is_collide(), определяющий, произошло ли касание
спрайтов.
class Sprite(Turtle):
Уже реализованная часть класса
def is_collide(self, sprite):
dist = self.distance(sprite.xcor(), sprite.ycor())
return True
else:
return False
«Произошло ли касание игрока цели?»
player.is_collide(goal)
Как использовать метод в реализации игрового
цикла?
«Мозговой
штурм»
if dist < 30:

31.

Главный цикл игры
Часть игрового цикла можно реализовать уже сейчас.
total_score = 0
while total_score < 3:
if player.is_collide(goal):
«Если игрок коснулся цели...»
player.goto(0, -100)
total_score += 1
goal.hideturtle()
break
enemy1.hideturtle()
enemy2.hideturtle()
«Если игрок коснулся препятствия...»
«Мозговой
штурм»
if player.is_collide(enemy1) or player.is_collide(enemy2):

32.

Ожидаемый вид игры
«Мозговой
штурм»
Игры после дополнения игрового цикла:

33.

Ожидаемый вид игры
Игры после дополнения игрового цикла:
Обработка событий происходит с
помощью объекта Screen.
«Мозговой
штурм»
Чтобы «активировать» экран при запуске
игры, необходимо кликнуть по нему
мышкой.

34.

Задачи:
➔ Дополните код класса Sprite игры «Hit It!» методом is_collide() для
обработки касания спрайтов.
«Мозговой
штурм»
➔ Запрограммируйте игровой цикл и реакцию на касания целевого
спрайта или препятствий.

35.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
Платформа:
Игра «Hit It!»

36.

Выполните задания на платформе
«Игра “Hit It!”»
Работаем на
платформе
mars.algoritmika.org

37.

Перерыв

38.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
«Мозговой штурм»:
Игра «Hit It!»

39.

Перемещение спрайтов
Осталось запрограммировать автоматическое перемещение спрайтов-препятствий.
«Мозговой
штурм»
Как это сделать?

40.

Перемещение спрайтов
Осталось запрограммировать автоматическое перемещение спрайтов-препятствий.
Как это сделать?
Шаг
Шаг
Шаг
«Мозговой
штурм»
...

41.

Перемещение спрайтов
Осталось запрограммировать автоматическое перемещение спрайтов-препятствий.
Как это сделать?
Игрок
Препятствие
Перемещается
автоматически
Сделать шаг
Целевой объект
«Мозговой
штурм»
Объекты игры
Задать
направление

42.

Перемещение спрайтов
Осталось запрограммировать автоматическое перемещение спрайтов-препятствий.
Как это сделать?
Методы Sprite
Игрок
Препятствие
Перемещается
автоматически
Сделать шаг
Целевой объект
«Мозговой
штурм»
Объекты игры
Задать
направление

43.

1. Метод «Задать направление»
С помощью методов класса Turtle:
➔ размещаем спрайт в начальной точке движения;
➔ задаём направление движения к конечной точке.
angle = turtle.towards(x, y)
turtle.setheading(angle)
Комментарий
Метод, возвращающий угол между текущим
направлением черепашки и направлением к
указанной точке
Метод, разворачивающий черепашку под
указанным углом
Конечная точка
(точка поворота)
«Мозговой
штурм»
Вид

44.

1. Метод «Задать направление»
Реализуем метод с помощью команд класса Turtle.
Класс Sprite:
def set_move(self, x_start, y_start, x_end, y_end):
«Мозговой
штурм»
Как параметры передаём
координаты начальной и конечной
точки движения.

45.

1. Метод «Задать направление»
Реализуем метод с помощью команд класса Turtle.
Класс Sprite:
def set_move(self, x_start, y_start, x_end, y_end):
self.x_start = x_start
self.y_start = y_start
self.x_end = x_end
«Сохраняем» координаты в новых
свойствах класса Sprite.
«Мозговой
штурм»
self.y_end = y_end

46.

1. Метод «Задать направление»
Реализуем метод с помощью команд класса Turtle.
Класс Sprite:
def set_move(self, x_start, y_start, x_end, y_end):
self.x_start = x_start
self.y_start = y_start
self.y_end = y_end
self.goto(x_start, y_start)
self.setheading(self.towards(x_end, y_end))
Перемещаем спрайт в
начальную точку движения и
задаём направление к
конечной точке.
«Мозговой
штурм»
self.x_end = x_end

47.

2. Метод «Сделать шаг»
Длина шага передавалась в спрайт при создании экземпляра Sprite.
Шаг хранится в поле step.
Класс Sprite:
def make_step(self):
Перемещение осуществляет метод Turtle.
Всегда ли спрайт может сделать шаг в нужном направлении?
«Мозговой
штурм»
self.forward(self.step)

48.

2. Метод «Сделать шаг»
Длина шага передавалась в спрайт при создании экземпляра Sprite.
Шаг хранится в поле step.
Класс Sprite:
def make_step(self):
if self.distance(self.x_end, self.y_end) < self.step:
self.set_move(self.x_end, self.y_end, self.x_start, self.y_start)
Шаг можно сделать, пока не достигнута граница
экрана.
«Мозговой
штурм»
self.forward(self.step)

49.

2. Метод «Сделать шаг»
Длина шага передавалась в спрайт при создании экземпляра Sprite.
Шаг хранится в поле step.
Класс Sprite:
def make_step(self):
Если до точки конца движения
осталось меньше одного
шага...
if self.distance(self.x_end, self.y_end) < self.step:
self.set_move(self.x_end, self.y_end, self.x_start, self.y_start)
...начинаем двигаться в
обратную сторону.
«Мозговой
штурм»
self.forward(self.step)

50.

Внедряем методы в код игры
Основной код программы:
enemy1 = Sprite(-200, 0, 15, 'square', 'red')
enemy1.set_move(-200, 0, 200, 0)
Вместе с созданием препятствий
задаём направление движения.
enemy2 = Sprite(200, 70, 15, 'square', 'red')
enemy2.set_move(200, 70, -200, 70)
while total_score < 3:
enemy1.make_step()
enemy2.make_step()
if player.is_collide(goal):
#...
На каждом шаге цикла
сдвигаем спрайты в нужном
направлении.
«Мозговой
штурм»
#...

51.

Задачи:
«Мозговой
штурм»
➔ Завершить игру «Hit It!», дополнив код перемещением препятствий
вправо-влево.

52.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
Платформа:
Игра «Hit It!»

53.

Выполните задания на платформе
«Игра “Hit It!”»
Работаем на
платформе
mars.algoritmika.org

54.

Модуль 5. Урок 6. ООП. Наследование. Продолжение
Завершение
рабочего дня

55.

Для завершения работы
пройдите техническое интервью
2. Можно ли создать класс-наследник от суперкласса, описанного
в какой-либо библиотеке (например, стандартной библиотеке
Python)? Как это сделать?
Костя,
Алёна,
старший разработчик
менеджер проектов
Подведение итогов
рабочего дня
1. В чём смысл наследования? Какие классы-наследники вы
создавали на тренинге?

56.

Оценка эффективности
проделанной работы
Ответьте с коллегами на вопросы:
1. Что получилось лучше всего?
3. Что нужно сделать, чтобы в следующий раз
избежать неудачи?
Поздравляем с завершением работы над
игрой «Hit It!». Пора приступать к изучению
игровых библиотек!
Подведение итогов
рабочего дня
2. Что получилось не так, как хотелось?
English     Русский Rules