Загрузка данных


import pygame

# Запускаем pygame
pygame.init()


# =========================
# НАСТРОЙКИ ИГРЫ
# =========================

# Размер окна
WIDTH = 800
HEIGHT = 600

# Размер одной клетки
CELL_SIZE = 20

# Скорость игры
FPS = 10


# =========================
# ЦВЕТА
# =========================

BACKGROUND_COLOR = (30, 30, 30)
SNAKE_COLOR = (0, 200, 0)
TEXT_COLOR = (255, 255, 255)


# =========================
# ОКНО
# =========================

screen = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption("Змейка")


# =========================
# ШРИФТ
# =========================

# Создаём шрифт для текста
font = pygame.font.Font(None, 36)


# =========================
# ЗМЕЙКА
# =========================

# Начальная позиция змейки
snake_x = WIDTH // 2
snake_y = HEIGHT // 2

# Направление движения
# 1 означает вправо
# 0 означает отсутствие движения по этой оси
direction_x = 1
direction_y = 0


# =========================
# ОЧКИ
# =========================

score = 0


# =========================
# ИГРА
# =========================

running = True

# Создаём часы
clock = pygame.time.Clock()


while running:

    # =========================
    # ОБРАБОТКА СОБЫТИЙ
    # =========================

    for event in pygame.event.get():

        # Если нажали крестик
        if event.type == pygame.QUIT:
            running = False

        # Если нажали клавишу
        if event.type == pygame.KEYDOWN:

            # Если нажали W
            if event.key == pygame.K_w:

                # Если змейка НЕ движется вниз
                if direction_y != 1:
                    direction_x = 0
                    direction_y = -1

            # Если нажали S
            if event.key == pygame.K_s:

                # Если змейка НЕ движется вверх
                if direction_y != -1:
                    direction_x = 0
                    direction_y = 1

            # Если нажали A
            if event.key == pygame.K_a:

                # Если змейка НЕ движется вправо
                if direction_x != 1:
                    direction_x = -1
                    direction_y = 0

            # Если нажали D
            if event.key == pygame.K_d:

                # Если змейка НЕ движется влево
                if direction_x != -1:
                    direction_x = 1
                    direction_y = 0


    # =========================
    # ДВИЖЕНИЕ
    # =========================

    # Двигаем змейку по X
    snake_x += direction_x * CELL_SIZE

    # Двигаем змейку по Y
    snake_y += direction_y * CELL_SIZE


    # =========================
    # ПРОВЕРКА СТЕН
    # =========================

    # Если вышли за левую или правую границу
    if snake_x < 0 or snake_x >= WIDTH:

        # Завершаем игру
        running = False

    # Если вышли за верхнюю или нижнюю границу
    if snake_y < 0 or snake_y >= HEIGHT:

        # Завершаем игру
        running = False


    # =========================
    # ОЧИЩАЕМ ЭКРАН
    # =========================

    screen.fill(BACKGROUND_COLOR)


    # =========================
    # РИСУЕМ ЗМЕЙКУ
    # =========================

    pygame.draw.rect(
        screen,
        SNAKE_COLOR,
        (snake_x, snake_y, CELL_SIZE, CELL_SIZE)
    )


    # =========================
    # РИСУЕМ СЧЁТ
    # =========================

    # Создаём текст
    score_text = font.render(
        f"Score: {score}",
        True,
        TEXT_COLOR
    )

    # Показываем текст
    screen.blit(score_text, (10, 10))


    # =========================
    # ОБНОВЛЯЕМ ЭКРАН
    # =========================

    pygame.display.flip()

    # Ограничиваем FPS
    clock.tick(FPS)


# =========================
# ЗАКРЫВАЕМ ИГРУ
# =========================

pygame.quit()
Что здесь самое важное

Теперь у нас есть нормальная логика направления:

direction_x
direction_y

Например:

вправо:

direction_x = 1
direction_y = 0

влево:

direction_x = -1
direction_y = 0

вверх:

direction_x = 0
direction_y = -1

вниз:

direction_x = 0
direction_y = 1

А вот эта проверка запрещает разворот:

if direction_y != 1: