Глава 19 · Проект: «Змейка»

Наша змейка ест!

Съеденное яблоко добавляет сегмент — и каждый сегмент должен правильно следовать за предыдущим.

Наша змейка ест!

Проверяем, достаточно ли близко голова оказалась к яблоку (метод .distance() считает расстояние между двумя черепашками) — если да, яблоко «съедено»: появляется новое яблоко, змейка растёт, счёт увеличивается:

eda.py
def proverit_edu():
    global schet
    if golova.distance(yabloko) < RAZMER_SHAGA:
        novoe_yabloko()
        dobavit_segment()
        schet += 10
        obnovit_tablo()

Заставляем двигаться всю змейку

Каждый сегмент тела должен занять место предыдущего сегмента (а первый — место головы) — это создаёт эффект «змейка ползёт целиком», а не «части двигаются независимо»:

dobavit_segment.py
def dobavit_segment():
    novyj = turtle.Turtle()
    novyj.speed(0)
    novyj.shape("square")
    novyj.color("grey")
    novyj.penup()
    segmenty.append(novyj)
dvigat_telo.py
def dvigat_telo():
    # начинаем с хвоста и идём к голове, чтобы не потерять позиции по пути
    for indeks in range(len(segmenty) - 1, 0, -1):
        x = segmenty[indeks - 1].xcor()
        y = segmenty[indeks - 1].ycor()
        segmenty[indeks].goto(x, y)

    if segmenty:
        segmenty[0].goto(golova.xcor(), golova.ycor())
Порядок вызовов решает всё
dvigat_telo() обязательно вызывается до dvigat_golovu() — иначе первый сегмент «унаследует» уже новую позицию головы вместо старой, и тело слипнется с головой в одну точку.
Практика в Jupyter Notebook
19-06-eda-telo.ipynb · поедание яблок и движение тела
Открыть ноутбук →