Создаем крестики-нолики в Pygame: основы и пошаговая инструкция
Для кого эта статья:
- Новички в программировании, заинтересованные в разработке игр на Python
- Студенты и самоучки, стремящиеся изучить библиотеку Pygame
Люди, желающие превратить увлечение программированием в профессию
Путь от первого запуска Pygame до полноценной игры часто кажется головокружительным для новичков. Библиотека Pygame — мощный инструмент, открывающий двери в мир разработки игр на Python, но только если знаешь, с чего начать и как структурировать код. Я проведу вас через этот процесс, шаг за шагом объясняя каждый элемент: от установки библиотеки до создания интерактивной игры в крестики-нолики. Пять лет назад я сам начинал с нуля — теперь готов поделиться проверенным маршрутом, который избавит вас от часов бесцельного блуждания по документации. 🎮
Хотите не просто создавать игры, но превратить программирование в профессию? Обучение Python-разработке от Skypro даст вам структурированные знания, выходящие далеко за рамки игровой разработки. Вы освоите не только Pygame, но и другие востребованные инструменты, изучите веб-разработку и создание серверной части приложений под руководством действующих разработчиков. Превратите увлечение в карьеру уже через 9 месяцев!
Основы Pygame: установка и первый запуск
Pygame — это библиотека, созданная для упрощения разработки игр с использованием Python. Первый шаг в вашем игровом проекте — правильная установка и настройка среды разработки.
Установка Pygame выполняется простой командой через pip — менеджер пакетов Python:
- Откройте командную строку или терминал
- Введите команду: pip install pygame
- Дождитесь завершения установки
После установки стоит проверить работоспособность библиотеки. Создайте новый Python-файл с простейшим кодом для проверки:
- Создайте файл test_pygame.py
- Добавьте следующий код:
Александр Волков, преподаватель программирования
Когда я впервые начал обучать студентов Pygame, многие застревали уже на этапе установки. Один студент потратил целую неделю, пытаясь понять, почему его код не работает. Оказалось, что он установил Pygame в одно виртуальное окружение, а запускал код в другом. Теперь я всегда рекомендую проверять версию библиотеки после установки командой
pygame.version.ver. Это простой шаг экономит часы разочарования и помогает начать с правильной ноты. Еще один совет — создавайте отдельное виртуальное окружение для каждого игрового проекта, чтобы избежать конфликтов между версиями библиотек.
import pygame
pygame.init()
print("Pygame успешно инициализирован!")
print(f"Версия Pygame: {pygame.version.ver}")
pygame.quit()
Если вы видите сообщение об успешной инициализации и версию Pygame, значит установка прошла успешно, и вы готовы двигаться дальше. 🎯
| Функция Pygame | Назначение | Пример использования |
|---|---|---|
| pygame.init() | Инициализирует все модули Pygame | pygame.init() |
| pygame.quit() | Завершает работу всех модулей Pygame | pygame.quit() |
| pygame.display.set_mode() | Создает игровое окно заданного размера | screen = pygame.display.set_mode((800, 600)) |
| pygame.display.set_caption() | Устанавливает заголовок окна | pygame.display.set_caption("Моя игра") |
Перед тем как двигаться дальше, убедитесь, что у вас установлена актуальная версия Python (3.6 или выше) для лучшей совместимости с Pygame. Также полезно ознакомиться с базовыми элементами библиотеки, которые вы будете использовать в своем первом проекте.

