Введение
В этой статье мы напишем простую игру «Пинг-понг» на языке программирования Python с использованием библиотеки 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("Пинг-понг")
Создание объектов игры
Теперь создадим объекты игры: мяч и ракетки:
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
# Создание объектов
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
Задание начальных условий
Зададим начальные параметры игры, такие как скорость мяча и ракеток:
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
# Начальные скорости
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
Основной игровой цикл
Создадим основной игровой цикл (бесконечный цикл):
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
# Основной цикл
while True:
Внутри данного цикла сначала будет идти цикл for, который нужен для задействования кнопки закрытия окна (крестика справа сверху):
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
while True:
# Выход из игры
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
Далее будут идти условия для управления ракетками. Левый игрок сможет управлять ракеткой используя клавиши W и S, а правый игрок — стрелочками вверх и вниз.
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
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_w] and paddle1.top > 0:
paddle1.y -= PADDLE_SPEED
if keys[pygame.K_s] and paddle1.bottom < HEIGHT:
paddle1.y += PADDLE_SPEED
if keys[pygame.K_UP] and paddle2.top > 0:
paddle2.y -= PADDLE_SPEED
if keys[pygame.K_DOWN] and paddle2.bottom < HEIGHT:
paddle2.y += PADDLE_SPEED
Движение мяча
Теперь добавим логику движения мяча:
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
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_w] and paddle1.top > 0:
paddle1.y -= PADDLE_SPEED
if keys[pygame.K_s] and paddle1.bottom < HEIGHT:
paddle1.y += PADDLE_SPEED
if keys[pygame.K_UP] and paddle2.top > 0:
paddle2.y -= PADDLE_SPEED
if keys[pygame.K_DOWN] and paddle2.bottom < HEIGHT:
paddle2.y += PADDLE_SPEED
# Движение мяча
ball.x += ball_speed_x
ball.y += ball_speed_y
# Отскок мяча от стен
if ball.top <= 0 or ball.bottom >= HEIGHT:
ball_speed_y = -ball_speed_y
if ball.colliderect(paddle1) or ball.colliderect(paddle2):
ball_speed_x = -ball_speed_x
Проверка выхода мяча за пределы
Добавим логику для проверки, выходит ли мяч за пределы экрана:
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
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_w] and paddle1.top > 0:
paddle1.y -= PADDLE_SPEED
if keys[pygame.K_s] and paddle1.bottom < HEIGHT:
paddle1.y += PADDLE_SPEED
if keys[pygame.K_UP] and paddle2.top > 0:
paddle2.y -= PADDLE_SPEED
if keys[pygame.K_DOWN] and paddle2.bottom < HEIGHT:
paddle2.y += PADDLE_SPEED
ball.x += ball_speed_x
ball.y += ball_speed_y
if ball.top <= 0 or ball.bottom >= HEIGHT:
ball_speed_y = -ball_speed_y
if ball.colliderect(paddle1) or ball.colliderect(paddle2):
ball_speed_x = -ball_speed_x
# Проверка, выходит ли мяч за пределы экрана
if ball.left <= 0 or ball.right >= WIDTH:
ball.x = WIDTH // 2
ball.y = HEIGHT // 2
ball_speed_x = BALL_SPEED_X * (-1 if ball.left <= 0 else 1)
Отрисовка объектов
Осталось отрисовать все объекты на экране:
import pygame
import sys
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Пинг-понг")
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, 20, 20)
paddle1 = pygame.Rect(30, HEIGHT // 2 - 70, 10, 140)
paddle2 = pygame.Rect(WIDTH - 40, HEIGHT // 2 - 70, 10, 140)
BALL_SPEED_X, BALL_SPEED_Y = 7, 7
ball_speed_x = BALL_SPEED_X
ball_speed_y = BALL_SPEED_Y
PADDLE_SPEED = 10
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_w] and paddle1.top > 0:
paddle1.y -= PADDLE_SPEED
if keys[pygame.K_s] and paddle1.bottom < HEIGHT:
paddle1.y += PADDLE_SPEED
if keys[pygame.K_UP] and paddle2.top > 0:
paddle2.y -= PADDLE_SPEED
if keys[pygame.K_DOWN] and paddle2.bottom < HEIGHT:
paddle2.y += PADDLE_SPEED
ball.x += ball_speed_x
ball.y += ball_speed_y
if ball.top <= 0 or ball.bottom >= HEIGHT:
ball_speed_y = -ball_speed_y
if ball.colliderect(paddle1) or ball.colliderect(paddle2):
ball_speed_x = -ball_speed_x
if ball.left <= 0 or ball.right >= WIDTH:
ball.x = WIDTH // 2
ball.y = HEIGHT // 2
ball_speed_x = BALL_SPEED_X * (-1 if ball.left <= 0 else 1)
# Отрисовка
screen.fill((0, 0, 0)) # Чёрный фон
pygame.draw.ellipse(screen, (255, 255, 255), ball) # Мяч белого цвета
pygame.draw.rect(screen, (255, 255, 255), paddle1) # Левая ракетка
pygame.draw.rect(screen, (255, 255, 255), paddle2) # Правая ракетка
pygame.display.flip() # Обновление экрана
pygame.time.delay(30) # Задержка для управления частотой кадров
Игра «Пинг-понг» на Python
Итоговая игра:
Заключение
В ходе статьи мы с Вами написали код простой игры «Пинг-понг» на языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Мой Telegram канал
Мой YouTube канал
Мой курс по Python (50 видоуроков + дополнительные уроки)
Курс по созданию телеграм-ботов на Python с фреймворком Aiogram