Rozdział 19 · Architektura

Render: model → Turtle

Ta sama pula segmentów Turtle-segment jest wykorzystywana ponownie przy każdym ticku – nowe powstają dopiero wtedy, gdy wąż urośnie.

render() nie tworzy nowych segmentów przy każdym ticku

Prawdziwe okno: cienka fioletowa siatka na boisku, oznaczona head cell i food cell
Prawdziwe okno: ta sama siatka z sekcji 19.9, ale teraz widać głowę i jedzenie — po prostu komórki, które render() przekształca w konkretne obiekty Turtle-.

Wąż rośnie i pojawia się proste rozwiązanie: stworzyć nowego turtle.Turtle() za każde zjedzone jabłko i dokładnie to robił pierwszy prototyp (Rozdział 19.6). Ale obiekty Turtle nie znikają: po restart() będzie ich tyle samo, co było w najdłuższym czasie Partii, a każda z nich będzie nadal obsługiwać ekran. Dlatego wchodzimy basen Segmenty: po stworzeniu żółwie są wykorzystywane ponownie z klatki do klatki, nowe Są dodawane tylko wtedy, gdy naprawdę jest ich za mało, a te dodatkowe są ukryte, a nie usuwane.

render.py
def render(self):
    self.head.goto(*self.state.snake[0])

    body = self.state.snake[1:]
    self._ensure_segment_pool(len(body))
    for i, segment in enumerate(self._segment_pool):
        if i < len(body):
            segment.showturtle()
            segment.goto(*body[i])
        else:
            segment.hideturtle()

    if self.state.food is not None:
        self.food_turtle.showturtle()
        self.food_turtle.goto(*self.state.food)
    else:
        self.food_turtle.hideturtle()   # WON — brak wolnych komórek

    self._render_scoreboard()
    self.screen.update()
Sprawdzenie food is not None jest tutaj obowiązkowe
Rozdział 19.18 obiecywał, że rysowanie uczciwie obsłuży sytuację, gdy nie ma już wolnego pola na pożywienie — tutaj. Bez sprawdzenia self.food_turtle.goto(*self.state.food) at food = None spada z TypeError: turtle.TNavigator.goto() argument after * must be an iterable, not NoneType – dokładnie w momencie zwycięstwa, w najrzadszym i najbardziej ofensywnym stanie gry.
Pul rośnie, ale nigdy nie zmniejsza się sam
_ensure_segment_pool() dodaje nowe segmenty Turtle-, tylko jeśli jest ich za mało, istniejące są ponownie wykorzystywane. Gdy wąż staje się krótszy (po restart()), dodatkowe segmenty nie są usuwane, lecz po prostu ukryte przez hideturtle() — w następnej długiej grze będą znowu potrzebne i nie trzeba ich będzie tworzyć od nowa.
Praktyka: render() i pula odłamków
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →