Глава 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 · поедание яблок и движение тела