Движущаяся змея в pygame

Я только начал изучать pygame и работаю над игрой про змей. Однако я не могу повернуть змею и не могу найти проблему. Я думаю, что проблема в методе "move_snake" внутри класса змеи, но я действительно не могу найти проблему. Обычно я новичок в python и объектно-ориентированном программировании, так что это может быть причиной.

import pygame, sys
import random
pygame.init()

clock = pygame.time.Clock()

screen_width = 600
screen_height = 600

screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Snake Game")

bgColor = "grey12"
lightGrey = (200, 200, 200)

random_x = random.randint(0, screen_width - 20)
random_y = random.randint(0, screen_height - 20)

class FOOD:
    def __init__(self):
        self.food_x = random_x
        self.food_y = random_y
        self.food_width = 20
        self.food_height = 20
        self.food_rect = pygame.Rect(self.food_x, self.food_y, self.food_width, self.food_height)
    def draw_food(self):
        pygame.draw.rect(screen, lightGrey, self.food_rect)

food = FOOD()

class SNAKE(FOOD):
    def __init__(self):
        super().__init__()
        self.snake_width = 20
        self.snake_height = 20
        self.snake_x = screen_width/2 - self.snake_width
        self.snake_y = screen_height/2 - self.snake_height
        self.snake_rect = pygame.Rect(self.snake_x, self.snake_y, self.snake_width, self.snake_height)
        self.move = [0, -1]
        self.snake_speed = 5
    def draw_snake(self):
        pygame.draw.rect(screen, lightGrey, self.snake_rect)
    def move_snake(self):
        for e in pygame.event.get():
            if e.type == pygame.KEYDOWN:
                if e.key == pygame.K_UP:
                    self.move = [0, -1]
                if e.key == pygame.K_DOWN:
                    self.move = [0, 1]
                if e.key == pygame.K_LEFT:
                    self.move = [-1, 0]
                if e.key == pygame.K_RIGHT:
                    self.move = [1, 0]
        self.snake_x += self.move[0] * self.snake_speed
        self.snake_y += self.move[1] * self.snake_speed
        self.snake_rect.topleft = (self.snake_x, self.snake_y)

snake = SNAKE()

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill(bgColor)
    food.draw_food()
    snake.draw_snake()

    snake.move_snake()

    pygame.display.flip()

    clock.tick(60)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в множественных вызовах pygame.event.get().

pygame.event.get() получить все сообщения и удалить их из очереди:

Это позволит получить все сообщения и удалить их из очереди. [...]

Если pygame.event.get() вызывается в нескольких циклах событий, только один цикл получает события, но никогда все циклы не получают все события. В результате некоторые события кажутся пропущенными.

Получите события один раз и используйте их в нескольких циклах или передайте список или события функциям и методам, где они обрабатываются:

class SNAKE(FOOD):
    # [...]

    def move_snake(self, event_list):
        for e in event_list:
            if e.type == pygame.KEYDOWN:
                # [...]
while True:

    event_list = pygame.event.get()
    for event in event_list:
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # [...]

    snake.move_snake(event_list)

Другие вопросы по теме