Глава 19 · Архитектура

SnakeApp: отделяем модель от визуализации

app.state — модель игры; app.screen и Turtle-объекты — только то, что видно на экране.

app HAS-A screen — тот же паттерн, что и в главах 16–18

app : SnakeAppscreen = Screenstate = GameStaterng = random.Randomhead = Turtlefood_turtle = Turtle_segment_pool = list[Turtle]
app хранит и виджеты Turtle, и модель (state) — но не путает их друг с другом.
Группа методовЗа что отвечает
bind_keysпостроение обработчиков клавиатуры — один раз, при запуске
request_directionклавиша → запрос направления, без движения прямо сейчас
game_tickодин тик игры → изменения state
renderstate → Turtle (единственное место, которое рисует по-настоящему)
toggle_pause / restartуправление жизненным циклом игры
SnakeApp не наследуется от turtle.Screen
Как и PaintApp(tk.Tk) в главе 18, наследование здесь технически возможно, но не выбрано: self.screen — отдельный атрибут, а не сам объект SnakeApp. Композиция делает границу между «моей логикой» и «внутренностями Turtle» явной.
Практика: собираем объектный граф SnakeApp
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →