Как создать игру «Тетрис» на Python?

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Как создать игру «Тетрис» на Python? Полное руководство с исходным кодом

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

В этом гайде мы разберём, как создать полноценную игру «Тетрис» на Python с помощью библиотеки Pygame. Вы получите подробный разбор всех этапов разработки и готовый рабочий код.


📌 Что вам понадобится?

  • Python 3.x

  • Библиотека Pygame (для отрисовки графики и обработки событий)

📚 Установка Pygame:

bash
pip install pygame

Этапы разработки Тетриса на Python

  1. Инициализация окна и игрового поля

  2. Определение фигур и их форм

  3. Реализация механики падения фигур

  4. Проверка столкновений и границ

  5. Удаление заполненных линий

  6. Управление пользователем (движение, вращение)

  7. Добавление экрана Game Over и счётчика очков


Шаг 1. Импорт необходимых модулей и настройка окна

python

import pygame
import random

# Инициализация Pygame
pygame.init()

# Размеры окна и сетки
SCREEN_WIDTH = 300
SCREEN_HEIGHT = 600
BLOCK_SIZE = 30

# Цвета
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
COLORS = [
    (0, 255, 255),  # I
    (255, 165, 0),  # L
    (0, 0, 255),    # J
    (255, 255, 0),  # O
    (0, 255, 0),    # S
    (128, 0, 128),  # T
    (255, 0, 0)     # Z
]

# Настройка окна
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Тетрис на Python")


Шаг 2. Определяем формы фигур Тетриса

python
FIGURES = [
    [[1, 1, 1, 1]],  # I
    [[1, 0, 0],
     [1, 1, 1]],    # J
    [[0, 0, 1],
     [1, 1, 1]],    # L
    [[1, 1],
     [1, 1]],       # O
    [[0, 1, 1],
     [1, 1, 0]],    # S
    [[0, 1, 0],
     [1, 1, 1]],    # T
    [[1, 1, 0],
     [0, 1, 1]]     # Z
]

Шаг 3. Создаём класс фигуры

python

class Figure:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.type = random.randint(0, len(FIGURES) - 1)
        self.color = COLORS[self.type]
        self.rotation = 0

    def shape(self):
        return FIGURES[self.type][self.rotation % len(FIGURES[self.type])]

    def rotate(self):
        self.rotation = (self.rotation + 1) % len(FIGURES[self.type])


Шаг 4. Реализация игрового поля и логики

python

class Tetris:
    def __init__(self, height, width):
        self.height = height
        self.width = width
        self.field = [[0 for _ in range(width)] for _ in range(height)]
        self.figure = None
        self.score = 0

    def new_figure(self):
        self.figure = Figure(self.width // 2 - 1, 0)

    def intersects(self):
        shape = self.figure.shape()
        for y, row in enumerate(shape):
            for x, cell in enumerate(row):
                if cell:
                    if (self.figure.y + y >= self.height or
                        self.figure.x + x < 0 or
                        self.figure.x + x >= self.width or
                        self.field[self.figure.y + y][self.figure.x + x]):
                        return True
        return False

    def freeze(self):
        shape = self.figure.shape()
        for y, row in enumerate(shape):
            for x, cell in enumerate(row):
                if cell:
                    self.field[self.figure.y + y][self.figure.x + x] = self.figure.color
        self.clear_lines()
        self.new_figure()
        if self.intersects():
            self.__init__(self.height, self.width)  # Game Over

    def clear_lines(self):
        lines_cleared = 0
        for i in range(self.height - 1, -1, -1):
            if all(self.field[i]):
                del self.field[i]
                self.field.insert(0, [0 for _ in range(self.width)])
                lines_cleared += 1
        self.score += lines_cleared ** 2


Шаг 5. Основной игровой цикл

python

game = Tetris(SCREEN_HEIGHT // BLOCK_SIZE, SCREEN_WIDTH // BLOCK_SIZE)
clock = pygame.time.Clock()
fall_speed = 500
last_move_down = pygame.time.get_ticks()

running = True
game.new_figure()

while running:
    screen.fill(BLACK)

    # События пользователя
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                game.figure.x -= 1
                if game.intersects():
                    game.figure.x += 1
            elif event.key == pygame.K_RIGHT:
                game.figure.x += 1
                if game.intersects():
                    game.figure.x -= 1
            elif event.key == pygame.K_DOWN:
                game.figure.y += 1
                if game.intersects():
                    game.figure.y -= 1
            elif event.key == pygame.K_UP:
                game.figure.rotate()
                if game.intersects():
                    game.figure.rotate()

    # Падение фигуры
    if pygame.time.get_ticks() - last_move_down > fall_speed:
        game.figure.y += 1
        if game.intersects():
            game.figure.y -= 1
            game.freeze()
        last_move_down = pygame.time.get_ticks()

    # Рисуем игровое поле
    for y in range(game.height):
        for x in range(game.width):
            if game.field[y][x]:
                pygame.draw.rect(
                    screen,
                    game.field[y][x],
                    [x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE]
                )

    # Рисуем текущую фигуру
    shape = game.figure.shape()
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                pygame.draw.rect(
                    screen,
                    game.figure.color,
                    [(game.figure.x + x) * BLOCK_SIZE, (game.figure.y + y) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE]
                )

    pygame.display.flip()
    clock.tick(30)

pygame.quit()


Добавляем счётчик очков и экран «Game Over»

Чтобы сделать игру полноценной, можно добавить вывод очков на экран и сообщение о завершении игры при проигрыше. Это реализуется с помощью модуля pygame.font и проверки состояния игры.


FAQ — Часто задаваемые вопросы

1. Можно ли добавить музыку в игру?

Да, используйте pygame.mixer для воспроизведения аудиофайлов.


2. Как изменить размеры игрового поля?

Измените значения SCREEN_WIDTH, SCREEN_HEIGHT и BLOCK_SIZE.


3. Как добавить разные уровни сложности?

Изменяйте переменную fall_speed для ускорения падения фигур.


4. Есть ли готовый код на Brainfuck для Тетриса?

К сожалению, Brainfuck слишком ограничен для создания полноценной игры «Тетрис», хотя существуют примеры визуализации логики через его интерпретаторы.


5. Можно ли адаптировать этот код для мобильных устройств?

Да, но потребуется использовать другие фреймворки, например Kivy или BeeWare.


6. Как сделать игру в оконном режиме с кнопками управления?

Добавьте на экран графические кнопки с помощью Pygame и обрабатывайте клики мыши через pygame.MOUSEBUTTONDOWN.


Заключение

Теперь у вас есть полный рабочий проект игры «Тетрис» на Python с использованием библиотеки Pygame. Вы можете модифицировать его, добавлять новые функции, менять внешний вид фигур, улучшать механику игры и даже реализовывать мультиплеер!

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

Новости