Загрузка данных
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: