Делаю змейку на pygame — как сделать, чтобы змейка росла и двигалась по клеткам?
Хочу написать классическую змейку. С окном и едой разобрался, но не пойму, как хранить саму змейку, чтобы она двигалась всем телом и удлинялась, когда съедает яблоко. Каждый сегмент отдельной переменной — это же дичь.
2 ответа
Главная идея: змейка — это список клеток (координат сегментов). Двигаешь её так: добавляешь новую голову спереди и убираешь хвост сзади. Если съели яблоко — хвост не убираешь, и змейка на клетку длиннее.
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 кадров. Проигрыш — когда голова совпала с телом или вышла за поле.
Сразу заложи защиту от разворота на 180°: если змейка едет вправо, нажатие «влево» должно игнорироваться, иначе голова мгновенно врежется в шею и игра окончена. Проверяй: новое направление нельзя ставить противоположным текущему.