파이썬을 이용한 게임만들기 중 오늘은 퍼즐 게임 만들기에 대해서 알아보도록 하겠습니다. 퍼즐 게임은 논리적인 사고와 문제 해결 능력을 키우는 데 도움이 되며, 파이썬 프로그래밍 실력도 향상시킬 수 있는 좋은 프로젝트 입니다.
1.프로젝트 개요
우리가 만들 퍼즐 게임은 숫자나 이미지를 섞어서 원래의 순서대로 맞추는 간단한 슬라이딩 퍼즐 입니다. 이 게임은 Pygame라이브러리를 사용하여 구현할 것이며, 다음과 같은 기능을 포함할 예정 입니다.
게임 보드 생성하기
퍼즐 조각 섞기
마우스 클릭으로 퍼즐 조각 이동
게임 클리어 확인
타이머 및 이동 횟수 카운트
2.개발 환경 설정
먼저 필요한 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요.
pip install pygame
3. 기본 구조 만들기
게임의 기본 구조를 만들어 봅시다. 다음 코드로 시작하세요.
import pygame
import random
# 초기화
pygame.init()
# 화면 설정
WIDTH, HEIGHT = 400, 400
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("파이썬 퍼즐 게임")
# 색상 정의
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# 게임 변수
GRID_SIZE = 4
TILE_SIZE = WIDTH // GRID_SIZE
# 게임 루프
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
SCREEN.fill(WHITE)
pygame.display.flip()
pygame.quit()
4.퍼즐 보드 생성
이제 퍼즐 보드를 생성해 봅시다. 다음 함수를 추가하세요.
def create_board():
board = list(range(1, GRID_SIZE**2)) + [0] # 0은 빈 칸을 나타냅니다
random.shuffle(board)
return board
board = create_board()
5.퍼즐 조각 그리기
퍼즐 조각을 화면에 그리는 함수를 만들어 봅시다.
def draw_board():
for i, num in enumerate(board):
if num != 0:
x = (i % GRID_SIZE) * TILE_SIZE
y = (i // GRID_SIZE) * TILE_SIZE
pygame.draw.rect(SCREEN, BLACK, (x, y, TILE_SIZE, TILE_SIZE), 2)
font = pygame.font.Font(None, 36)
text = font.render(str(num), True, BLACK)
text_rect = text.get_rect(center=(x + TILE_SIZE//2, y + TILE_SIZE//2))
SCREEN.blit(text, text_rect)
게임 루프 안에 이 함수를 호출 하세요.
SCREEN.fill(WHITE)
draw_board()
pygame.display.flip()
6.퍼즐 조각 이동
이제 마우스 클릭으로 퍼즐 조각을 이동할 수 있게 만들어 봅시다.
def get_blank_neighbor(index):
blank = board.index(0)
if index % GRID_SIZE == blank % GRID_SIZE and abs(index - blank) == GRID_SIZE:
return blank
if index // GRID_SIZE == blank // GRID_SIZE and abs(index - blank) == 1:
return blank
return None
def move_tile(index):
blank = get_blank_neighbor(index)
if blank is not None:
board[blank], board[index] = board[index], board[blank]
게임 루프에 마우스 클릭 이벤트 처리를 추가해 주세요.
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
index = (y // TILE_SIZE) * GRID_SIZE + (x // TILE_SIZE)
move_tile(index)
7.게임 클리어 확인
퍼즐이 완성되었는지 확인하는 함수를 추가합니다.
def is_solved():
return board == list(range(1, GRID_SIZE**2)) + [0]
게임 루프에서 이 함수를 호출하고 승리 메시지를 표시합니다.
if is_solved():
font = pygame.font.Font(None, 48)
text = font.render("축하합니다!", True, (0, 255, 0))
text_rect = text.get_rect(center=(WIDTH//2, HEIGHT//2))
SCREEN.blit(text, text_rect)
8.타이머와 이동 횟수 추가
게임에 타이머와 이동 횟수를 추가하여 더 재미있게 만들어 봅시다.
import time
start_time = time.time()
moves = 0
# 게임 루프 안에 추가
elapsed_time = int(time.time() - start_time)
font = pygame.font.Font(None, 24)
time_text = font.render(f"시간: {elapsed_time}초", True, BLACK)
moves_text = font.render(f"이동: {moves}회", True, BLACK)
SCREEN.blit(time_text, (10, 10))
SCREEN.blit(moves_text, (10, 40))
# move_tile 함수 안에 추가
moves += 1
9.합쳐진 완벽한 코드

import pygame
import random
import time
# 초기화
pygame.init()
# 화면 설정
WIDTH, HEIGHT = 400, 400
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("파이썬 퍼즐 게임")
# 색상 정의
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
# 게임 변수
GRID_SIZE = 4
TILE_SIZE = WIDTH // GRID_SIZE
def create_board():
board = list(range(1, GRID_SIZE**2)) + [0] # 0은 빈 칸을 나타냅니다
random.shuffle(board)
return board
def draw_board():
for i, num in enumerate(board):
if num != 0:
x = (i % GRID_SIZE) * TILE_SIZE
y = (i // GRID_SIZE) * TILE_SIZE
pygame.draw.rect(SCREEN, BLACK, (x, y, TILE_SIZE, TILE_SIZE), 2)
font = pygame.font.Font(None, 36)
text = font.render(str(num), True, BLACK)
text_rect = text.get_rect(center=(x + TILE_SIZE//2, y + TILE_SIZE//2))
SCREEN.blit(text, text_rect)
def get_blank_neighbor(index):
blank = board.index(0)
if index % GRID_SIZE == blank % GRID_SIZE and abs(index - blank) == GRID_SIZE:
return blank
if index // GRID_SIZE == blank // GRID_SIZE and abs(index - blank) == 1:
return blank
return None
def move_tile(index):
global moves
blank = get_blank_neighbor(index)
if blank is not None:
board[blank], board[index] = board[index], board[blank]
moves += 1
def is_solved():
return board == list(range(1, GRID_SIZE**2)) + [0]
# 게임 초기화
board = create_board()
start_time = time.time()
moves = 0
# 게임 루프
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
index = (y // TILE_SIZE) * GRID_SIZE + (x // TILE_SIZE)
move_tile(index)
SCREEN.fill(WHITE)
draw_board()
# 타이머와 이동 횟수 표시
elapsed_time = int(time.time() - start_time)
font = pygame.font.Font(None, 24)
time_text = font.render(f"시간: {elapsed_time}초", True, BLACK)
moves_text = font.render(f"이동: {moves}회", True, BLACK)
SCREEN.blit(time_text, (10, 10))
SCREEN.blit(moves_text, (10, 40))
# 게임 클리어 확인
if is_solved():
font = pygame.font.Font(None, 48)
text = font.render("축하합니다!", True, GREEN)
text_rect = text.get_rect(center=(WIDTH//2, HEIGHT//2))
SCREEN.blit(text, text_rect)
pygame.display.flip()
pygame.quit()
마무리
이렇게 해서 기본적인 슬라이딩 퍼즐 게임이 완성되었습니다. 이 프로젝트를 통해 Pygame의 기본 사용법, 이벤트 처리, 2D 그래픽 그리기 등을 배웠습니다.
추가로 개선할 수 있는 부분들이 많이 있습니다. 예를 들어
- 난이도 선택 기능 추가
- 이미지를 사용한 퍼즐 만들기
- 최고 기록 저장 및 표시
- 애니메이션 효과 추가
이러한 기능들을 직접 구현해 보면서 파이썬과 Pygame에 대한 이해를 더욱 깊에 할 수 있을 것 입니다.
'IT > Python' 카테고리의 다른 글
[Python] TensorFlow를 이용한 딥러닝 모델 구현하기 (0) | 2025.01.20 |
---|---|
[Python] Turtle 그래픽을 이용한 미니 게임 만들기 (0) | 2025.01.20 |
[Python] 파이썬으로 텍스트 기반 RPG 게임 개발하기 (0) | 2025.01.19 |
[Python] Pygame으로 간단한 2D 게임 만들기 (0) | 2025.01.19 |
[Python] 파이썬을 이용한 암호화 및 복호화 기법 학습하기 (0) | 2025.01.18 |