Добавить в корзинуПозвонить
Найти в Дзене
IT Start | Python

Игра «Арканоид» на Python

В этой статье мы напишем простую игру «Арканоид» на языке программирования Python с использованием библиотеки Pygame. Перед написанием кода необходимо установить библиотеку Pygame. Сделать это можно через pip. Для этого нужно перейти в терминал/командную строку, прописать pip install pygame, нажать Enter и ждать установки. pip install pygame После установки Pygame, мы импортируем её, а также модуль sys: import pygame
import sys Инициализируем Pygame: import pygame
import sys # Инициализация Pygame
pygame.init() Создадим константы WIDTH и HEIGHT, первая из которых будет хранить ширину окна, а вторая — высоту: import pygame
import sys pygame.init() # Константы размеров окна
WIDTH, HEIGHT = 800, 600 Создадим окно: import pygame
import sys pygame.init() # Настройки окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид") Также создадим константы, которые будут хранить цвета в формате RGB: import pygame
import sys pygam
Оглавление

Введение

В этой статье мы напишем простую игру «Арканоид» на языке программирования Python с использованием библиотеки Pygame.

Установка Pygame

Перед написанием кода необходимо установить библиотеку Pygame. Сделать это можно через pip. Для этого нужно перейти в терминал/командную строку, прописать pip install pygame, нажать Enter и ждать установки.

pip install pygame

Инициализация Pygame

После установки Pygame, мы импортируем её, а также модуль sys:

import pygame
import sys

Инициализируем Pygame:

import pygame
import sys

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

Настройка окна игры

Создадим константы WIDTH и HEIGHT, первая из которых будет хранить ширину окна, а вторая — высоту:

import pygame
import sys

pygame.init()

# Константы размеров окна
WIDTH, HEIGHT = 800, 600

Создадим окно:

import pygame
import sys

pygame.init()

# Настройки окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

Также создадим константы, которые будут хранить цвета в формате RGB:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

# Цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)

Укажем шрифт:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Шрифт
font = pygame.font.Font(None, 36)

Создадим константу FPS, в которой будет храниться количество кадров в секунду, также укажем параметры мяча, ракетки и генерацию блоков:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

# Игровые настройки
FPS = 60
clock = pygame.time.Clock()

# Параметры ракетки
paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

# Параметры мяча
ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

# Генерация блоков
block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

Укажем начальные переменные score и running:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

# Начальные переменные
score = 0
running = True

  • score — количество очков.
  • running — отвечает за работу основного игрового цикла.

Основной игровой цикл

Создадим основной игровой цикл, который прекратит свою работу в тот момент, когда running станет равна False:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

# Основной игровой цикл
while running:

Внутри данного цикла сначала будет идти цикл for, который нужен для обработки события закрытия окна:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

while running:
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

Управление ракеткой

Далее будут идти условия для управления ракеткой. При нажатии на стрелку влево — ракетка будет перемещаться влево, а при нажатии на стрелочку вправо — вправо:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# Управление ракеткой
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle.left > 0:
paddle.x -= paddle_speed
if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
paddle.x += paddle_speed

Движение мяча

Теперь добавим логику движения мяча:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle.left > 0:
paddle.x -= paddle_speed
if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
paddle.x += paddle_speed

# Столкновение с ракеткой
if ball.colliderect(paddle):
ball_speed[1] = -ball_speed[1]

# Столкновение с блоками
for block in blocks[:]:
if ball.colliderect(block):
blocks.remove(block)
ball_speed[1] = -ball_speed[1]
score += 10
break

Проверка победы

Добавим проверку победы:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle.left > 0:
paddle.x -= paddle_speed
if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
paddle.x += paddle_speed

if ball.colliderect(paddle):
ball_speed[1] = -ball_speed[1]

for block in blocks[:]:
if ball.colliderect(block):
blocks.remove(block)
ball_speed[1] = -ball_speed[1]
score += 10
break

# Проверка победы
if not blocks:
running = False

Отрисовка

Осталось добавить отрисовку экрана, блоков, мяча, ракетки, счёта и обновление экрана:

import pygame
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Арканоид")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

font = pygame.font.Font(None, 36)

FPS = 60
clock = pygame.time.Clock()

paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle = pygame.Rect(WIDTH // 2 - paddle_width // 2, HEIGHT - 40, paddle_width, paddle_height)

ball_size = 15
ball = pygame.Rect(WIDTH // 2 - ball_size // 2, HEIGHT // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, -5]

block_rows = 5
block_cols = 8
block_width = WIDTH // block_cols
block_height = 30
blocks = [pygame.Rect(col * block_width, row * block_height, block_width, block_height)
for row in range(block_rows) for col in range(block_cols)]

score = 0
running = True

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle.left > 0:
paddle.x -= paddle_speed
if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
paddle.x += paddle_speed

if ball.colliderect(paddle):
ball_speed[1] = -ball_speed[1]

for block in blocks[:]:
if ball.colliderect(block):
blocks.remove(block)
ball_speed[1] = -ball_speed[1]
score += 10
break

if not blocks:
running = False

# Отрисовка экрана
screen.fill(BLACK)

# Отрисовка блоков
for block in blocks:
pygame.draw.rect(screen, BLUE, block)

# Отрисовка ракетки и мяча
pygame.draw.rect(screen, WHITE, paddle)
pygame.draw.ellipse(screen, RED, ball)

# Отрисовка счёта
score_text = font.render(f"Очки: {score}", True, WHITE)
screen.blit(score_text, (10, 10))

# Обновление экрана
pygame.display.flip()
clock.tick(FPS)

# Завершение работы Pygame
pygame.quit()
sys.exit()

Игра «Арканоид» на Python

Итоговая игра:

-2

Заключение

В ходе статьи мы с Вами написали код простой игры «Арканоид» на языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Мой Telegram канал

Мой YouTube канал

Мой курс по Python (50 видоуроков + дополнительные уроки)

Курс по созданию телеграм-ботов на Python с фреймворком Aiogram

Курс по созданию GUI на Python