← Все вопросы

делаю змейку на pygame, персонаж не двигается! помогите

Задан 4 месяца назад718 просмотров2 ответа
8

Решил замахнуться на змейку на 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 ответа

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

Две классические проблемы новичков, у меня было точно так же. Первое — след оттого, что ты не стираешь экран перед рисованием, надо каждый кадр заливать фон. Второе — змейка обычно двигается сама в одну сторону, а стрелки лишь меняют направление (это и есть фишка змейки). Вот рабочая основа:

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 кадров в секунду, иначе змейка унесётся мгновенно.

Как улучшить: дальше добавь хвост (список координат), еду (красный квадрат в случайном месте) и проверку столкновения со стеной — и получится полноценная змейка!

5

Если будешь делать хвост — храни его как список координат сегментов: на каждом шаге вставляй новую голову в начало списка, а хвост убирай с конца. Когда съел еду — хвост не убираешь, и змейка растёт. И не забудь clock.tick(), без него процессор воет на 100%.

Ваш ответ

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