Как создавать игры на Python: от концепции до готового продукта

Раздел: Разработка на Python -> Игры

Основные подходы к разработке игр на Python

Как создать игру с помощью Pygame?

Pygame - наиболее популярная библиотека для 2D-игр на Python. Она предоставляет инструменты для графики, звука, ввода с клавиатуры и мыши. Установка выполняется командой pip install pygame.


import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
x, y = 400, 300
speed = 5

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    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
    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 0, 0), (x, y, 50, 50))
    pygame.display.flip()
    clock.tick(60)
  

игра угадай число на python (игра «угадай число» на python)

Пояснение: инициализация модулей, создание окна, главный цикл с обработкой событий, чтение состояния клавиш, рисование прямоугольника, обновление экрана и поддержание 60 FPS.

Типичные ошибки:

  • Пропуск pygame.init() приводит к сбою при создании окна.
  • Игнорирование pygame.QUIT не даёт закрыть окно.
  • Неправильный порядок pygame.display.flip() и clock.tick() может снизить производительность.

Цель использования: прототипирование и создание полноценных 2D-игр с полным контролем над каждым кадром.

Как упростить разработку 2D-игры с помощью Arcade?

Arcade построена поверх Pyglet и предлагает высокоуровневый API для спрайтов, физики, анимации. Установка: pip install arcade.


import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

class MyGame(arcade.Window):
    def __init__(self):
        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, "My Game")
        self.circle_x = 400
        self.circle_y = 300

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.circle_x, self.circle_y, 20, arcade.color.BLUE)

    def update(self, delta_time):
        self.circle_x += 1   # движение круга вправо

game = MyGame()
arcade.run()
  

Python games py (создание игр на python)

Класс наследуется от arcade.Window, методы on_draw и update вызываются автоматически.

Проблемы и их решения:

  • Arcade не поддерживается на Python 3.13 (проверяйте совместимость). Используйте Python 3.10–3.11.
  • При большом количестве спрайтов возможны тормоза. Решение - объединять спрайты в атласы или использовать arcade.SpriteList с пространственной индексацией.

Когда применять: когда нужно быстро создать 2D-игру с готовой физикой и автоматическим управлением спрайтами.

Как сделать ретро-игру с пиксельной графикой?

Pyxel имитирует старые консоли с ограниченной палитрой (16 цветов). Установка: pip install pyxel.


import pyxel

pyxel.init(160, 120, title="Hello Pyxel")
pyxel.cls(0)

def update():
    if pyxel.btnp(pyxel.KEY_Q):
        pyxel.quit()

def draw():
    pyxel.cls(0)
    pyxel.rect(10, 10, 20, 20, 7)

pyxel.run(update, draw)
  

Разрешение экрана 160×120, цвет задаётся индексом палитры. Вызов pyxel.run запускает цикл с функциями update и draw.

Типичные ошибки:

  • Использование цветов вне диапазона 0–15 приведёт к ошибке.
  • Забыть вызвать pyxel.cls(0) перед рисованием - на экране остаются артефакты предыдущего кадра.

Идеально подходит для геймджемов, ретро-стилей и обучения основам игрового цикла.

Как реализовать текстовую игру без графики?

Для консольных приключенческих игр достаточно стандартного ввода–вывода Python.


import random

def guess_number():
    number = random.randint(1, 100)
    attempts = 0
    print("Угадай число от 1 до 100")
    while True:
        guess = input("Твой вариант: ")
        if not guess.isdigit():
            print("Введи целое число!")
            continue
        guess = int(guess)
        attempts += 1
        if guess < number:
            print("Больше!")
        elif guess > number:
            print("Меньше!")
        else:
            print(f"Поздравляю! Угадал за {attempts} попыток")
            break

guess_number()
  

Цикл запрашивает ввод, проверяет корректность, даёт подсказки.

Проблемы:

  • Пользователь может ввести не число - обрабатывайте исключения.
  • Отсутствие графики ограничивает жанры, но такие игры легко портировать.

Подходит для обучения логике, быстрого прототипирования или создания текстовых квестов.

Как создать 3D-игру с помощью Pyglet и OpenGL?

Pyglet предоставляет прямой доступ к OpenGL, но требует знаний 3D-графики. Установка: pip install pyglet.


import pyglet
from pyglet.gl import *

window = pyglet.window.Window(width=800, height=600, caption="3D")

