Глава 19 · Модель игры

Почему тело движется с хвоста

Обновление в обратном порядке схлопывает все сегменты в одну точку — разберём, почему.

Порядок обновления сегментов — не деталь, а необходимость

Раздел 19.6 уже показал правило: тело обновляется с хвоста, каждый сегмент занимает место предыдущего. Разберём, что случится, если поменять порядок на противоположный — от головы к хвосту:

2
1
H
было: H-S1-S2
2
1
H
стало (правильно): каждый унаследовал позицию предыдущего
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(): порядок обновления решает всё
Открыть практику →