Рассказываем, что такое Pygame, почему она подходит для тех, у кого мало опыта в программировании, и как создать игру на Python.
Что такое Pygame и почему она идеальна для первой игры
Pygame — библиотека для создания игр на Python, которая упрощает работу с графикой, звуком и управлением. Вам не нужно разбираться в сложных алгоритмах отрисовки или математике векторов: библиотека предоставляет готовые инструменты. Пит Шиннерс представил первую версию Pygame в 2000 году.
Библиотека помогает создавать игры для таких операционных систем, как Windows, macOS, Linux, Android. Pygame использует Simple DirectMedia Layer (SDL) — кроссплатформенную библиотеку для мультимедиа, которая позволяет использовать внешние устройства (мышь и клавиатуру). Pygame же, в свою очередь, упрощает работу с ними для разработчика, использующего Python.
По данным Stack Overflow за 2024 год, Python остаётся одним из самых популярных языков среди тех, кто только учится программировать.
Проекты на Python для начинающих
Теория важна, но настоящее понимание приходит через практику. Создание игр — лучший способ закрепить базовые навыки программирования.
Текстовая игра «Виселица»
«Виселица» — классическая игра для тренировки работы со строками, циклами и условиями. Компьютер загадывает слово, игрок угадывает буквы. Каждая ошибка приближает проигрыш, правильная догадка открывает символ в слове.
Вот полный код рабочей версии (пояснения к коду есть ниже):
import random
def choose_word():
words = ['программирование', 'компьютер', 'алгоритм', 'функция', 'переменная']
return random.choice(words)
def display_state(word, guessed_letters):
result = ''
for letter in word:
if letter in guessed_letters:
result += letter
else:
result += '_'
return result
def hangman_game():
word = choose_word()
guessed_letters = set()
attempts = 6
print("Добро пожаловать в игру 'Виселица'!")
while attempts > 0:
print(f"\nСлово: {display_state(word, guessed_letters)}")
print(f"Осталось попыток: {attempts}")
print(f"Использованные буквы: {', '.join(sorted(guessed_letters))}")
letter = input("Введите букву: ").lower()
if len(letter) != 1 or not letter.isalpha():
print("Введите одну букву!")
continue
if letter in guessed_letters:
print("Вы уже называли эту букву!")
continue
guessed_letters.add(letter)
if letter in word:
print("Правильно!")
if all(l in guessed_letters for l in word):
print(f"\nПоздравляем! Вы угадали слово: {word}")
break
else:
print("Неверно!")
attempts -= 1
if attempts == 0:
print(f"\nВы проиграли! Загаданное слово: {word}")
hangman_game()
Код использует функции для структурирования логики. choose_word() случайным образом выбирает загаданное слово из списка. display_state() показывает прогресс: открытые буквы отображаются, скрытые заменяются подчёркиваниями. Основной цикл while продолжается, пока у игрока остаются попытки. Условные конструкции проверяют корректность ввода, наличие буквы во множестве угаданных, присутствие буквы в загаданном слове.
Множество set() для хранения угаданных букв — оптимальное решение. Проверка вхождения элемента во множество работает мгновенно независимо от размера. Списки требуют перебора всех элементов, что замедляет программу при большом количестве попыток. Мелочь, но такие детали формируют культуру написания эффективного кода.
Графическая игра «Змейка» на Pygame
Игрок управляет змеёй стрелками клавиатуры, собирает еду, избегает столкновений со стенами и собственным телом. Код становится сложнее: появляется игровой цикл, обработка событий, отрисовка объектов, физика движения.
Полный код «Змейки» для запуска (пояснения к коду есть ниже):
import pygame
import random
pygame.init()
WIDTH = 600
HEIGHT = 400
BLOCK_SIZE = 20
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Змейка')
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 35)
def display_scores(scores):
text = font.render(f'Счёт: {scores}', True, WHITE)
display.blit(text, [10, 10])
def spawn_food():
x = random.randrange(0, WIDTH, BLOCK_SIZE)
y = random.randrange(0, HEIGHT, BLOCK_SIZE)
return [x, y]
def game():
x_snake = WIDTH // 2
y_snake = HEIGHT // 2
delta_x = BLOCK_SIZE
delta_y = 0
snake_body = []
snake_size = 1
food = spawn_food()
scores = 0
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and delta_x != BLOCK_SIZE:
delta_x = -BLOCK_SIZE
delta_y = 0
elif event.key == pygame.K_RIGHT and delta_x != -BLOCK_SIZE:
delta_x = BLOCK_SIZE
delta_y = 0
elif event.key == pygame.K_UP and delta_y != BLOCK_SIZE:
delta_y = -BLOCK_SIZE
delta_x = 0
elif event.key == pygame.K_DOWN and delta_y != -BLOCK_SIZE:
delta_y = BLOCK_SIZE
delta_x = 0
x_snake += delta_x
y_snake += delta_y
if x_snake >= WIDTH or x_snake < 0 or y_snake >= HEIGHT or y_snake < 0:
game_over = True
display.fill(BLACK)
pygame.draw.rect(display, RED, [food, food, BLOCK_SIZE, BLOCK_SIZE])
snake_head = [x_snake, y_snake]
snake_body.append(snake_head)
if len(snake_body) > snake_size:
del snake_body
for segment in snake_body[:-1]:
if segment == snake_head:
game_over = True
for segment in snake_body:
pygame.draw.rect(display, GREEN, [segment, segment, BLOCK_SIZE, BLOCK_SIZE])
display_scores(scores)
if x_snake == food and y_snake == food:
food = spawn_food()
snake_size += 1
scores += 10
pygame.display.update()
clock.tick(10)
pygame.quit()
quit()
game()
Структура игры строится вокруг бесконечного цикла while. Каждая итерация обрабатывает нажатия клавиш, обновляет позицию змейки, проверяет столкновения, перерисовывает экран. pygame.event.get() собирает все события: закрытие окна, нажатия клавиш, движения мыши. Условия if event.type == pygame.KEYDOWN распознают стрелки и меняют направление движения. Проверка delta_x == 0 предотвращает разворот змейки на 180 градусов — распространённую ошибку новичков.
Тело змейки хранится в списке координат. Каждый игровой кадр добавляет новую голову в список, а старый хвост удаляется. Когда змейка съедает еду, длина увеличивается — хвост не обрезается. Столкновение с собой определяется сравнением головы с остальными сегментами тела. Столкновение со стеной проверяется выходом координат за границы экрана.
Как создать простую игру «Змейка» на Pygame: пошаговая инструкция
Разберём создание «Змейки» детально. Каждый шаг открывает новую концепцию, которую вы сможете применять в других проектах. Следуйте инструкции последовательно, запускайте код после каждого этапа и наблюдайте. Такой подход формирует понимание архитектуры игр.
Шаг 1. Установка Pygame и создание окна
Перед написанием кода установите библиотеку. Откройте терминал или командную строку и выполните команду:
pip install pygame
Установка занимает несколько секунд. Если команда не работает, проверьте, что Python добавлен в PATH системы. На Windows используйте python -m pip install pygame, на macOS и Linux — python3 -m pip install pygame. После успешной установки создайте файл snake_game.py и напишите код (пояснения к коду увидите ниже):
import pygame
pygame.init()
WIDTH = 600
HEIGHT = 400
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Моя первая игра на Pygame')
started = True
while started:
for event in pygame.event.get():
if event.type == pygame.QUIT:
started = False
pygame.quit()
Запустите файл. На экране появится чёрное окно размером 600×400 пикселей. Закройте его крестиком — программа корректно завершится. Константы WIDTH и HEIGHT определяют размер игрового поля. pygame.init() инициализирует все модули библиотеки. pygame.display.set_mode() создаёт окно с заданными параметрами. pygame.display.set_caption() устанавливает заголовок окна.
Цикл while started — сердце любой игры на Pygame. Он работает непрерывно, обрабатывает события и обновляет экран. pygame.event.get() возвращает список всех событий с момента последней проверки. pygame. QUIT срабатывает при закрытии окна. Переменная started контролирует работу цикла: изменение её на False завершает программу. pygame.quit() корректно освобождает ресурсы.
Шаг 2. Игровой цикл и обработка событий
Добавим управление и обновление экрана. Модифицируйте код:
import pygame
pygame.init()
WIDTH = 600
HEIGHT = 400
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Управление')
clock = pygame.time.Clock()
x = WIDTH // 2
y = HEIGHT // 2
speed = 5
started = True
while started:
for event in pygame.event.get():
if event.type == pygame.QUIT:
started = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed
if keys[pygame.K_RIGHT]:
x += speed
if keys[pygame.K_UP]:
y -= speed
if keys[pygame.K_DOWN]:
y += speed
display.fill(BLACK)
pygame.draw.circle(display, WHITE, (x, y), 10)
pygame.display.update()
clock.tick(60)
pygame.quit()
Запустите программу. Белый круг появится в центре экрана. Стрелки клавиатуры двигают его в соответствующих направлениях. pygame.key.get_pressed() возвращает словарь состояний всех клавиш: нажата или отпущена. Проверка keys[pygame.K_LEFT] даёт True, если клавиша удерживается. Координаты x и y изменяются на величину speed при каждой итерации цикла.
display.fill(BLACK) закрашивает окно чёрным цветом перед отрисовкой нового кадра. Без этого предыдущие позиции круга останутся на экране — получится след. pygame.draw.circle() рисует круг с центром в точке (x, y) и радиусом 10 пикселей. pygame.display.update() выводит изменения на экран. clock.tick(60) ограничивает количество кадров в секунду значением 60 — игра работает плавно и стабильно.
Объект «часы» создан вызовом pygame.time.Clock(). Он контролирует частоту обновления игрового цикла. Без ограничения FPS программа потребляет максимум ресурсов процессора и работает с разной скоростью на разных компьютерах. Метод tick(60) вычисляет задержку между кадрами так, чтобы цикл выполнялся ровно 60 раз в секунду.
Шаг 3. Рисование змейки и еды
Заменим круг на змейку из квадратов и добавим еду. Обновлённый код:
import pygame
import random
pygame.init()
WIDTH = 600
HEIGHT = 400
BLOCK_SIZE = 20
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Змейка')
clock = pygame.time.Clock()
x_snake = WIDTH // 2
y_snake = HEIGHT // 2
snake_body = [[x_snake, y_snake]]
x_food = random.randrange(0, WIDTH, BLOCK_SIZE)
y_food = random.randrange(0, HEIGHT, BLOCK_SIZE)
started = True
while started:
for event in pygame.event.get():
if event.type == pygame.QUIT:
started = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x_snake -= BLOCK_SIZE
if keys[pygame.K_RIGHT]:
x_snake += BLOCK_SIZE
if keys[pygame.K_UP]:
y_snake -= BLOCK_SIZE
if keys[pygame.K_DOWN]:
y_snake += BLOCK_SIZE
snake_body.append([x_snake, y_snake])
if len(snake_body) > 3:
del snake_body
display.fill(BLACK)
pygame.draw.rect(display, RED, [x_food, y_food, BLOCK_SIZE, BLOCK_SIZE])
for segment in snake_body:
pygame.draw.rect(display, GREEN, [segment, segment, BLOCK_SIZE, BLOCK_SIZE])
pygame.display.update()
clock.tick(5)
pygame.quit()
Змейка состоит из зелёных квадратов размером 20×20 пикселей. Список snake_body хранит координаты всех сегментов. Каждый кадр добавляет новую голову с текущими координатами. Условие if len(snake_body) > 3 удаляет старый хвост, ограничивая длину тремя блоками. Еда появляется в случайной позиции, кратной BLOCK_SIZE, — так она выравнивается по сетке игрового поля.
random.randrange(0, WIDTH, BLOCK_SIZE) генерирует случайное число от 0 до WIDTH с шагом BLOCK_SIZE. Результат всегда кратен размеру блока: 0, 20, 40, 60 и т. д. Это гарантирует, что еда и змейка занимают целые клетки воображаемой сетки. Без выравнивания столкновения определялись бы неточно — змейка могла бы пройти сквозь еду или застрять в стене.
clock.tick(5) замедляет игру до 5 кадров в секунду. Змейка двигается медленно, давая время отреагировать на препятствия. В финальной версии скорость увеличится. Попробуйте изменить значение на 10 или 15 — почувствуете разницу. Баланс скорости влияет на сложность: слишком быстро — игра превращается в невыполнимую задачу, слишком медленно — становится скучной.
Шаг 4. Логика движения и столкновений
Финальный этап — автоматическое движение, увеличение длины при поедании, проверка столкновений. Завершённый код игры:
import pygame
import random
pygame.init()
WIDTH = 600
HEIGHT = 400
BLOCK_SIZE = 20
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Змейка')
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 35)
def display_scores(scores):
text = font.render(f'Счёт: {scores}', True, WHITE)
display.blit(text, [10, 10])
def spawn_food():
x = random.randrange(0, WIDTH, BLOCK_SIZE)
y = random.randrange(0, HEIGHT, BLOCK_SIZE)
return [x, y]
def game():
x_snake = WIDTH // 2
y_snake = HEIGHT // 2
delta_x = BLOCK_SIZE
delta_y = 0
snake_body = []
snake_size = 1
food = spawn_food()
scores = 0
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and delta_x != BLOCK_SIZE:
delta_x = -BLOCK_SIZE
delta_y = 0
elif event.key == pygame.K_RIGHT and delta_x != -BLOCK_SIZE:
delta_x = BLOCK_SIZE
delta_y = 0
elif event.key == pygame.K_UP and delta_y != BLOCK_SIZE:
delta_y = -BLOCK_SIZE
delta_x = 0
elif event.key == pygame.K_DOWN and delta_y != -BLOCK_SIZE:
delta_y = BLOCK_SIZE
delta_x = 0
x_snake += delta_x
y_snake += delta_y
if x_snake >= WIDTH or x_snake < 0 or y_snake >= HEIGHT or y_snake < 0:
game_over = True
display.fill(BLACK)
pygame.draw.rect(display, RED, [food, food, BLOCK_SIZE, BLOCK_SIZE])
snake_head = [x_snake, y_snake]
snake_body.append(snake_head)
if len(snake_body) > snake_size:
del snake_body
for segment in snake_body[:-1]:
if segment == snake_head:
game_over = True
for segment in snake_body:
pygame.draw.rect(display, GREEN, [segment, segment, BLOCK_SIZE, BLOCK_SIZE])
display_scores(scores)
if x_snake == food and y_snake == food:
food = spawn_food()
snake_size += 1
scores += 10
pygame.display.update()
clock.tick(10)
pygame.quit()
quit()
game()
Змейка движется автоматически. Переменные delta_x и delta_y хранят направление движения. Каждый кадр координаты головы увеличиваются на эти значения. Стрелки клавиатуры меняют направление, но не позволяют развернуться на 180 градусов: условие delta_x != BLOCK_SIZE блокирует движение влево, если змейка ползёт вправо. Без этой проверки голова мгновенно столкнётся с первым сегментом тела — игра завершится.
Столкновение со стеной определяется выходом координат за границы экрана. Условие x_snake >= WIDTH or x_snake < 0 проверяет горизонтальные края, y_snake >= HEIGHT or y_snake < 0 — вертикальные. Столкновение с собой находится циклом: каждый сегмент тела сравнивается с головой. Срез snake_body[:-1] исключает последний элемент — саму голову, — иначе условие всегда истинно.
Поедание еды увеличивает счёт и длину змейки. Проверка x_snake == food and y_snake == food определяет совпадение координат. После поедания вызывается spawn_food() для генерации новой цели. Длина увеличивается на 1 — следующий кадр не удалит хвост, змейка станет длиннее на один блок. Счёт отображается в левом верхнем углу функцией display_scores().
Какие ещё игры можно создать на Python с помощью Pygame
Для создания новых игр или проверки ошибок в коде вы можете использовать ИИ. Нейросеть может самостоятельно написать весь код по вашей идее или предложить изменения в имеющийся.
Освоив «Змейку», вы получили фундамент для более сложных проектов. Pygame открывает широкий спектр жанров: от аркад до головоломок. Каждая новая игра добавляет уникальные механики, углубляет понимание разработки, а ещё развивает логическое мышление, креативность и изобретательность.
- Понг — два игрока управляют ракетками, отбивают мяч. Логика проще, чем в «Змейке»: движение двух объектов, отскок мяча от стен и ракеток, счёт очков. Добавляется элемент соревнования — игра для двух человек за одной клавиатурой или против компьютерного противника с примитивным ИИ-мышлением.
- Тетрис усложняет задачу. Фигуры падают сверху, игрок вращает и двигает их. Заполненные линии исчезают, скорость растёт. Вам придётся работать с двумерными массивами для игрового поля, определять столкновения фигур, реализовывать вращение с проверкой границ. Проект научит думать о структурах данных и алгоритмах обработки сетки.
- Платформер в стиле Super Mario требует физики прыжков, гравитации, обнаружения коллизий с платформами. Персонаж движется горизонтально, прыгает на блоки, собирает монеты, избегает врагов. Pygame не предоставляет встроенный физический движок, поэтому вы напишете простую систему: ускорение, скорость, позиция.
- Flappy Bird — минималистичная аркада, где птица падает под действием гравитации, а клик мыши поднимает её вверх. Трубы двигаются справа налево, игрок пролетает между ними. Простота обманчива: балансировка сложности, точное определение столкновений, плавность анимации требуют аккуратности. Зато игра создаётся за пару часов.
- Лабиринт-головоломка. Персонаж движется по коридорам, ищет выход, собирает ключи. Уровни создаются через двумерные массивы: 1 — стена, 0 — проход. Вы научитесь загружать уровни из файлов, проверять проходимость клеток, реализовывать условия победы.
Независимые разработчики составляют значительную долю рынка, многие начинали именно с простых проектов на доступных инструментах вроде Pygame. Возможно, ваша первая «Змейка» — не просто учебное упражнение, а фундамент для потенциальной карьеры разработчика игр.









