← Все вопросы

Делаю змейку на pygame — как сделать, чтобы змейка росла и двигалась по клеткам?

Задан 23 месяца назад485 просмотров2 ответа
9

Хочу написать классическую змейку. С окном и едой разобрался, но не пойму, как хранить саму змейку, чтобы она двигалась всем телом и удлинялась, когда съедает яблоко. Каждый сегмент отдельной переменной — это же дичь.

2 ответа

14
✓ Принятый ответ — помог автору

Главная идея: змейка — это список клеток (координат сегментов). Двигаешь её так: добавляешь новую голову спереди и убираешь хвост сзади. Если съели яблоко — хвост не убираешь, и змейка на клетку длиннее.

CELL = 20
snake = [(5, 5), (4, 5), (3, 5)]   # голова первая
dx, dy = 1, 0                      # направление (вправо)

def step(grow):
    head_x, head_y = snake[0]
    new_head = (head_x + dx, head_y + dy)
    snake.insert(0, new_head)      # новая голова спереди
    if not grow:
        snake.pop()                # обычный ход — убираем хвост

# при поедании яблока вызываешь step(grow=True), иначе step(grow=False)

Рисуешь так:

for (cx, cy) in snake:
    pygame.draw.rect(screen, (0, 200, 0), (cx*CELL, cy*CELL, CELL-1, CELL-1))

Движение по клеткам делай не каждый кадр (будет слишком быстро), а по таймеру — например раз в 8 кадров. Проигрыш — когда голова совпала с телом или вышла за поле.

6

Сразу заложи защиту от разворота на 180°: если змейка едет вправо, нажатие «влево» должно игнорироваться, иначе голова мгновенно врежется в шею и игра окончена. Проверяй: новое направление нельзя ставить противоположным текущему.

Ваш ответ

Войдите, чтобы ответить на вопрос.