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