Введение
В этой статье мы напишем простую игру «Арканоид» на языке программирования 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
Итоговая игра:
Заключение
В ходе статьи мы с Вами написали код простой игры «Арканоид» на языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Мой Telegram канал
Мой YouTube канал
Мой курс по Python (50 видоуроков + дополнительные уроки)
Курс по созданию телеграм-ботов на Python с фреймворком Aiogram