오늘은 파이썬과 Pygame 라이브러리를 활용하여 간단한 벽돌깨기 게임을 만드는 방법을 소개하려고 합니다. 이 글은 게임 개발에 대한 기본적인 이해가 있는 분들, 특히 초보 입장에서 이해하기 쉽게 작성되었습니다. 벽돌깨기 게임은 기본적이지만 여러 중요한 프로그래밍 개념들을 포함하고 있어 학습용으로 아주 적합합니다.
프로젝트 준비
벽돌깨기 게임을 개발하기 위해서는 먼저 Pygame 라이브러리를 설치해야 합니다. 이 라이브러리는 파이썬으로 간단한 2D 게임을 만들 수 있게 해주는 아주 유용한 도구입니다. 설치는 아래와 같이 간단히 할 수 있습니다.
pip install pygame
이제 준비가 되었으니, 본격적으로 코드를 작성해보겠습니다.
게임 초기화 및 화면 설정
게임을 시작하기 위해서는 먼저 Pygame을 초기화하고, 화면의 크기를 설정해줘야 합니다. 이 부분은 게임을 구성하는 기초로, 사용자와 상호작용할 수 있는 환경을 구축하는 단계입니다.
import pygame
import random
import sys
from tkinter import messagebox, Tk
# pygame 초기화
pygame.init()
# 화면 크기 설정
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Brick Breaker")
여기서 WIDTH
와 HEIGHT
는 게임 화면의 크기를 정의하며, pygame.display.set_mode()
를 사용하여 창을 만듭니다. pygame.display.set_caption()
을 통해 게임 창의 제목을 설정합니다.
색상 및 객체 설정
색상은 RGB 값으로 정의됩니다. 게임에서는 여러 색상이 사용되는데, 패들, 공, 벽돌 등을 구분하기 위해 각기 다른 색상을 지정합니다.
# 색상 정의
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
다음으로는 패들, 공, 벽돌의 설정입니다. 각 객체는 Pygame의 Rect
클래스를 사용하여 정의됩니다. Rect
는 직사각형을 의미하며, 게임 내에서 움직이거나 충돌을 처리할 때 유용하게 사용됩니다.
패들 설정
# 패들 설정
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
paddle = pygame.Rect(WIDTH // 2 - PADDLE_WIDTH // 2, HEIGHT - 40, PADDLE_WIDTH, PADDLE_HEIGHT)
paddle_speed = 10
패들은 화면 하단에 위치하며, 사용자가 방향키를 통해 좌우로 이동할 수 있습니다. 초기 위치는 화면의 중앙에 설정됩니다.
공 설정
# 공 설정
BALL_SIZE = 15
ball = pygame.Rect(WIDTH // 2, HEIGHT // 2, BALL_SIZE, BALL_SIZE)
ball_speed_x = 4 * random.choice((1, -1))
ball_speed_y = -4
공은 화면 중앙에서 시작하며, 초기 속도는 랜덤한 방향으로 설정됩니다. 이를 통해 게임을 좀 더 흥미롭게 만듭니다.
벽돌 설정
벽돌은 여러 개가 있으며, 행과 열로 배열되어 있습니다. 벽돌들 사이에 약간의 공간을 주기 위해 패딩 값을 설정합니다.
# 벽돌 설정
BRICK_ROWS = 6
BRICK_COLS = 10
BRICK_WIDTH = WIDTH // BRICK_COLS - 5 # 벽돌 간에 약간의 공간 추가
BRICK_HEIGHT = 30
BRICK_PADDING = 5 # 벽돌 간 공간 크기
bricks = [pygame.Rect(col * (BRICK_WIDTH + BRICK_PADDING), row * (BRICK_HEIGHT + BRICK_PADDING), BRICK_WIDTH, BRICK_HEIGHT) for row in range(BRICK_ROWS) for col in range(BRICK_COLS)]
게임 시작 및 종료 메뉴
게임 시작과 종료 시에 팝업 창을 띄워서 사용자가 게임을 시작하거나 종료 여부를 결정할 수 있도록 했습니다. 이를 위해 Tkinter 라이브러리를 활용하여 메시지 박스를 구현했습니다.
# 게임 시작 여부 확인 함수
def show_start_menu():
root = Tk()
root.withdraw() # Tkinter 기본 창 숨기기
start_game = messagebox.askyesno("게임 시작", "NEW 게임을 시작하시겠습니까?")
root.destroy()
return start_game
# 게임 종료 후 다시 시작 여부 확인 함수
def show_end_menu():
root = Tk()
root.withdraw() # Tkinter 기본 창 숨기기
restart_game = messagebox.askyesno("게임 종료", "다시 플레이하시겠습니까?")
root.destroy()
return restart_game
게임 루프 구현
게임의 핵심은 메인 루프입니다. 이 루프에서는 사용자 입력을 처리하고, 공과 패들, 벽돌의 이동과 충돌을 관리하며, 화면을 업데이트합니다. 게임이 활성화되어 있는 동안 루프가 실행됩니다.
# 게임 루프
game_active = show_start_menu()
while game_active:
running = True
while running:
# 이벤트 처리
for event in pygame.event.get():
if event.type == pygame.QUIT:
print("게임 종료")
pygame.quit()
sys.exit()
# 패들 이동
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle.left > 0:
paddle.x -= paddle_speed
print(f"패들 왼쪽으로 이동: {paddle.x}")
if keys[pygame.K_RIGHT] and paddle.right < WIDTH:
paddle.x += paddle_speed
print(f"패들 오른쪽으로 이동: {paddle.x}")
# 공 이동 및 충돌 처리
ball.x += ball_speed_x
ball.y += ball_speed_y
print(f"공 위치: ({ball.x}, {ball.y})")
if ball.left <= 0 or ball.right >= WIDTH:
ball_speed_x *= -1
print(f"공이 벽에 충돌하여 x축 방향 반전: {ball_speed_x}")
if ball.top <= 0:
ball_speed_y *= -1
print(f"공이 천장에 충돌하여 y축 방향 반전: {ball_speed_y}")
if ball.colliderect(paddle):
ball_speed_y *= -1
print(f"공이 패들과 충돌하여 y축 방향 반전: {ball_speed_y}")
for brick in bricks[:]:
if ball.colliderect(brick):
bricks.remove(brick)
ball_speed_y *= -1
print(f"공이 벽돌과 충돌하여 벽돌 제거, 남은 벽돌 수: {len(bricks)}")
break
if ball.bottom >= HEIGHT:
print("공이 화면 아래로 나감. 게임 종료")
running = False
# 화면 그리기
screen.fill(BLACK)
pygame.draw.rect(screen, BLUE, paddle)
pygame.draw.ellipse(screen, WHITE, ball)
for brick in bricks:
pygame.draw.rect(screen, RED, brick)
# 화면 업데이트
pygame.display.flip()
pygame.time.delay(30)
# 게임 종료 후 다시 시작 여부 확인
game_active = show_end_menu()
# 게임 종료
pygame.quit()
맺음말
이 글에서는 파이썬과 Pygame을 활용하여 벽돌깨기 게임을 만드는 과정을 자세히 설명했습니다. 이 게임은 비교적 간단하지만, 게임 개발의 기본적인 개념인 이벤트 처리, 충돌 감지, 객체 이동 등을 학습하는 데 아주 유용합니다. 앞으로 이 코드를 바탕으로 다양한 기능을 추가해보세요. 예를 들어, 점수 시스템을 추가하거나, 난이도를 조절하는 기능을 구현해볼 수 있습니다.
게임 개발을 통해 프로그래밍 실력을 향상시키고, 더 나아가 창의력을 발휘하여 자신만의 게임을 만들어보시길 바랍니다.