Классическая игра Pong на Python и Pygame

PythonBeginner
Практиковаться сейчас

Введение

В этом проекте вы научитесь создавать игру Pong с использованием Python и библиотеки Pygame. Pong - это классическая двухигровая аркадная игра, в которой игроки контролируют ракетки, чтобы击球 мячом друг через друга.

Для завершения этого проекта вам нужно выполнить шаги ниже. Мы начнем с создания файлов проекта и настройки игрового окна. Затем мы определим цвета и настроим ракетки и мяч. Наконец, мы будем двигать ракетки и мяч, обрабатывать столкновения и рисовать игровые элементы.

👀 Предварительный просмотр

Скриншот предварительного просмотра игры Pong

🎯 Задачи

В этом проекте вы научитесь:

  • Как создавать файлы проекта
  • Как настраивать игровое окно
  • Как настраивать ракетки и мяч
  • Как настраивать игровые переменные
  • Как настраивать игровой цикл
  • Как двигать ракетки
  • Как двигать мяч
  • Как обрабатывать столкновения мяча
  • Как обновлять счета и сбрасывать мяч
  • Как обрабатывать столкновения и движение усилителей
  • Как рисовать игровые элементы
  • Как рисовать счет
  • Как обновлять отображение
  • Как устанавливать количество кадров в секунду (FPS)
  • Как выйти из игры

🏆 Достижения

После завершения этого проекта вы сможете:

  • Использовать библиотеку Pygame для создания игрового окна
  • Настраивать и двигать игровые объекты, такие как ракетки и мяч
  • Обрабатывать столкновения между игровыми объектами
  • Обновлять и отображать игровые счета
  • Устанавливать количество кадров в секунду (FPS) для игры
  • Корректно выйти из игры

Создайте файлы проекта

Создайте файл с именем pong_game.py в своем предпочитаемом редакторе кода или IDE. Это будет главный файл, где вы пишете код для игры Pong.

cd ~/project
touch pong_game.py
sudo pip install pygame

Настройте игровое окно

Внутри файла pong_game.py импортируйте необходимые библиотеки в начале кода:

import pygame
import random

Затем инициализируйте Pygame, вызвав pygame.init():

## Initialize Pygame
pygame.init()

Далее настройте игровое окно, определив ширину, высоту и количество кадров в секунду (FPS):

## Set up the game window
WIDTH = 800
HEIGHT = 400
FPS = 60

Определите цвета, используемые в игре:

## Define colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
ORANGE = (255, 165, 0)
BACKGROUND_COLOR = (50, 50, 50)

Создайте игровое окно, задайте заголовок окна и создайте объект часов, чтобы контролировать частоту кадров:

## Set up the game window
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pong Game")
clock = pygame.time.Clock()
✨ Проверить решение и практиковаться

Настройте платформы и мяч

Определите свойства ракеток, такие как ширина, высота, скорость и цвет:

## Set up the paddles
PADDLE_WIDTH = 10
PADDLE_HEIGHT = 60
PADDLE_SPEED = 5
PADDLE_COLOR = WHITE

Создайте два объекта ракеток с помощью конструктора pygame.Rect() и расположите их по центру каждой стороны игрового окна:

paddle1 = pygame.Rect(0, HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_WIDTH, PADDLE_HEIGHT)
paddle2 = pygame.Rect(
    WIDTH - PADDLE_WIDTH, HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_WIDTH, PADDLE_HEIGHT
)

Настройте свойства мяча, такие как ширина, высота, скорость и цвет:

## Set up the ball
BALL_WIDTH = 10
BALL_HEIGHT = 10
BALL_SPEED_X = 3
BALL_SPEED_Y = 3
BALL_COLOR = WHITE

Создайте объект мяча с помощью конструктора pygame.Rect() и расположите его по центру игрового окна:

ball = pygame.Rect(
    WIDTH / 2 - BALL_WIDTH / 2, HEIGHT / 2 - BALL_HEIGHT / 2, BALL_WIDTH, BALL_HEIGHT
)

Установите начальную скорость мяча в направлениях x и y случайным образом:

ball_speed_x = BALL_SPEED_X * random.choice((1, -1))
ball_speed_y = BALL_SPEED_Y * random.choice((1, -1))

Настройте бонусы (power-ups), такие как ширина, высота, скорость и цвет:

## Set up the power-ups
POWERUP_WIDTH = 10
POWERUP_HEIGHT = 10
POWERUP_SPEED = 2
POWERUP_COLOR = ORANGE

powerup = pygame.Rect(
    WIDTH / 2 - POWERUP_WIDTH / 2,
    HEIGHT / 2 - POWERUP_HEIGHT / 2,
    POWERUP_WIDTH,
    POWERUP_HEIGHT,
)
powerup_speed_x = POWERUP_SPEED * random.choice((1, -1))
powerup_speed_y = POWERUP_SPEED * random.choice((1, -1))
powerup_active = False
✨ Проверить решение и практиковаться

Настройте игровые переменные

Настройте переменные для отслеживания очков игроков, создайте объект игрового шрифта и определите цвет для отображения счета:

