728x90

아이템 추가
이번 강의에서는 벽돌을 깼을 때 아이템(Item)이 떨어지고,
플레이어가 이를 획득하면 게임 상태가 변화하는 구조를 구현합니다.
이 강의의 목표는 다음과 같습니다.
- 아이템 객체를 생성하고 관리합니다
- 아이템이 아래로 떨어지도록 처리합니다
- 패들이 아이템을 획득했을 때 효과를 적용합니다
이제 게임은 매 판마다 완전히 다른 흐름을 만들 수 있습니다.
아이템 시스템이 필요한 이유
지금까지의 벽돌깨기 게임은
플레이어 실력에 따라 결과가 달라지지만,
게임 구조 자체는 비교적 고정되어 있습니다.
아이템은 다음 역할을 합니다.
- 우연성(Random)을 추가합니다
- 플레이에 변화를 줍니다
- “같은 스테이지라도 매번 다르게” 만듭니다
아이템의 기본 구조
아이템은 다음 조건을 가집니다.
- 벽돌이 깨질 때 일정 확률로 생성됩니다
- 화면 아래로 떨어집니다
- 패들과 충돌하면 효과가 발동됩니다
아이템 역시 Rect 객체와 리스트로 관리합니다.
아이템 리스트와 기본 설정
먼저 아이템을 저장할 리스트와 속도를 정의합니다.
items = []
item_speed = 4
아이템 생성 함수 만들기
벽돌이 제거될 때 아이템을 생성할 수 있도록
함수로 분리합니다.
import random
def create_item(x, y):
item_rect = pygame.Rect(x, y, 20, 20)
items.append(item_rect)
아이템 크기는 20x20으로 설정합니다.
벽돌 파괴 시 아이템 생성
7~8강에서 만든 벽돌 제거 코드에
확률 조건을 추가합니다.
if random.random() < 0.3:
create_item(brick.centerx - 10, brick.centery)
이 코드는
30% 확률로 아이템이 생성되도록 만듭니다.
아이템 이동 처리
아이템은 매 프레임 아래로 이동합니다.
for item in items:
item.y += item_speed
아이템과 패들 충돌 처리
아이템이 패들과 충돌하면
효과를 적용하고 아이템을 제거합니다.
이번 강의에서는 가장 기본적인 아이템을 구현합니다.
- 패들 길이 증가 아이템
for item in items:
if item.colliderect(paddle_rect):
paddle_rect.width += 30
items.remove(item)
break
패들 길이가 늘어나면서
공을 받기 쉬워집니다.
화면 밖으로 나간 아이템 제거
아이템이 화면 아래로 떨어지면
자동으로 제거합니다.
for item in items:
if item.top > SCREEN_HEIGHT:
items.remove(item)
아이템 그리기
아이템은 패들과 구분되도록
다른 색으로 그립니다.
for item in items:
pygame.draw.rect(screen, (0, 200, 0), item)
현재 단계의 결과
이번 강의까지 구현된 결과는 다음과 같습니다.
- 벽돌을 깨면 확률적으로 아이템이 생성됩니다
- 아이템이 아래로 떨어집니다
- 패들이 아이템을 획득하면 크기가 커집니다
이제 게임은
매 판마다 다른 난이도와 흐름을 가지게 됩니다.
다음 강의에서는
사운드와 이펙트를 추가해
게임의 손맛과 완성도를 높입니다.

전체 코드
더보기
import pygame
import sys
import random
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)
GREEN = (0, 200, 0)
clock = pygame.time.Clock()
FPS = 60
font = pygame.font.SysFont(None, 30)
score = 0
lives = 3
paddle_width = 100
paddle_height = 15
paddle_speed = 7
paddle_rect = pygame.Rect(
(SCREEN_WIDTH - paddle_width) // 2,
SCREEN_HEIGHT - 40,
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 = []
items = []
item_speed = 4
def create_bricks():
bricks.clear()
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
bricks.append(
pygame.Rect(brick_x, brick_y, brick_width, brick_height)
)
def create_item(x, y):
item_rect = pygame.Rect(x, y, 20, 20)
items.append(item_rect)
create_bricks()
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
paddle_rect.left = max(paddle_rect.left, 0)
paddle_rect.right = min(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
for brick in bricks:
if ball_rect.colliderect(brick):
overlap_left = ball_rect.right - brick.left
overlap_right = brick.right - ball_rect.left
overlap_top = ball_rect.bottom - brick.top
overlap_bottom = brick.bottom - ball_rect.top
min_overlap = min(overlap_left, overlap_right, overlap_top, overlap_bottom)
if min_overlap == overlap_left or min_overlap == overlap_right:
ball_speed_x *= -1
else:
ball_speed_y *= -1
if random.random() < 0.3:
create_item(brick.centerx - 10, brick.centery)
bricks.remove(brick)
score += 10
break
for item in items[:]:
item.y += item_speed
if item.colliderect(paddle_rect):
paddle_rect.width += 30
items.remove(item)
elif item.top > SCREEN_HEIGHT:
items.remove(item)
if ball_rect.top > SCREEN_HEIGHT:
lives -= 1
if lives <= 0:
running = False
else:
ball_x = SCREEN_WIDTH // 2
ball_y = SCREEN_HEIGHT // 2
ball_speed_x = 5
ball_speed_y = -5
paddle_rect.width = paddle_width
paddle_rect.x = (SCREEN_WIDTH - paddle_width) // 2
create_bricks()
items.clear()
screen.fill(BLACK)
score_text = font.render(f"Score: {score}", True, WHITE)
life_text = font.render(f"Lives: {lives}", True, WHITE)
screen.blit(score_text, (10, 10))
screen.blit(life_text, (SCREEN_WIDTH - 100, 10))
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)
for item in items:
pygame.draw.rect(screen, GREEN, item)
pygame.display.flip()
pygame.quit()
sys.exit()
728x90
'⚙️ Python > 🎮 Pygame 실전' 카테고리의 다른 글
| [Pygame] 🧱 벽돌 깨기 게임 만들기 12강 | 타이틀 화면 추가 (0) | 2026.02.25 |
|---|---|
| [Pygame] 🧱 벽돌 깨기 게임 만들기 11강 | 이펙트 & 사운드 추가 (0) | 2026.02.25 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 9강 | 점수 & 라이프 시스템 (0) | 2026.02.24 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 8강 | 충돌 방향 정확히 계산하기 (0) | 2026.02.23 |
| [Pygame] 🧱 벽돌 깨기 게임 만들기 7강 | 공과 벽돌 충돌 (0) | 2026.02.23 |