티스토리 뷰

3. 벽돌깨기 게임 정보 출력

프롬프트

이어서, 점수, 생명, 남은 벽돌 수를  좌상단, 중상단, 우상단에 출력해줘
점수는 벽돌을 부술 때 마다 10점씩 추가되고, 
생명은 3으로 시작해서 공을 놓치면 1씩 감소하게 해줘


step04.py: 게임 정보 출력( 점수, 생명, 남은 벽돌 수 추가 코드)

이번 단계에서는 화면 상단에 점수(score), 생명(life), 남은 벽돌 수(block count)를 출력한다.

좌상단: Score
중상단: Life
우상단: Blocks

1. 전역변수

Step 4에서는 글자를 출력하기 위한 font와 게임 정보 변수 3개를 추가한다.

font = None  # ADDED
font는 화면에 글자를 출력하기 위한 글꼴 정보이다.
score = 0
life = 3
block_count = 0
  • score는 점수이다.
  • life는 생명이다.
  • block_count는 남은 벽돌 수이다.

2. 초기화

초기화 함수에서는 글꼴과 게임 정보를 처음 상태로 설정한다.

font = pygame.font.SysFont(None, 30)
  • 기본 글꼴을 사용하고, 글자 크기는 30으로 설정한다.
score = 0
life = 3
block_count = BRICK_ROWS * BRICK_COLS
  • 점수는 0점에서 시작한다.
  • 생명은 3으로 시작한다.
  • 남은 벽돌 수는 5행 × 8열 = 40개로 시작한다.

3. 입력

Step 4에서 입력 부분은 Step 3과 동일하다.


4. 업데이트

Step 4에서 가장 중요한 추가는 벽돌 충돌과 공을 놓쳤을 때이다.

  • 벽돌을 부수면 점수가 10점 증가한다.
score += 10
  • 남은 벽돌 수는 1 감소한다.
block_count -= 1
 
  • 공이 화면 아래로 떨어지면 생명이 1 감소한다.
life -= 1
  • 생명이 0이 되면 게임을 종료한다.
if life <= 0:
    running = False
 

5. 출력

Step 4에서 출력 부분에 게임 정보 출력 코드가 추가된다.

text_score = font.render(f"Score: {score}", True, WHITE)
text_life = font.render(f"Life: {life}", True, WHITE)
text_blocks = font.render(f"Blocks: {block_count}", True, WHITE)
 
  • 이 코드는 점수, 생명, 남은 벽돌 수를 글자 이미지로 만든다.

위치는 다음과 같다.

