Вам нужен список частей тела змеи, а не переменная, которая знает количество частей.Список содержит позиции тела змеи, исключая голову.Хвост змеи хранится в snakex
и snakey
.В начале игры список частей тела пуст:
snake_body = []
Прежде чем перемещать змею в игровом цикле, добавьте положение головы змеи в список тел.
while run:
# [...]
snake_body.append((snakex, snakey))
После этого переместите змею, изменив положение.Подтвердите, есть ли у змеи яблоко, и сохраните результат в переменной состояния (eat_appel
):
# move sanke
snakex += # [...]
snakey += # [...]
eat_appel = # True if snake eats an apple else False
Следующим шагом является оценка длины змеи.
Если змея имеетесли съесть яблоко, то длина тела должна быть увеличена на 1. Это выполняется, поскольку мы добавили часть к телу змеи.
Если змея не ела за яблоко, длинатело должно быть одинаковым.В этом случае мы должны удалить первую часть списка тела.Элемент списка может быть удален оператором del
.Обратите внимание, поскольку мы добавили элемент в конец списка тела, но мы удалили первый элемент списка, поэтому части тела постоянно меняются и продолжают «следовать» за головой змеи.
if not eat_appel:
del snake_body[0]
Когда вы рисуете змею, то достаточно нарисовать прямоугольники в сохраненных положениях:
# draw body
for body in snake_body:
pygame.draw.rect(window, (0, 175, 0), (*body, 30, 30))
# draw head (in a different color)
pygame.draw.rect(window, (175, 175, 0), (snakex, snakey, 30, 30))