Глава 19 · Модель игры
Почему тело движется с хвоста
Обновление в обратном порядке схлопывает все сегменты в одну точку — разберём, почему.
Порядок обновления сегментов — не деталь, а необходимость
Раздел 19.6 уже показал правило: тело обновляется с хвоста, каждый сегмент занимает место предыдущего. Разберём, что случится, если поменять порядок на противоположный — от головы к хвосту:
было: H-S1-S2
→
стало (правильно): каждый унаследовал позицию предыдущего
ot_hvosta.py
def dvigat_telo():
for indeks in range(len(segmenty) - 1, 0, -1):
# segmenty[indeks] получает СТАРУЮ позицию segmenty[indeks - 1]
x = segmenty[indeks - 1].xcor()
y = segmenty[indeks - 1].ycor()
segmenty[indeks].goto(x, y)
От головы к хвосту — сегменты схлопываются в одну точку
Если пойти в обратном порядке,
segmenty[0] первым получит позицию головы. На следующей итерации segmenty[1] прочитает координаты segmenty[0] — но это уже НОВАЯ, только что перезаписанная позиция, а не старая. Через несколько итераций все сегменты окажутся в одной и той же точке — змейка визуально схлопнется в квадрат.Раздел 19.18 покажет более элегантную альтернативу этому циклу — модель «новая голова + старое тело», которая вообще не двигает существующие сегменты по отдельности.
Практика: правильный порядок обновления тела
Автоматическая проверка — функции move_from_tail() и move_from_head_BROKEN(): порядок обновления решает всё