본문 바로가기

[Pygame] 🧱 벽돌 깨기 게임 만들기 6강 | 벽돌(Brick) 생성 구조

@도마22026. 2. 22. 22:00
728x90


벽돌(Brick) 생성 구조

이번 강의에서는 벽돌깨기 게임의 핵심 요소인
벽돌(Brick)을 화면에 생성하고 관리하는 구조를 구현합니다.

이 강의의 목표는 다음과 같습니다.

  • 여러 개의 벽돌을 구조적으로 생성합니다
  • 반복문을 이용해 벽돌을 배치합니다
  • 벽돌을 리스트로 관리하는 방식을 이해합니다

이번 강의까지 완료되면
벽돌깨기 게임의 외형이 거의 완성 단계에 들어갑니다.


벽돌을 구조적으로 만들어야 하는 이유

벽돌을 하나씩 직접 생성하는 방식은
벽돌 개수가 늘어날수록 관리가 불가능해집니다.

따라서 벽돌은 반드시 다음 조건을 만족해야 합니다.

  • 반복문으로 생성 가능해야 합니다
  • 여러 개를 한 번에 관리할 수 있어야 합니다
  • 이후 충돌 시 제거할 수 있어야 합니다

이를 위해
Rect 객체 + 리스트 구조를 사용합니다.


벽돌의 크기와 기본 설정

먼저 벽돌 하나의 크기와 간격을 설정합니다.

brick_width = 60
brick_height = 20
brick_padding = 10
  • brick_width 는 벽돌의 너비입니다
  • brick_height 는 벽돌의 높이입니다
  • brick_padding 은 벽돌 사이의 간격입니다

이 값들은 나중에 스테이지 구성 시
쉽게 수정할 수 있도록 변수로 관리합니다.


벽돌을 저장할 리스트 생성

여러 개의 벽돌을 관리하기 위해
빈 리스트를 하나 생성합니다.

bricks = []

이 리스트에는
각 벽돌의 Rect 객체가 하나씩 저장됩니다.


반복문으로 벽돌 배치하기

이제 반복문을 사용해
여러 개의 벽돌을 화면 상단에 배치합니다.

rows = 4
cols = 10

for row in range(rows):
    for col in range(cols):
        brick_x = col * (brick_width + brick_padding) + 35
        brick_y = row * (brick_height + brick_padding) + 50

        brick_rect = pygame.Rect(
            brick_x,
            brick_y,
            brick_width,
            brick_height
        )

        bricks.append(brick_rect)

이 구조를 통해
벽돌이 행과 열 형태로 자동 배치됩니다.


벽돌 위치 계산의 핵심

벽돌의 x, y 좌표는
다음 요소들로 결정됩니다.

  • 현재 행과 열 번호
  • 벽돌의 크기
  • 벽돌 사이 간격
  • 화면에서의 시작 위치

이 방식은
스테이지 개념을 도입할 때 그대로 확장됩니다.


벽돌을 화면에 그리기

리스트에 저장된 벽돌을
반복문으로 하나씩 화면에 그립니다.

for brick in bricks:
    pygame.draw.rect(screen, WHITE, brick)

이제 화면 상단에
여러 개의 벽돌이 정렬되어 표시됩니다.


현재 단계의 결과

이번 강의까지 구현된 결과는 다음과 같습니다.

  • 패들을 좌우로 이동할 수 있습니다
  • 공이 벽과 패들에 튕깁니다
  • 화면 상단에 여러 개의 벽돌이 생성됩니다

아직 공과 벽돌의 충돌은 처리하지 않았지만,
벽돌깨기 게임의 형태는 완성된 상태입니다.

다음 강의에서는
공과 벽돌이 충돌했을 때
벽돌이 사라지도록 처리합니다.



전체 코드

더보기
import pygame
import sys

pygame.init()

# 화면 설정
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Breakout Game")

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

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 패들 설정
paddle_width = 100
paddle_height = 15
paddle_speed = 7

paddle_x = (SCREEN_WIDTH - paddle_width) // 2
paddle_y = SCREEN_HEIGHT - 40

paddle_rect = pygame.Rect(
    paddle_x,
    paddle_y,
    paddle_width,
    paddle_height
)

# 공 설정
ball_radius = 8
ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2

ball_speed_x = 5
ball_speed_y = -5

ball_rect = pygame.Rect(
    ball_x - ball_radius,
    ball_y - ball_radius,
    ball_radius * 2,
    ball_radius * 2
)

# 벽돌 설정
brick_width = 60
brick_height = 20
brick_padding = 10

rows = 4
cols = 10

bricks = []

for row in range(rows):
    for col in range(cols):
        brick_x = col * (brick_width + brick_padding) + 35
        brick_y = row * (brick_height + brick_padding) + 50

        brick_rect = pygame.Rect(
            brick_x,
            brick_y,
            brick_width,
            brick_height
        )

        bricks.append(brick_rect)

# 게임 루프
running = True
while running:
    clock.tick(FPS)

    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 패들 입력 처리
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        paddle_rect.x -= paddle_speed
    if keys[pygame.K_RIGHT]:
        paddle_rect.x += paddle_speed

    if paddle_rect.left < 0:
        paddle_rect.left = 0
    if paddle_rect.right > SCREEN_WIDTH:
        paddle_rect.right = SCREEN_WIDTH

    # 공 이동
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    ball_rect.x = ball_x - ball_radius
    ball_rect.y = ball_y - ball_radius

    # 벽 충돌 처리
    if ball_rect.left <= 0 or ball_rect.right >= SCREEN_WIDTH:
        ball_speed_x *= -1
    if ball_rect.top <= 0:
        ball_speed_y *= -1

    # 패들 충돌 처리
    if ball_rect.colliderect(paddle_rect):
        ball_speed_y *= -1
        ball_rect.bottom = paddle_rect.top
        ball_y = ball_rect.centery

    # 화면 그리기
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, paddle_rect)
    pygame.draw.circle(screen, WHITE, (ball_x, ball_y), ball_radius)

    for brick in bricks:
        pygame.draw.rect(screen, WHITE, brick)

    pygame.display.flip()

pygame.quit()
sys.exit()

728x90
도마2
@도마2 :: 도마의 코드노트

초보자를 위한 코딩 강의를 정리합니다. 파이썬부터 C#, Unity 게임 제작까지 차근차근 기록합니다. — 도마

목차