score_rect = text_score.get_rect(topleft=(10, 10))
life_rect = text_life.get_rect(midtop=(WIDTH // 2, 10))
blocks_rect = text_blocks.get_rect(topright=(WIDTH - 10, 10))
 
  • Score는 좌상단이다.
  • Life는 중상단이다.
  • Blocks는 우상단이다.

마지막으로 화면에 출력한다.

screen.blit(text_score, score_rect)
screen.blit(text_life, life_rect)
screen.blit(text_blocks, blocks_rect)
pygame에서는 글자를 만든 뒤 blit()으로 화면에 붙인다.

6. 실행

실행 함수는 Step 3과 같다.


전체 코드 (step04.py)

import pygame
import sys


# 전역 변수
WIDTH, HEIGHT = 600, 800
screen = None
clock = None
running = True

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

# 글꼴 정보
font = None  # ADDED 글자 출력을 위한 글꼴

# 공 정보
BALL_RADIUS = 10
BALL_SPEED_X = 4
BALL_SPEED_Y = -4
ball_pos = None
ball_vel = None

# 패들 정보
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
PADDLE_SPEED = 7
paddle_rect = None
paddle_dx = 0

# 벽돌 정보
BRICK_ROWS = 5
BRICK_COLS = 8
BRICK_WIDTH = 60
BRICK_HEIGHT = 20
BRICK_GAP = 10
bricks = []

# 게임 정보
score = 0        # ADDED 점수
life = 3         # ADDED 생명
block_count = 0  # ADDED 남은 벽돌 수


# 1. 게임 초기화
def init():
    global screen, clock
    global font  # ADDED
    global ball_pos, ball_vel, paddle_rect, bricks
    global score, life, block_count  # ADDED

    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("벽돌깨기 4단계 - 점수와 생명")
    clock = pygame.time.Clock()

    # ADDED 글꼴 생성
    font = pygame.font.SysFont(None, 30)

    # ADDED 게임 정보 초기화
    score = 0
    life = 3
    block_count = BRICK_ROWS * BRICK_COLS

    # 공 초기 위치와 속도
    ball_pos = [WIDTH // 2, HEIGHT // 2]
    ball_vel = [BALL_SPEED_X, BALL_SPEED_Y]

    # 패들 초기 위치
    paddle_x = WIDTH // 2 - PADDLE_WIDTH // 2
    paddle_y = HEIGHT - 50
    paddle_rect = pygame.Rect(
        paddle_x,
        paddle_y,
        PADDLE_WIDTH,
        PADDLE_HEIGHT
    )

    # 벽돌 생성
    bricks = []

    total_brick_width = BRICK_COLS * BRICK_WIDTH + (BRICK_COLS - 1) * BRICK_GAP
    start_x = WIDTH // 2 - total_brick_width // 2
    start_y = 80

    for row in range(BRICK_ROWS):
        for col in range(BRICK_COLS):
            brick_x = start_x + col * (BRICK_WIDTH + BRICK_GAP)
            brick_y = start_y + row * (BRICK_HEIGHT + BRICK_GAP)

            brick = pygame.Rect(
                brick_x,
                brick_y,
                BRICK_WIDTH,
                BRICK_HEIGHT
            )

            bricks.append(brick)


# 2. 입력 처리
def handle_input():
    global running
    global paddle_dx

    paddle_dx = 0

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 방향키 입력 처리
    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        paddle_dx = -PADDLE_SPEED

    if keys[pygame.K_RIGHT]:
        paddle_dx = PADDLE_SPEED


# 3. 게임 업데이트
def update_game():
    global ball_pos, ball_vel, bricks
    global score, life, block_count  # ADDED
    global running  # ADDED 생명이 0이면 게임 종료

    # 패들 위치 업데이트
    paddle_rect.x += paddle_dx

    # 패들이 화면 밖으로 나가지 않도록 제한
    if paddle_rect.left < 0:
        paddle_rect.left = 0

    if paddle_rect.right > WIDTH:
        paddle_rect.right = WIDTH

    # 공 위치 업데이트
    ball_pos[0] += ball_vel[0]
    ball_pos[1] += ball_vel[1]

    # 공을 충돌 검사용 사각형으로 변환
    ball_rect = pygame.Rect(
        ball_pos[0] - BALL_RADIUS,
        ball_pos[1] - BALL_RADIUS,
        BALL_RADIUS * 2,
        BALL_RADIUS * 2
    )

    # 왼쪽 벽 충돌
    if ball_pos[0] - BALL_RADIUS <= 0:
        ball_vel[0] = abs(ball_vel[0])

    # 오른쪽 벽 충돌
    if ball_pos[0] + BALL_RADIUS >= WIDTH:
        ball_vel[0] = -abs(ball_vel[0])

    # 위쪽 벽 충돌
    if ball_pos[1] - BALL_RADIUS <= 0:
        ball_vel[1] = abs(ball_vel[1])

    # 패들과 충돌
    if ball_rect.colliderect(paddle_rect):
        if ball_vel[1] > 0:
            ball_vel[1] = -abs(ball_vel[1])
            ball_pos[1] = paddle_rect.top - BALL_RADIUS

    # 벽돌과 충돌
    for brick in bricks[:]:
        if ball_rect.colliderect(brick):
            bricks.remove(brick)
            ball_vel[1] *= -1

            score += 10       # ADDED 벽돌을 부술 때마다 10점 추가
            block_count -= 1  # ADDED 남은 벽돌 수 1 감소

            break

    # 공이 화면 아래로 떨어졌을 때
    if ball_pos[1] - BALL_RADIUS > HEIGHT:
        life -= 1  # ADDED 공을 놓치면 생명 1 감소

        # 공을 다시 화면 중앙에 배치
        ball_pos = [WIDTH // 2, HEIGHT // 2]
        ball_vel = [BALL_SPEED_X, BALL_SPEED_Y]

        # ADDED 생명이 0이 되면 게임 종료
        if life <= 0:
            running = False


# 4. 출력 처리
def render():
    screen.fill(BLACK)

    # ADDED 게임 정보 글자 만들기
    text_score = font.render(f"Score: {score}", True, WHITE)
    text_life = font.render(f"Life: {life}", True, WHITE)
    text_blocks = font.render(f"Blocks: {block_count}", True, WHITE)

    # ADDED 게임 정보 위치 정하기
    score_rect = text_score.get_rect(topleft=(10, 10))
    life_rect = text_life.get_rect(midtop=(WIDTH // 2, 10))
    blocks_rect = text_blocks.get_rect(topright=(WIDTH - 10, 10))

    # ADDED 게임 정보 화면에 출력하기
    screen.blit(text_score, score_rect)
    screen.blit(text_life, life_rect)
    screen.blit(text_blocks, blocks_rect)

    # 벽돌 그리기
    for brick in bricks:
        pygame.draw.rect(screen, WHITE, brick)

    # 공 그리기
    pygame.draw.circle(
        screen,
        WHITE,
        (int(ball_pos[0]), int(ball_pos[1])),
        BALL_RADIUS
    )

    # 패들 그리기
    pygame.draw.rect(screen, WHITE, paddle_rect)

    pygame.display.flip()


# 5. 게임 실행
def run_game():
    init()

    while running:
        handle_input()
        update_game()
        render()
        clock.tick(60)

    pygame.quit()
    sys.exit()


run_game()

추가된 핵심 부분

게임 정보는 render() 함수에서 출력한다.

text_score = font.render(f"Score: {score}", True, WHITE)
text_life = font.render(f"Life: {life}", True, WHITE)
text_blocks = font.render(f"Blocks: {block_count}", True, WHITE)
위 코드는 숫자 정보를 글자 이미지로 바꾸는 부분이다.

위치 지정은 다음과 같다.

score_rect = text_score.get_rect(topleft=(10, 10))
life_rect = text_life.get_rect(midtop=(WIDTH // 2, 10))
blocks_rect = text_blocks.get_rect(topright=(WIDTH - 10, 10))
 
  • Score는 좌상단, Life는 중상단, Blocks는 우상단에 배치된다.

Step 4 핵심 정리

Step 4의 핵심은 다음이다.

벽돌을 부수면 score가 10 증가한다.
공을 놓치면 life가 1 감소한다.
남은 벽돌 수는 block_count로 관리한다.
score, life, block_count를 화면 상단에 출력한다.

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함