본문 바로가기
  • NerdCodX Blog
파이썬(Python)

Python Day 25: 2048 추가 기능 및 최적화 - "다시 시작" 버튼 및 UI 개선

by NerdCodeX 2025. 3. 11.

 

1. 2048 게임 최적화 및 추가 기능 개요

 

안녕하세요! 오늘은 2048 게임을 더욱 완성도 높게 만들기 위해 추가 기능과 최적화 작업을 진행하겠습니다. 이전 강의에서 게임 종료 로직을 구현했지만, 게임을 다시 시작하려면 프로그램을 재실행해야 하는 불편함이 있었습니다. 이번 강의에서는 "다시 시작" 버튼을 추가하고, PyGame의 화면 렌더링을 최적화하여 게임 성능을 개선하는 방법을 배웁니다.


2. "다시 시작" 버튼 추가

버튼을 추가하는 방법

PyGame의 pygame.draw.rect() 함수를 사용하여 버튼을 그립니다.
버튼 위에 "다시 시작" 텍스트를 표시합니다.
마우스 클릭 이벤트를 감지하여 게임을 다시 시작합니다.

 

예제 1: "다시 시작" 버튼을 화면에 추가

import pygame

# PyGame 초기화
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 400, 500  # 버튼을 위한 높이 증가
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2048 Game with Restart")

# 색상 및 폰트 설정
WHITE = (255, 255, 255)
GRAY = (200, 200, 200)
BLACK = (0, 0, 0)
FONT = pygame.font.Font(None, 40)

def draw_restart_button(screen):
    pygame.draw.rect(screen, GRAY, (100, 430, 200, 50))  # 버튼 배경
    text_surface = FONT.render("다시 시작", True, BLACK)
    text_rect = text_surface.get_rect(center=(200, 455))
    screen.blit(text_surface, text_rect)

 

클릭 이벤트 처리

def check_restart_event(event, grid, score):
    if event.type == pygame.MOUSEBUTTONDOWN:
        x, y = event.pos
        if 100 <= x <= 300 and 430 <= y <= 480:  # 버튼 영역
            grid = initialize_game()
            score = 0
    return grid, score

3. PyGame 화면 최적화

최적화 기법 적용

  1. 불필요한 화면 갱신 방지
    • pygame.display.update() 대신 pygame.display.flip()을 사용하여 필요한 부분만 갱신.
  2. 프레임 속도 조절
    • pygame.time.Clock()을 활용하여 FPS(초당 프레임 수) 설정.

예제 2: 최적화된 게임 루프

clock = pygame.time.Clock()
running = True
while running:
    screen.fill(WHITE)
    draw_score(screen, score)
    draw_grid(screen, grid)
    draw_restart_button(screen)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        grid, score = check_restart_event(event, grid, score)
    
    pygame.display.flip()  # 전체 화면을 갱신하는 대신 효율적으로 업데이트
    clock.tick(30)  # FPS 설정 (30프레임)

pygame.quit()

 

설명

  • pygame.display.flip()을 사용하여 전체 화면이 아닌 변경된 부분만 업데이트.
  • clock.tick(30)을 사용해 초당 30프레임으로 제한하여 불필요한 CPU 사용을 방지.

4. 실습: UI 개선 및 최적화

문제 설명

  • "다시 시작" 버튼을 추가하고, PyGame의 성능을 최적화하는 기능을 구현하세요.

완성 코드

import pygame

def main():
    pygame.init()
    WIDTH, HEIGHT = 400, 500
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("2048 Game with Optimization")
    clock = pygame.time.Clock()

    grid = initialize_game()
    score = 0
    running = True
    
    while running:
        screen.fill(WHITE)
        draw_score(screen, score)
        draw_grid(screen, grid)
        draw_restart_button(screen)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            grid, score = check_restart_event(event, grid, score)
        
        pygame.display.flip()
        clock.tick(30)
    
    pygame.quit()

if __name__ == "__main__":
    main()

 

출력 예시

  • 화면 하단에 "다시 시작" 버튼이 추가되고, 클릭하면 게임이 초기화됨.
  • FPS 최적화로 인해 게임이 부드럽고 안정적으로 실행됨.

5. 실습 과제

1. 버튼 스타일 개선

  • 버튼을 더 둥글게 만들고, 클릭할 때 색상이 변하도록 추가하세요.
if 100 <= x <= 300 and 430 <= y <= 480:
    pygame.draw.rect(screen, (150, 150, 150), (100, 430, 200, 50))

2. 애니메이션 효과 추가

  • 타일이 이동할 때 애니메이션 효과를 적용하여 부드러운 움직임을 구현하세요.

3. 다양한 해상도 지원

  • 600x600, 800x800 등의 다양한 해상도에서 정상적으로 동작하도록 설정을 추가하세요.

 

 

오늘 강의에서는 2048 게임의 추가 기능 및 최적화 작업을 진행하며, "다시 시작" 버튼을 추가하고 PyGame의 성능을 개선하는 방법을 배웠습니다. 이를 통해 사용자가 게임을 더 쉽게 재시작할 수 있도록 편의성을 높이고, 화면 렌더링을 최적화하여 부드러운 게임 플레이 환경을 구현할 수 있었습니다.

이제 2048 게임은 더욱 직관적이고 효율적인 구조를 갖추게 되었으며, 앞으로 남은 작업을 통해 완성도를 더욱 높일 예정입니다. 이번 실습에서 배운 UI 개선, 이벤트 처리, 최적화 기법은 다양한 프로젝트에서도 활용할 수 있는 중요한 기술입니다.

다음 강의에서는 게임을 실행 가능한 파일로 변환하여 실제로 배포하는 방법을 배워보겠습니다.

 

🚀 궁금한 점이나 피드백이 있다면 댓글로 남겨주세요. 여러분의 학습을 응원합니다! 😊