본문 바로가기
08.개발&프로그래밍/1.파이썬

3. Python Pong Game (퐁 게임)

by JWJ Family 2025. 7. 18.
728x90

아래 코드는 Pygame 라이브러리로 구현한 클래식 퐁 게임입니다. 먼저 pip install pygame로 Pygame을 설치한 뒤, 이 코드를 pong.py로 저장하고 python pong.py로 실행하세요.

# pong.py

import pygame
import sys

# 초기화
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pong Game")
clock = pygame.time.Clock()

# 색상
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 패들 설정
PADDLE_WIDTH, PADDLE_HEIGHT = 10, 100
paddle_speed = 7

left_paddle = pygame.Rect(30, (HEIGHT - PADDLE_HEIGHT) // 2, PADDLE_WIDTH, PADDLE_HEIGHT)
right_paddle = pygame.Rect(WIDTH - 40, (HEIGHT - PADDLE_HEIGHT) // 2, PADDLE_WIDTH, PADDLE_HEIGHT)

# 공 설정
BALL_SIZE = 20
ball = pygame.Rect((WIDTH - BALL_SIZE)//2, (HEIGHT - BALL_SIZE)//2, BALL_SIZE, BALL_SIZE)
ball_speed_x, ball_speed_y = 5, 5

# 점수
left_score, right_score = 0, 0
font = pygame.font.SysFont(None, 48)

def draw():
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, left_paddle)
    pygame.draw.rect(screen, WHITE, right_paddle)
    pygame.draw.ellipse(screen, WHITE, ball)
    pygame.draw.aaline(screen, WHITE, (WIDTH//2, 0), (WIDTH//2, HEIGHT))

    score_text = font.render(f"{left_score}   {right_score}", True, WHITE)
    screen.blit(score_text, ((WIDTH - score_text.get_width())//2, 20))

    pygame.display.flip()

def handle_input():
    keys = pygame.key.get_pressed()
    # 왼쪽 패들 (W/S)
    if keys[pygame.K_w] and left_paddle.top > 0:
        left_paddle.y -= paddle_speed
    if keys[pygame.K_s] and left_paddle.bottom < HEIGHT:
        left_paddle.y += paddle_speed
    # 오른쪽 패들 (Up/Down)
    if keys[pygame.K_UP] and right_paddle.top > 0:
        right_paddle.y -= paddle_speed
    if keys[pygame.K_DOWN] and right_paddle.bottom < HEIGHT:
        right_paddle.y += paddle_speed

def update_ball():
    global ball_speed_x, ball_speed_y, left_score, right_score

    ball.x += ball_speed_x
    ball.y += ball_speed_y

    # 위/아래 벽 충돌
    if ball.top <= 0 or ball.bottom >= HEIGHT:
        ball_speed_y *= -1

    # 패들 충돌
    if ball.colliderect(left_paddle) or ball.colliderect(right_paddle):
        ball_speed_x *= -1

    # 골 득점
    if ball.left <= 0:
        right_score += 1
        reset_ball()
    if ball.right >= WIDTH:
        left_score += 1
        reset_ball()

def reset_ball():
    global ball_speed_x, ball_speed_y
    ball.center = (WIDTH//2, HEIGHT//2)
    ball_speed_x *= -1
    ball_speed_y *= -1

def main():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        handle_input()
        update_ball()
        draw()
        clock.tick(60)

if __name__ == "__main__":
    main()
반응형