Создание игрового окна и главного цикла
Игровое окно — это холст, на котором разворачивается вся игровая логика. Создание окна и настройка игрового цикла — фундамент любой игры на Pygame.
Вот минимальный код для создания игрового окна:
import pygame
# Инициализация Pygame
pygame.init()
# Константы для размеров окна
WIDTH = 800
HEIGHT = 600
# Создание игрового окна
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Моя первая игра на Pygame")
# Основной игровой цикл
running = True
while running:
# Обработка событий
for event in pygame.event.get():
# Проверка на выход из игры
if event.type == pygame.QUIT:
running = False
# Заливка экрана цветом (RGB)
screen.fill((0, 0, 0)) # Черный цвет
# Обновление экрана
pygame.display.flip()
# Выход из Pygame
pygame.quit()
Основные элементы этого кода:
- pygame.init() — инициализация всех модулей Pygame
- pygame.display.set_mode() — создание окна с указанными размерами
- игровой цикл (while running) — главный механизм игры, который выполняется до завершения
- обработка событий — перехват действий пользователя и системных событий
- pygame.display.flip() — обновление содержимого экрана
- pygame.quit() — корректное завершение работы Pygame
Игровой цикл — сердце любой игры. Он состоит из трёх ключевых этапов: ⏱️
- Обработка ввода — отслеживание действий игрока и системных событий
- Обновление состояния игры — изменение положения объектов, проверка коллизий и т.д.
- Отрисовка — обновление изображения на экране
Для контроля скорости игры (FPS – кадры в секунду) используйте объект Clock:
clock = pygame.time.Clock()
# В игровом цикле
clock.tick(60) # Ограничение до 60 FPS
Это гарантирует, что игра будет работать с одинаковой скоростью на разных компьютерах.
Управление персонажем и обработка событий
Интерактивность — ключевой элемент любой игры. В Pygame управление персонажами и объектами реализуется через систему обработки событий и состояний клавиш.
Рассмотрим пример создания простого персонажа, который двигается с помощью клавиш WASD:
import pygame
pygame.init()
# Настройки окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Управление персонажем")
# Настройки персонажа
player_size = 50
player_x = WIDTH // 2 – player_size // 2
player_y = HEIGHT // 2 – player_size // 2
player_speed = 5
# Цвета (RGB)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
# Игровой цикл
clock = pygame.time.Clock()
running = True
while running:
# Ограничение FPS
clock.tick(60)
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Получение состояния всех клавиш
keys = pygame.key.get_pressed()
# Управление персонажем
if keys[pygame.K_a] and player_x > 0:
player_x -= player_speed
if keys[pygame.K_d] and player_x < WIDTH – player_size:
player_x += player_speed
if keys[pygame.K_w] and player_y > 0:
player_y -= player_speed
if keys[pygame.K_s] and player_y < HEIGHT – player_size:
player_y += player_speed
# Отрисовка
screen.fill(WHITE) # Заливка фона
pygame.draw.rect(screen, RED, (player_x, player_y, player_size, player_size)) # Рисуем персонажа
# Обновление экрана
pygame.display.flip()
pygame.quit()
В этом примере мы создали квадратного персонажа, который перемещается по экрану с помощью клавиш WASD. Обратите внимание на следующие ключевые моменты:
- Использование pygame.key.get_pressed() для получения состояния всех клавиш
- Проверка границ экрана, чтобы персонаж не выходил за его пределы
- Отрисовка персонажа как простого прямоугольника с помощью pygame.draw.rect()
Помимо клавиатуры, Pygame позволяет обрабатывать события мыши. Вот основные типы событий, с которыми вы можете работать: 🖱️
| Тип события | Константа Pygame | Описание |
|---|---|---|
| Клик мыши | pygame.MOUSEBUTTONDOWN | Возникает при нажатии кнопки мыши |
| Отпускание кнопки мыши | pygame.MOUSEBUTTONUP | Возникает при отпускании кнопки мыши |
| Движение мыши | pygame.MOUSEMOTION | Возникает при перемещении курсора мыши |
| Нажатие клавиши | pygame.KEYDOWN | Возникает при нажатии клавиши на клавиатуре |
| Отпускание клавиши | pygame.KEYUP | Возникает при отпускании клавиши |
Пример обработки клика мыши:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
# Получение координат клика
mouse_x, mouse_y = pygame.mouse.get_pos()
print(f"Клик по координатам: {mouse_x}, {mouse_y}")
Для более сложного управления персонажем можно использовать векторы и физику движения, но для начала достаточно простого перемещения с постоянной скоростью.
Работа с графикой и анимацией в Pygame
Использование изображений и анимаций превращает простые фигуры в привлекательные игровые объекты. Pygame предоставляет инструменты для загрузки, трансформации и отображения графики.
Вот как загрузить и отобразить изображение:
import pygame
import os # Для работы с путями к файлам
pygame.init()
# Настройки окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Работа с графикой")
# Загрузка изображения
# Предполагается, что изображение находится в папке 'images'
current_dir = os.path.dirname(os.path.abspath(__file__))
image_path = os.path.join(current_dir, 'images', 'character.png')
character_image = pygame.image.load(image_path).convert_alpha() # convert_alpha сохраняет прозрачность
# Изменение размера изображения (если необходимо)
character_image = pygame.transform.scale(character_image, (100, 100))
# Начальная позиция
character_x = WIDTH // 2 – character_image.get_width() // 2
character_y = HEIGHT // 2 – character_image.get_height() // 2
# Игровой цикл
clock = pygame.time.Clock()
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Отрисовка
screen.fill((255, 255, 255)) # Белый фон
screen.blit(character_image, (character_x, character_y)) # Отображение изображения на экране
pygame.display.flip()
pygame.quit()
Ключевые функции для работы с изображениями:
- pygame.image.load() — загрузка изображения с диска
- .convert() или .convert_alpha() — оптимизация изображения для быстрой отрисовки
- pygame.transform.scale() — изменение размера изображения
- screen.blit() — отображение изображения на поверхности (например, экране)
Марина Соколова, разработчик игр
Когда я создавала свою первую игру на Pygame, я столкнулась с проблемой тормозящей анимации. Все фреймы загружались во время игры, что создавало заметные задержки. Решением стала предварительная загрузка всех фреймов анимации при запуске игры. Я создала словарь с анимациями для разных действий персонажа — ходьбы, прыжка, атаки. Каждая анимация представляла собой список предзагруженных изображений. Это увеличивало время запуска игры примерно на секунду, но полностью устраняло лаги во время игрового процесса. Дополнительно я реализовала кеширование спрайтов — если два объекта использовали одинаковые изображения, они загружались только один раз. Это уменьшило использование памяти на 40% в моём проекте с множеством однотипных врагов.
Для создания анимации нужно последовательно менять отображаемые изображения. Вот пример простой анимации ходьбы: 🚶
# Загрузка фреймов анимации
animation_frames = []
for i in range(1, 9): # Предполагается, что у нас есть 8 кадров: walk1.png, walk2.png, ... walk8.png
frame_path = os.path.join(current_dir, 'images', f'walk{i}.png')
frame = pygame.image.load(frame_path).convert_alpha()
animation_frames.append(frame)
# В игровом цикле
current_frame = 0
animation_speed = 0.2 # Скорость смены кадров (в секундах)
animation_timer = 0
while running:
# Получаем время, прошедшее с предыдущего кадра
dt = clock.tick(60) / 1000 # Преобразуем миллисекунды в секунды
# Обновление анимации
animation_timer += dt
if animation_timer >= animation_speed:
animation_timer = 0
current_frame = (current_frame + 1) % len(animation_frames)
# Отрисовка текущего кадра
screen.fill((255, 255, 255))
screen.blit(animation_frames[current_frame], (character_x, character_y))
pygame.display.flip()
Для организации более сложных анимаций рекомендуется использовать спрайт-листы — изображения, содержащие все кадры анимации в одном файле. Это уменьшает количество загружаемых файлов и упрощает управление ресурсами.
Полноценный проект: крестики-нолики на Pygame
Теперь, когда мы изучили основы, давайте создадим полноценную игру "Крестики-нолики" с графическим интерфейсом, используя Pygame. Это отличный первый проект, который объединяет все изученные концепции.
Вот полный код игры "Крестики-нолики":
import pygame
import sys
# Инициализация Pygame
pygame.init()
# Константы
WIDTH, HEIGHT = 450, 450
LINE_WIDTH = 15
BOARD_ROWS, BOARD_COLS = 3, 3
SQUARE_SIZE = WIDTH // BOARD_COLS
CIRCLE_RADIUS = SQUARE_SIZE // 3
CIRCLE_WIDTH = 15
CROSS_WIDTH = 25
SPACE = SQUARE_SIZE // 4
# Цвета
BG_COLOR = (28, 170, 156)
LINE_COLOR = (23, 145, 135)
CIRCLE_COLOR = (239, 231, 200)
CROSS_COLOR = (66, 66, 66)
# Настройка экрана
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Крестики-нолики')
screen.fill(BG_COLOR)
# Игровая доска: 0 – пусто, 1 – крестик, 2 – нолик
board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
player = 1 # Начинает игрок с крестиком
# Рисуем линии игрового поля
def draw_lines():
# Горизонтальные линии
pygame.draw.line(screen, LINE_COLOR, (0, SQUARE_SIZE), (WIDTH, SQUARE_SIZE), LINE_WIDTH)
pygame.draw.line(screen, LINE_COLOR, (0, 2 * SQUARE_SIZE), (WIDTH, 2 * SQUARE_SIZE), LINE_WIDTH)
# Вертикальные линии
pygame.draw.line(screen, LINE_COLOR, (SQUARE_SIZE, 0), (SQUARE_SIZE, HEIGHT), LINE_WIDTH)
pygame.draw.line(screen, LINE_COLOR, (2 * SQUARE_SIZE, 0), (2 * SQUARE_SIZE, HEIGHT), LINE_WIDTH)
# Рисуем крестики и нолики
def draw_figures():
for row in range(BOARD_ROWS):
for col in range(BOARD_COLS):
if board[row][col] == 1:
# Крестик
pygame.draw.line(screen, CROSS_COLOR,
(col * SQUARE_SIZE + SPACE, row * SQUARE_SIZE + SPACE),
((col + 1) * SQUARE_SIZE – SPACE, (row + 1) * SQUARE_SIZE – SPACE),
CROSS_WIDTH)
pygame.draw.line(screen, CROSS_COLOR,
((col + 1) * SQUARE_SIZE – SPACE, row * SQUARE_SIZE + SPACE),
(col * SQUARE_SIZE + SPACE, (row + 1) * SQUARE_SIZE – SPACE),
CROSS_WIDTH)
elif board[row][col] == 2:
# Нолик
pygame.draw.circle(screen, CIRCLE_COLOR,
(int(col * SQUARE_SIZE + SQUARE_SIZE // 2),
int(row * SQUARE_SIZE + SQUARE_SIZE // 2)),
CIRCLE_RADIUS, CIRCLE_WIDTH)
# Проверка на победителя
def check_winner():
# Проверка по горизонтали
for row in range(BOARD_ROWS):
if board[row][0] == board[row][1] == board[row][2] != 0:
return board[row][0]
# Проверка по вертикали
for col in range(BOARD_COLS):
if board[0][col] == board[1][col] == board[2][col] != 0:
return board[0][col]
# Проверка по диагонали (сверху слева вниз вправо)
if board[0][0] == board[1][1] == board[2][2] != 0:
return board[0][0]
# Проверка по диагонали (сверху справа вниз влево)
if board[0][2] == board[1][1] == board[2][0] != 0:
return board[0][2]
# Проверка на ничью
is_board_full = True
for row in range(BOARD_ROWS):
for col in range(BOARD_COLS):
if board[row][col] == 0:
is_board_full = False
break
if is_board_full:
return 'tie' # Ничья
return None # Игра продолжается
# Основной игровой цикл
draw_lines()
game_over = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
mouseX = event.pos[0] # x координата
mouseY = event.pos[1] # y координата
# Определяем, в какую клетку кликнули
clicked_row = mouseY // SQUARE_SIZE
clicked_col = mouseX // SQUARE_SIZE
# Если клетка пуста – ставим фигуру
if board[clicked_row][clicked_col] == 0:
board[clicked_row][clicked_col] = player
# Проверка на победителя после хода
winner = check_winner()
if winner:
game_over = True
# Смена игрока
player = 1 if player == 2 else 2
# Перерисовка игровых объектов
draw_figures()
# Возможность перезапустить игру после завершения
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
screen.fill(BG_COLOR)
draw_lines()
player = 1
board = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
game_over = False
pygame.display.update()
Этот код создает полноценную игру "Крестики-нолики" с графическим интерфейсом. Давайте разберем основные компоненты:
- Инициализация и настройка — устанавливаем размеры окна, цвета и создаем игровую доску
- Отрисовка игрового поля — функция draw_lines() рисует сетку игрового поля
- Отрисовка фигур — функция draw_figures() отображает крестики и нолики
- Проверка победителя — функция check_winner() проверяет все возможные комбинации для победы
- Игровой цикл — обрабатывает клики игроков, обновляет состояние игры и отрисовывает изменения
Что можно улучшить в этом проекте: ⚡
- Добавить звуковые эффекты при ходе и победе
- Реализовать простой ИИ для игры против компьютера
- Добавить меню и счетчик побед
- Реализовать анимацию при размещении крестика или нолика
Этот проект демонстрирует, как можно применить изученные концепции Pygame для создания полноценной игры. Он также служит отличной основой для дальнейшего изучения и экспериментов.
Создание собственной игры — это только начало вашего пути в разработке. Pygame предлагает богатую экосистему для реализации ваших творческих идей, от аркад до стратегий. Ключевой принцип успешной разработки — итерация. Не пытайтесь сразу создать шедевр. Начните с малого, добавляйте функциональность постепенно, тестируйте каждое изменение. И помните: каждая ошибка — это возможность научиться чему-то новому. Теперь у вас есть все необходимые инструменты, чтобы воплотить в жизнь свою игровую идею. Код — ваш холст, воображение — единственный предел.
Читайте также
- Создаём игры на Python с Tkinter: от крестиков-ноликов до змейки
- Разработка игр на Python: от базовой механики до полноценных проектов
- Топ-5 библиотек Python для разработки игр: от 2D до 3D проектов
- Python для 3D игр: возможности, ограничения, практические решения
- Игровая графика на Python: библиотеки и техники для новичков
- Python для разработки игр: возможности, преимущества, примеры
- Создаем гоночную игру на Python: от базового шаблона до финала
- Python для разработки онлайн-игр: архитектура, протоколы и инструменты
- Топ-7 игровых движков на Python: какой выбрать разработчику
- Разработка игр на Python: лучшие книги, курсы и инструменты