## Set up the game variables
score1 = 0
score2 = 0
game_font = pygame.font.SysFont(None, 48)
SCORE_COLOR = WHITE
✨ Проверить решение и практиковаться

Настройте игровой цикл

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

## Set up the game loop
running = True
while running:

Внутри игрового цикла обработайте события, перебирая события, которые произошли:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
✨ Проверить решение и практиковаться

Перемещайте платформы

Внутри игрового цикла проверяйте нажатия клавиш для перемещения ракеток:

    ## Move the paddles
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w] and paddle1.y > 0:
        paddle1.y -= PADDLE_SPEED
    if keys[pygame.K_s] and paddle1.y < HEIGHT - PADDLE_HEIGHT:
        paddle1.y += PADDLE_SPEED
    if keys[pygame.K_UP] and paddle2.y > 0:
        paddle2.y -= PADDLE_SPEED
    if keys[pygame.K_DOWN] and paddle2.y < HEIGHT - PADDLE_HEIGHT:
        paddle2.y += PADDLE_SPEED
✨ Проверить решение и практиковаться

Перемещайте мяч

Внутри игрового цикла обновляйте позицию мяча:

    ## Move the ball
    ball.x += ball_speed_x
    ball.y += ball_speed_y
✨ Проверить решение и практиковаться

Обработайте столкновения мяча

Внутри игрового цикла обработайте столкновения мяча с ракетками и стенами:

    ## Ball collision with paddles
    if ball.colliderect(paddle1) or ball.colliderect(paddle2):
        ball_speed_x *= -1

    ## Ball collision with walls
    if ball.y > HEIGHT - BALL_HEIGHT or ball.y < 0:
        ball_speed_y *= -1
✨ Проверить решение и практиковаться

Обновите счета и сбросьте мяч

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

    ## Increase the score and reset the ball
    if ball.x < 0:
        score2 += 1
        ball.center = (WIDTH / 2, HEIGHT / 2)
        ball_speed_x *= random.choice((1, -1))
        ball_speed_y *= random.choice((1, -1))
    if ball.x > WIDTH:
        score1 += 1
        ball.center = (WIDTH / 2, HEIGHT / 2)
        ball_speed_x *= random.choice((1, -1))
        ball_speed_y *= random.choice((1, -1))
✨ Проверить решение и практиковаться

Обработайте столкновения и движение усилителей

Внутри игрового цикла обработайте столкновения усилителей с ракетками и двигайте усилитель:

    ## Power-up collision with paddles
    if powerup.colliderect(paddle1) or powerup.colliderect(paddle2):
        powerup_active = True
        powerup.x = WIDTH / 2 - POWERUP_WIDTH / 2
        powerup.y = HEIGHT / 2 - POWERUP_HEIGHT / 2

    ## Power-up movement
    if powerup_active:
        powerup.x += powerup_speed_x
        powerup.y += powerup_speed_y

        if powerup.x > WIDTH - POWERUP_WIDTH or powerup.x < 0:
            powerup_speed_x *= -1
        if powerup.y > HEIGHT - POWERUP_HEIGHT or powerup.y < 0:
            powerup_speed_y *= -1
✨ Проверить решение и практиковаться

Отрисуйте игровые элементы

Внутри игрового цикла отрисовывайте ракетки, мяч, усилитель и счет на игровом окне:

    ## Draw the game elements
    screen.fill(BACKGROUND_COLOR)
    pygame.draw.rect(screen, PADDLE_COLOR, paddle1)
    pygame.draw.rect(screen, PADDLE_COLOR, paddle2)
    pygame.draw.ellipse(screen, BALL_COLOR, ball)
    pygame.draw.rect(screen, POWERUP_COLOR, powerup)
✨ Проверить решение и практиковаться

Отрисуйте счет

Внутри игрового цикла отрисовывайте счета в верхней части по центру игрового окна:

    ## Draw the score
    score_text = game_font.render(f"{score1} : {score2}", True, SCORE_COLOR)
    screen.blit(score_text, (WIDTH / 2 - score_text.get_width() / 2, 10))
✨ Проверить решение и практиковаться

Обновите отображение

Внутри игрового цикла обновите экран, чтобы показать изменения:

    ## Update the display
    pygame.display.flip()
✨ Проверить решение и практиковаться

Установите FPS

Внутри игрового цикла установите частоту кадров, чтобы контролировать скорость игры:

    ## Set the FPS
    clock.tick(FPS)
✨ Проверить решение и практиковаться

Выйти из игры

После игрового цикла добавьте следующую строку, чтобы выйти из Pygame, когда игра завершена:

## Quit the game
pygame.quit()

Переключитесь на рабочий стол и запустите проект с помощью следующей команды:

python pong_game.py

Теперь вы можете играть в игру Pong, используя стрелки на клавиатуре и клавиши W и S.

Pong game screenshot
✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили пошаговый проект по созданию игры Pong с использованием Python и Pygame. Вы узнали, как настроить игровое окно, определить свойства платформ и мяча, обрабатывать игровые события, перемещать платформы и мяч, обрабатывать столкновения и рисовать игровые элементы. Пробуйте различные модификации, чтобы добавить свои собственные улучшения в игру и получить удовольствие от игры!