티스토리 뷰
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
링크
TAG
- Text Mining
- 컴퓨팅사고력
- 관계자분석
- 프로토타입
- 텍스트 마이닝
- Idle
- 챗GPT
- 안드로이드
- 챗봇
- 파이썬기초
- 자바스크립트
- matplotlib
- 4차산업혁명
- 초보자를 위한 텍스트마이닝
- HIG
- 휴리스틱평가
- python
- 피그마
- UI
- 데이타R지
- 스마트기술
- 파이썬 기초
- UX
- 데이터R지
- figma
- 파이썬
- pygame
- 텍스트마이닝
- HCI
- 라이브러리
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함