Создаем крестики-нолики в Pygame: основы и пошаговая инструкция

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Новички в программировании, заинтересованные в разработке игр на 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. Это простой шаг экономит часы разочарования и помогает начать с правильной ноты. Еще один совет — создавайте отдельное виртуальное окружение для каждого игрового проекта, чтобы избежать конфликтов между версиями библиотек.

Python
Скопировать код
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.

Вот минимальный код для создания игрового окна:

Python
Скопировать код
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

Игровой цикл — сердце любой игры. Он состоит из трёх ключевых этапов: ⏱️

  1. Обработка ввода — отслеживание действий игрока и системных событий
  2. Обновление состояния игры — изменение положения объектов, проверка коллизий и т.д.
  3. Отрисовка — обновление изображения на экране

Для контроля скорости игры (FPS – кадры в секунду) используйте объект Clock:

Python
Скопировать код
clock = pygame.time.Clock()

# В игровом цикле
clock.tick(60) # Ограничение до 60 FPS

Это гарантирует, что игра будет работать с одинаковой скоростью на разных компьютерах.

Управление персонажем и обработка событий

Интерактивность — ключевой элемент любой игры. В Pygame управление персонажами и объектами реализуется через систему обработки событий и состояний клавиш.

Рассмотрим пример создания простого персонажа, который двигается с помощью клавиш WASD:

Python
Скопировать код
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 Возникает при отпускании клавиши

Пример обработки клика мыши:

Python
Скопировать код
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 предоставляет инструменты для загрузки, трансформации и отображения графики.

Вот как загрузить и отобразить изображение:

Python
Скопировать код
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% в моём проекте с множеством однотипных врагов.

Для создания анимации нужно последовательно менять отображаемые изображения. Вот пример простой анимации ходьбы: 🚶

Python
Скопировать код
# Загрузка фреймов анимации
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. Это отличный первый проект, который объединяет все изученные концепции.

Вот полный код игры "Крестики-нолики":

Python
Скопировать код
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()

Этот код создает полноценную игру "Крестики-нолики" с графическим интерфейсом. Давайте разберем основные компоненты:

  1. Инициализация и настройка — устанавливаем размеры окна, цвета и создаем игровую доску
  2. Отрисовка игрового поля — функция draw_lines() рисует сетку игрового поля
  3. Отрисовка фигур — функция draw_figures() отображает крестики и нолики
  4. Проверка победителя — функция check_winner() проверяет все возможные комбинации для победы
  5. Игровой цикл — обрабатывает клики игроков, обновляет состояние игры и отрисовывает изменения

Что можно улучшить в этом проекте: ⚡

  • Добавить звуковые эффекты при ходе и победе
  • Реализовать простой ИИ для игры против компьютера
  • Добавить меню и счетчик побед
  • Реализовать анимацию при размещении крестика или нолика

Этот проект демонстрирует, как можно применить изученные концепции Pygame для создания полноценной игры. Он также служит отличной основой для дальнейшего изучения и экспериментов.

Создание собственной игры — это только начало вашего пути в разработке. Pygame предлагает богатую экосистему для реализации ваших творческих идей, от аркад до стратегий. Ключевой принцип успешной разработки — итерация. Не пытайтесь сразу создать шедевр. Начните с малого, добавляйте функциональность постепенно, тестируйте каждое изменение. И помните: каждая ошибка — это возможность научиться чему-то новому. Теперь у вас есть все необходимые инструменты, чтобы воплотить в жизнь свою игровую идею. Код — ваш холст, воображение — единственный предел.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое Pygame?
1 / 5

Загрузка...