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
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