@window.event
def on_draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glBegin(GL_TRIANGLES)
    glVertex2f(-0.5, -0.5)
    glVertex2f(0.5, -0.5)
    glVertex2f(0.0, 0.5)
    glEnd()

pyglet.app.run()
  

Рисуется треугольник с использованием фиксированного конвейера OpenGL.

Сложности:

  • Необходимость знания OpenGL - высокая кривая обучения.
  • Управление памятью (VAO, VBO) вручную.

Рекомендуется для опытных разработчиков, желающих полный контроль над 3D-рендерингом.

Расширенные примеры игровых проектов

Игра «Змейка» на Pygame

Реализуем классическую игру с использованием спрайтов и коллизий.

Пример

import pygame
import sys
import random

pygame.init()

WIDTH, HEIGHT = 600, 400
CELL_SIZE = 20
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
font = pygame.font.SysFont('Arial', 24)

# Начальное положение и направление
snake = [(WIDTH//2, HEIGHT//2)]
direction = (CELL_SIZE, 0)  # движение вправо

# Еда
food = (random.randrange(0, WIDTH, CELL_SIZE), random.randrange(0, HEIGHT, CELL_SIZE))

score = 0
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and direction != (0, CELL_SIZE):
                direction = (0, -CELL_SIZE)
            elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):
                direction = (0, CELL_SIZE)
            elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):
                direction = (-CELL_SIZE, 0)
            elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):
                direction = (CELL_SIZE, 0)

    # Движение змейки
    head = snake[0]
    new_head = (head[0] + direction[0], head[1] + direction[1])
    
    # Проверка столкновения со стенами
    if new_head[0] < 0 or new_head[0] >= WIDTH or new_head[1] < 0 or new_head[1] >= HEIGHT:
        running = False
        continue
    
    # Проверка столкновения с собой
    if new_head in snake:
        running = False
        continue
    
    snake.insert(0, new_head)
    
    # Проверка еды
    if new_head == food:
        score += 1
        food = (random.randrange(0, WIDTH, CELL_SIZE), random.randrange(0, HEIGHT, CELL_SIZE))
    else:
        snake.pop()
    
    # Отрисовка
    screen.fill((0, 0, 0))
    for segment in snake:
        pygame.draw.rect(screen, (0, 255, 0), (segment[0], segment[1], CELL_SIZE, CELL_SIZE))
    pygame.draw.circle(screen, (255, 0, 0), (food[0] + CELL_SIZE//2, food[1] + CELL_SIZE//2), CELL_SIZE//2)
    score_text = font.render(f"Score: {score}", True, (255, 255, 255))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(10)  # 10 кадров в секунду

pygame.quit()
sys.exit()
Результат: окно с змейкой, управляемой стрелками, поедание красных кружков увеличивает длину и счёт, при столкновении игра завершается.

Пример анимации спрайтов с помощью Arcade и спрайт-листа

Используем готовый лист с кадрами персонажа для создания плавной анимации ходьбы.

Пример

import arcade

SPRITE_SCALING = 0.5

class Player(arcade.Sprite):
    def __init__(self, filename, spritesheet_rows, spritesheet_cols):
        super().__init__(filename, SPRITE_SCALING)
        self.textures = []
        # Загружаем все кадры из спрайт-листа (предполагается PNG с сеткой)
        for row in range(spritesheet_rows):
            for col in range(spritesheet_cols):
                texture = arcade.load_texture(
                    filename,
                    x=col * 64,
                    y=row * 64,
                    width=64,
                    height=64
                )
                self.textures.append(texture)
        self.texture = self.textures[0]
        self.current_frame = 0

    def update_animation(self, delta_time):
        self.current_frame += 1
        if self.current_frame >= len(self.textures):
            self.current_frame = 0
        self.texture = self.textures[self.current_frame]

# В главном окне можно добавить Player и вызывать update_animation
Результат: персонаж циклически меняет текстуру, создавая иллюзию движения.

Генерация уровня из текстового файла

Текстовый файл (например, level.txt) содержит строки, где каждый символ обозначает элемент: '#' - стена, '.' - пустота, 'P' - игрок.

Пример

def load_level(filename):
    with open(filename, 'r') as f:
        level = [list(line.strip()) for line in f if line.strip()]
    return level

level = load_level("level.txt")
# В игровом цикле можно обходить level и рисовать соответствующие спрайты.
Результат: структура уровня загружается из файла, что упрощает редактирование карт без переписывания кода.

Создание игр на Python - comments

En
Python games py (python)