1. 2048 게임 로직 개요
안녕하세요! 이번 강의에서는 2048 게임의 핵심 로직을 구현하겠습니다. 지난 강의에서 4x4 게임판을 설계하고, 랜덤 숫자를 배치하는 기능을 만들었는데요. 오늘은 숫자를 이동하고 합치는 로직을 추가하고, 게임 상태를 관리하는 데이터 구조를 정의할 것입니다. 마지막으로 화살표 키 입력을 받아 숫자가 이동하는 기능을 구현하는 실습을 진행하겠습니다.
2. 숫자 이동 및 합치기 로직
이동 규칙
플레이어가 방향키(↑, ↓, ←, →)를 누르면 숫자가 해당 방향으로 이동합니다.
같은 숫자가 붙어있으면 합쳐져 더 큰 숫자가 됩니다.
숫자가 이동한 후, 빈 공간에 새로운 숫자(2 또는 4)가 무작위로 생성됩니다.
게임 상태 데이터 구조
2048 게임판은 4x4 2차원 리스트로 표현됩니다.
예제 1: 2048 게임판 초기화
import random
def create_grid():
return [[0] * 4 for _ in range(4)]
def add_new_number(grid):
empty_cells = [(r, c) for r in range(4) for c in range(4) if grid[r][c] == 0]
if empty_cells:
row, col = random.choice(empty_cells)
grid[row][col] = 2 if random.random() < 0.9 else 4
def initialize_game():
grid = create_grid()
add_new_number(grid)
add_new_number(grid)
return grid
grid = initialize_game()
숫자 이동 로직 구현
이동 및 합치기 로직을 구현하기 위해 다음 단계를 따릅니다:
숫자를 한 방향으로 밀어 이동.
같은 숫자가 만나면 합치기.
이동이 완료된 후, 새로운 숫자(2 또는 4) 추가.
예제 2: 숫자 왼쪽으로 이동하기
def compress(row):
new_row = [num for num in row if num != 0] # 0을 제외한 숫자만 모음
new_row += [0] * (4 - len(new_row)) # 남은 공간 0으로 채우기
return new_row
def merge(row):
for i in range(3):
if row[i] == row[i + 1] and row[i] != 0:
row[i] *= 2
row[i + 1] = 0 # 합쳐진 후 오른쪽 숫자 제거
return compress(row) # 다시 0을 제거하고 정렬
def move_left(grid):
return [merge(compress(row)) for row in grid]
모든 방향으로 숫자 이동하기
다른 방향으로 이동하는 기능도 구현해야 합니다.
예제 3: 이동 기능 확장
import numpy as np
def move_right(grid):
return [merge(compress(row[::-1]))[::-1] for row in grid]
def move_up(grid):
transposed = np.transpose(grid).tolist()
moved = move_left(transposed)
return np.transpose(moved).tolist()
def move_down(grid):
transposed = np.transpose(grid).tolist()
moved = move_right(transposed)
return np.transpose(moved).tolist()
3. 실습: 화살표 입력에 따라 숫자 이동
문제 설명
- 키보드 화살표 키 입력을 받아 숫자를 이동시키는 기능을 구현하세요.
- pygame 라이브러리를 사용하여 입력을 감지합니다.
코드
import pygame
# PyGame 초기화
pygame.init()
# 화면 설정
WIDTH, HEIGHT = 400, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2048 Game")
grid = initialize_game()
def handle_input(event, grid):
if event.key == pygame.K_LEFT:
return move_left(grid)
elif event.key == pygame.K_RIGHT:
return move_right(grid)
elif event.key == pygame.K_UP:
return move_up(grid)
elif event.key == pygame.K_DOWN:
return move_down(grid)
return grid
# 게임 루프
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
grid = handle_input(event, grid)
add_new_number(grid)
print(grid)
pygame.quit()
출력 예시
- 실행 후 **방향키(←, →, ↑, ↓)**를 누르면 숫자가 이동합니다.
- 이동이 완료된 후 새로운 숫자가 생성됩니다.
4. 실습 과제
1. 이동 가능 여부 확인 기능 추가
- 이동할 수 있는 칸이 없는 경우, 게임 오버 메시지를 출력하세요.
2. 2048 타일 생성 시 게임 종료 기능 추가
- 숫자 2048이 생성되면 "축하합니다! 2048을 만들었습니다!" 메시지를 출력하세요.
3. 점수 시스템 추가
- 숫자가 합쳐질 때 점수를 추가하는 기능을 구현하세요.
오늘 강의에서는 2048 게임의 핵심 로직을 구현하며, 사용자 입력에 따라 숫자를 이동하고 합치는 기능을 완성했습니다. for 루프와 리스트 조작을 활용하여 숫자를 이동시키는 로직을 설계하고, 같은 숫자가 만나면 합쳐지는 병합 로직을 구현하였습니다.
이제 게임의 기본적인 플레이 기능이 완성되었으며, 앞으로는 게임의 UI를 더욱 개선하고, 점수 시스템을 추가하는 과정을 진행할 예정입니다. 이번 실습에서 배운 리스트 조작, 이벤트 처리, 게임 상태 관리 기법은 다른 게임 및 프로젝트에서도 유용하게 활용될 수 있습니다.
다음 강의에서는 2048 게임판의 UI 디자인을 개선하고, 숫자에 따라 타일 색상이 변화하는 기능을 추가해 보겠습니다.
🚀 궁금한 점이나 피드백이 있다면 댓글로 남겨주세요. 여러분의 학습을 응원합니다! 😊
Python Day 20: 2048 게임판 설계 - 4x4 그리드 구현하기
1. 2048 게임판 설계 소개 안녕하세요! 오늘은 2048 게임을 만들기 위한 첫 번째 단계로 게임판(그리드) 설계를 진행하겠습니다. 2048은 4x4 크기의 그리드에서 숫자 타일을 합쳐 2048을 만드는 퍼즐
nerdcodex.tistory.com
Python Day 19: PyGame 설치 및 기본 구조 - 게임 개발을 위한 첫걸음
1. PyGame 소개 및 설치 안녕하세요! 오늘은 파이썬을 활용한 게임 개발 라이브러리인 PyGame을 설치하고 기본적인 구조를 익혀보겠습니다. PyGame은 간단한 2D 게임을 개발할 수 있도록 다양한 기능
nerdcodex.tistory.com
Python Day 18: OOP 종합 실습 - 객체지향 프로그래밍을 활용한 프로젝트 설계
1. 객체지향 프로그래밍(OOP) 종합 실습 소개안녕하세요! 오늘은 객체지향 프로그래밍(OOP)의 개념을 종합적으로 활용하는 실습을 진행해보겠습니다. 지금까지 배운 클래스, 상속, 다형성, 메서드
nerdcodex.tistory.com
'파이썬(Python)' 카테고리의 다른 글
Python Day 23: 2048 점수 시스템 추가 - 점수 계산 및 화면 출력 (0) | 2025.03.06 |
---|---|
Python Day 22: 2048 게임판 UI 디자인 - 타일 색상 및 폰트 설정 (0) | 2025.03.04 |
Python Day 20: 2048 게임판 설계 - 4x4 그리드 구현하기 (0) | 2025.02.27 |
Python Day 19: PyGame 설치 및 기본 구조 - 게임 개발을 위한 첫걸음 (0) | 2025.02.25 |
Python Day 18: OOP 종합 실습 - 객체지향 프로그래밍을 활용한 프로젝트 설계 (0) | 2025.02.20 |