안녕하세요!김코딩입니다
게임 개발 초보자 여러분, 안녕하세요! 오늘은 Pygame으로 조금 더 완성도 있는 게임을 만들어 볼 거예요. 지난 글에서는 Pygame 설치와 기본적인 창 생성, 캐릭터 이동까지 배웠죠? 이제는 충돌 감지, 점수 시스템, 그리고 게임 오버와 재시작 기능을 추가해, 게임을 더 재미있고 도전적으로 만들어 보겠습니다.
1. 이전 코드 리뷰: 어디까지 했었나요?
지난번에는 파란 사각형 캐릭터를 방향키로 이동시키고, 빨간 목표물을 모을 때마다 점수가 올라가는 기본 구조를 만들었습니다. 하지만 게임에 종료 조건이 없어서 조금 단순했죠. 오늘은 장애물을 추가하고, 게임 오버 후 재시작 기능도 넣을 거예요.
2. 게임 계획: 어떤 게임을 만들까요?
이번에 만들 게임은 목표물을 모으고 장애물을 피하는 간단한 게임입니다. 게임의 주요 특징은 다음과 같아요:
- 플레이어: 파란 사각형 캐릭터를 방향키로 조작합니다.
- 목표물: 빨간 원을 모으면 점수가 올라갑니다.
- 장애물: 노란 사각형에 닿으면 게임 오버!
- 재시작: 게임 오버 후 R 키를 눌러 재시작할 수 있습니다.
이제 코드를 단계별로 살펴보며 어떻게 구현했는지 알아볼까요?
3. 완성된 코드와 단계별 설명
import pygame
import random
# Pygame 초기화
pygame.init()
# 화면 설정
WIDTH, HEIGHT = 500, 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("목표 모으기 게임")
# 색상 정의
WHITE = (255, 255, 255) # 배경색
BLUE = (0, 0, 255) # 플레이어 색상
RED = (255, 0, 0) # 목표물 색상
YELLOW = (255, 255, 0) # 장애물 색상
BLACK = (0, 0, 0) # 텍스트 색상
# 한글 폰트 설정 (Windows 기준, OS에 따라 경로 조정 필요)
try:
font = pygame.font.Font("C:/Windows/Fonts/malgun.ttf", 25) # 맑은 고딕 사용
except:
font = pygame.font.SysFont(None, 25) # 기본 폰트로 대체
# 플레이어 초기 설정
player_x, player_y = WIDTH // 2, HEIGHT // 2 # 화면 중앙에서 시작
player_size = 40
speed = 5
# 목표물 초기 설정
target_x, target_y = random.randint(0, WIDTH - 20), random.randint(0, HEIGHT - 20)
target_size = 20
# 장애물 리스트 생성 (x, y, 크기)
obstacles = [[random.randint(0, WIDTH - 30), random.randint(0, HEIGHT - 30), 30] for _ in range(5)]
# 게임 상태 변수
score = 0
game_over = False
# FPS 제어용 클럭
clock = pygame.time.Clock()
# 게임 루프
running = True
while running:
clock.tick(60) # 60 FPS로 부드럽게 실행
# 이벤트 처리
for event in pygame.event.get():
if event.type == pygame.QUIT: # 창 닫기 버튼 클릭
running = False
if event.type == pygame.KEYDOWN and game_over: # 게임 오버 시 재시작
if event.key == pygame.K_r:
# 게임 상태 초기화
player_x, player_y = WIDTH // 2, HEIGHT // 2
target_x, target_y = random.randint(0, WIDTH - 20), random.randint(0, HEIGHT - 20)
obstacles = [[random.randint(0, WIDTH - 30), random.randint(0, HEIGHT - 30), 30] for _ in range(5)]
score = 0
game_over = False
# 게임 진행 중일 때만 동작
if not game_over:
# 키 입력으로 플레이어 이동
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= speed
if keys[pygame.K_RIGHT] and player_x < WIDTH - player_size:
player_x += speed
if keys[pygame.K_UP] and player_y > 0:
player_y -= speed
if keys[pygame.K_DOWN] and player_y < HEIGHT - player_size:
player_y += speed
# 충돌 감지: 목표물
player_rect = pygame.Rect(player_x, player_y, player_size, player_size)
target_rect = pygame.Rect(target_x, target_y, target_size, target_size)
if player_rect.colliderect(target_rect):
target_x = random.randint(0, WIDTH - target_size)
target_y = random.randint(0, HEIGHT - target_size)
score += 1
# 충돌 감지: 장애물
for obs in obstacles:
obs_rect = pygame.Rect(obs[0], obs[1], obs[2], obs[2])
if player_rect.colliderect(obs_rect):
game_over = True
# 화면 그리기
screen.fill(WHITE) # 배경 초기화
if not game_over:
# 플레이어 그리기
pygame.draw.rect(screen, BLUE, (player_x, player_y, player_size, player_size))
# 목표물 그리기
pygame.draw.circle(screen, RED, (target_x + target_size // 2, target_y + target_size // 2), target_size // 2)
# 장애물 그리기
for obs in obstacles:
pygame.draw.rect(screen, YELLOW, (obs[0], obs[1], obs[2], obs[2]))
else:
# 게임 오버 화면
game_over_text = font.render(f"게임 오버! 점수: {score}", True, BLACK)
restart_text = font.render("R 키를 눌러 재시작", True, BLACK)
screen.blit(game_over_text, (WIDTH // 2 - 130, HEIGHT // 2 - 30))
screen.blit(restart_text, (WIDTH // 2 - 110, HEIGHT // 2 + 10))
# 점수 표시
score_text = font.render(f"점수: {score}", True, BLACK)
screen.blit(score_text, (10, 10))
pygame.display.update() # 화면 업데이트
# 게임 종료
pygame.quit()


4. 코드 설명
1) 한글 폰트 설정
- Pygame에서 한글 폰트를 사용할 때 깨지지 않도록 맑은 고딕(
malgun.ttf
)을 사용했습니다. Windows에서 기본 제공되는 폰트입니다. 다른 운영체제에서는 해당 OS에 맞는 폰트 경로로 수정해 주세요.
2) 게임 요소 초기화
- 플레이어는 화면 중앙에 위치하며, 크기는 40×40입니다.
- 목표물은 빨간 원으로, 랜덤한 위치에 생성됩니다.
- 장애물은 노란 사각형으로 5개가 랜덤 위치에 배치됩니다.
3) 게임 로직
- 방향키로 플레이어를 움직이고, 목표물에 닿으면 점수가 올라가며 새 위치로 이동합니다.
- 장애물에 닿으면 게임 오버 상태로 전환됩니다.
4) 화면 출력
- 게임 오버 시 텍스트를 화면 중앙에 표시하고, R 키를 눌러 재시작할 수 있습니다.
5. 실행해 보기
- 코드를 Python 파일(예:
game.py
)로 저장한 후, 터미널에서python game.py
로 실행하세요. - 방향키로 파란 사각형을 움직여 빨간 원을 모으고, 노란 장애물을 피해 보세요.
6. 더 재미있게 만들기
- 시간 제한: 30초 안에 몇 점을 모을 수 있는지 도전!
- 장애물 움직임: 장애물이 천천히 움직이게 하여 난이도 상승!
- 레벨 시스템: 점수가 10점, 20점 이상이 될 때마다 장애물을 추가하는 방식.
7. 마무리와 다음 단계
오늘은 Pygame을 사용하여 충돌 감지, 점수 시스템, 게임 오버 및 재시작 기능을 추가해봤습니다. 이제 여러분도 자신만의 게임을 만들 준비가 되셨죠? 다음 글에서는 이미지와 사운드 추가, 벽돌 깨기 같은 조금 더 복잡한 게임을 만들어 볼 예정입니다.
궁금한 점이나 더 만들고 싶은 게임 아이디어가 있으면 댓글로 남겨 주세요! 😊