Rozdział 14 · Tworzenie rzeczywistych obiektów

Mini-Projekt: Race Turtle v2

Sam wyścig staje się obiektem — kontroluje uczestników i nie powiela ich logiki.

Mini-Projekt: Race Turtle v2

Rozwińmy projekt z sekcji 14.4. Tym razem nie chodzi tylko o uczestników :( Uchastnik) — sama rasa staje się także obiektem: klasą Gonka przechowuje lista uczestników, rysuje linię mety i określa kolejność mety — kolejny przykład kompozycji (rozdział 14.13), ale już obiekt, który zarządza innymi obiektami.

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()
Rezultat
Trzy żółwie na torach obok pionowej linii mety
Gonka trzyma trzy Uchastnik i sam rysuje linię mety
GonkaUchastnikHAS-A (LISTA)
Gonka przechowuje lista obiektów Uchastnik i zarządza wyścigiem w całości
Obiekty współpracujące ze sobą
Gonka nie powtarza logiki sprawdzania kroku czy zakończenia — deleguje ją wszystkim 16 Uchastnik (u.sdelat_shag(), u.proverit_finish(...)) i tylko je koordynuje. To typowy obraz OWP: nie jedna wielka klasa, która potrafi wszystko, lecz kilka małych klas, z których każda odpowiada za swoje i współpracuje poprzez zrozumiałe metody ze sobą nawzajem.
Challenge
Tabela wyników

Dodaj Gonka tablitsa_rezultatov(self) metodę, która zwraca self.rezultaty jako tekst ponumerowany ("1. miejsce: red", "2. miejsce: blue", ...).

Praktyka: Wyścig Turtle v2
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →