Глава 14 · Создаём объекты реального мира

Мини-проект: гонка Turtle v2

Гонка сама становится объектом — управляет участниками, а не дублирует их логику.

Мини-проект: гонка Turtle v2

Расширим проект из раздела 14.4. На этот раз не только участники ( Uchastnik) — сама гонка тоже становится объектом: класс Gonka хранит список участников, рисует финишную линию и определяет порядок финиша — ещё один пример композиции (раздел 14.13), но уже объект, управляющий другими объектами.

gonka_v2.py
import turtle
import random

random.seed(7)
screen = turtle.Screen()
screen.setup(520, 420)

class Uchastnik:
    def __init__(self, cvet, startovyj_y):
        self.t = turtle.Turtle()
        self.t.shape("turtle")
        self.t.color(cvet)
        self.t.penup()
        self.t.goto(-220, startovyj_y)
        self.cvet = cvet
        self.finishiroval = False

    def sdelat_shag(self):
        if not self.finishiroval:
            self.t.forward(random.randint(1, 10))

    def proverit_finish(self, finish_x):
        if self.t.xcor() >= finish_x:
            self.finishiroval = True
        return self.finishiroval


class Gonka:
    def __init__(self, cveta, finish_x):
        self.finish_x = finish_x
        self.uchastniki = [
            Uchastnik(cvet, i * 50 - 75) for i, cvet in enumerate(cveta)
        ]
        self.rezultaty = []

    def narisovat_finish(self):
        liniya = turtle.Turtle()
        liniya.hideturtle()
        liniya.penup()
        liniya.goto(self.finish_x, -120)
        liniya.pendown()
        liniya.pencolor("#0D0230")
        liniya.pensize(3)
        liniya.setheading(90)
        liniya.forward(240)

    def sygrat_do_kontsa(self):
        self.narisovat_finish()
        while len(self.rezultaty) < len(self.uchastniki):
            for u in self.uchastniki:
                u.sdelat_shag()
                if u.proverit_finish(self.finish_x) and u.cvet not in self.rezultaty:
                    self.rezultaty.append(u.cvet)

gonka = Gonka(["red", "blue", "green"], 210)
gonka.sygrat_do_kontsa()

screen.exitonclick()
Результат выполнения
Три черепашки на дорожках рядом с вертикальной финишной линией
Gonka хранит трёх Uchastnik и сама рисует финишную линию
GonkaUchastnikHAS-A (СПИСОК)
Gonka хранит список объектов Uchastnik и управляет гонкой в целом
Объекты, сотрудничающие друг с другом
Gonka не дублирует логику шага или проверки финиша — она делегирует её каждому Uchastnik (u.sdelat_shag(), u.proverit_finish(...)) и только координирует их. Это типичная для ООП картина: не один гигантский класс, который умеет всё, а несколько небольших классов, каждый отвечает за своё, и сотрудничающих через понятные методы друг друга.
★★★ Задача повышенной сложности
Таблица результатов

Добавьте Gonka метод tablitsa_rezultatov(self), возвращающий self.rezultaty в виде пронумерованного текста («1 место: red», «2 место: blue», ...).

Практика: гонка Turtle v2
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →