Как мне увеличить длину змеи, чтобы она соответствовала предыдущему прямоугольнику / длине перед ней, а не находилась прямо за головой - PullRequest
3 голосов
/ 08 мая 2019

Моя текущая программа работает так, что когда змея ест яблоко, к змее прибавляется длина. Но путь, по которому следует змея, заключается в том, что она всегда находится позади головы по прямой линии. Как мне заставить его следовать за змеей или следовать длине перед ней, как в обычной игре со змеей?

Это мой код, когда я добавляю длину к змее.

for i in range(lengthAmount):
        if i == 0:
            previousx = snakex - (30 * i)
            previousy = snakey
        if direction == "left":
            previousx = snakex + (30 * i)
            previousy = snakey
        elif direction == "right":  
            previousx = snakex - (30 * i)
            previousy = snakey
        elif direction == "up":
            previousx = snakex 
            previousy = snakey + (30 * i)
        elif direction == "down":
            previousx = snakex  
            previousy = snakey - (30 * i)

        pygame.draw.rect(window, (0, 175, 0), (previousx, previousy, 30, 30))

1 Ответ

1 голос
/ 08 мая 2019

Вам нужен список частей тела змеи, а не переменная, которая знает количество частей.Список содержит позиции тела змеи, исключая голову.Хвост змеи хранится в 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)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...