Python 과 Pygame 을 이용한 클래식 퐁 게임

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 Python 과 Pygame 라이브러리를 사용하여 퐁 게임을 만드는 방법을 배웁니다. 퐁은 플레이어가 패들을 제어하여 공을 서로 넘기는 고전적인 2 인용 아케이드 게임입니다.

이 프로젝트를 완료하려면 아래 단계를 따라야 합니다. 먼저 프로젝트 파일을 만들고 게임 창을 설정합니다. 그런 다음 색상을 정의하고 패들과 공을 설정합니다. 마지막으로 패들과 공을 움직이고, 충돌을 처리하며, 게임 요소를 그립니다.

👀 미리보기

Pong game preview screenshot

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다.

  • 프로젝트 파일을 만드는 방법
  • 게임 창을 설정하는 방법
  • 패들과 공을 설정하는 방법
  • 게임 변수를 설정하는 방법
  • 게임 루프를 설정하는 방법
  • 패들을 움직이는 방법
  • 공을 움직이는 방법
  • 공 충돌을 처리하는 방법
  • 점수를 업데이트하고 공을 재설정하는 방법
  • 파워업 충돌 및 움직임을 처리하는 방법
  • 게임 요소를 그리는 방법
  • 점수를 그리는 방법
  • 디스플레이를 업데이트하는 방법
  • 초당 프레임 수 (FPS, Frames Per Second) 를 설정하는 방법
  • 게임을 종료하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • Pygame 라이브러리를 사용하여 게임 창을 만들 수 있습니다.
  • 패들과 공과 같은 게임 객체를 설정하고 움직일 수 있습니다.
  • 게임 객체 간의 충돌을 처리할 수 있습니다.
  • 게임 점수를 업데이트하고 표시할 수 있습니다.
  • 게임의 초당 프레임 수 (FPS) 를 설정할 수 있습니다.
  • 게임을 올바르게 종료할 수 있습니다.

프로젝트 파일 생성

선호하는 코드 편집기 또는 IDE 에서 pong_game.py라는 파일을 만듭니다. 이 파일은 퐁 게임의 코드를 작성하는 주 파일이 됩니다.

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

게임 창 설정

pong_game.py 파일 내에서 코드 시작 부분에 필요한 라이브러리를 가져옵니다.

import pygame
import random

그런 다음 pygame.init()를 호출하여 Pygame 을 초기화합니다.

## 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))

파워업의 너비, 높이, 속도, 색상과 같은 속성을 설정합니다:

## 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 설정

게임 루프 내에서 게임 속도를 제어하기 위해 프레임 속도 (frame rate) 를 설정합니다.

    ## Set the FPS
    clock.tick(FPS)

게임 종료

게임 루프가 끝난 후, 게임이 종료될 때 Pygame 을 종료하기 위해 다음 줄을 추가합니다.

## Quit the game
pygame.quit()

데스크톱으로 전환하여 다음 명령을 사용하여 프로젝트를 실행합니다.

python pong_game.py

이제 키보드의 화살표 키와 WS 키를 사용하여 퐁 게임을 플레이할 수 있습니다.

Pong game screenshot

요약

축하합니다! Python 과 Pygame 을 사용하여 퐁 게임을 만드는 단계별 프로젝트를 완료했습니다. 게임 창 설정, 패들 및 공의 속성 정의, 게임 이벤트 처리, 패들 및 공 이동, 충돌 처리, 게임 요소 그리기에 대해 배웠습니다. 게임에 자신만의 개선 사항을 추가하기 위해 다양한 수정 사항을 실험하고 즐겁게 플레이하세요!

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습