делаю змейку на pygame, персонаж не двигается! помогите
Решил замахнуться на змейку на pygame. Окно открывается, квадратик рисуется, но он стоит на месте и не двигается на стрелки! Что не так?
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 400))
x, y = 200, 200
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
x += 20
pygame.draw.rect(screen, (0, 255, 0), (x, y, 20, 20))
pygame.display.flip()
Квадрат не едет, а ещё за ним тянется зелёный след. Помогите, очень хочу свою змейку!
2 ответа
Две классические проблемы новичков, у меня было точно так же. Первое — след оттого, что ты не стираешь экран перед рисованием, надо каждый кадр заливать фон. Второе — змейка обычно двигается сама в одну сторону, а стрелки лишь меняют направление (это и есть фишка змейки). Вот рабочая основа:
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
x, y = 200, 200
dx, dy = 20, 0 # направление: едем вправо
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
dx, dy = 20, 0
elif event.key == pygame.K_LEFT:
dx, dy = -20, 0
elif event.key == pygame.K_UP:
dx, dy = 0, -20
elif event.key == pygame.K_DOWN:
dx, dy = 0, 20
x += dx
y += dy
screen.fill((0, 0, 0)) # стираем прошлый кадр
pygame.draw.rect(screen, (0, 255, 0), (x, y, 20, 20))
pygame.display.flip()
clock.tick(10) # 10 кадров в секунду — скорость змейки
pygame.quit()
Как работает: dx, dy — направление движения. Стрелки не двигают змейку сразу, а меняют направление, и каждый кадр голова едет сама (x += dx). screen.fill стирает старый кадр — поэтому пропадает след. clock.tick(10) держит 10 кадров в секунду, иначе змейка унесётся мгновенно.
Как улучшить: дальше добавь хвост (список координат), еду (красный квадрат в случайном месте) и проверку столкновения со стеной — и получится полноценная змейка!
Если будешь делать хвост — храни его как список координат сегментов: на каждом шаге вставляй новую голову в начало списка, а хвост убирай с конца. Когда съел еду — хвост не убираешь, и змейка растёт. И не забудь clock.tick(), без него процессор воет на 100%.