Pygame Snake, 파트 3

발행: (2026년 4월 22일 AM 08:25 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

키보드 입력으로 사각형 제어하기

방향 벡터 사용하기

뱀의 속도와 방향을 저장하는 편리한 방법은 pygame.Vector2를 이용하는 것입니다.
네 가지 방향은 다음과 같이 표현할 수 있습니다:

방향벡터
오른쪽Vector2(1, 0)
왼쪽Vector2(-1, 0)
Vector2(0, -1)
아래Vector2(0, 1)

Note: Pygame에서는 Y축이 아래쪽으로 증가하므로 “위”는 음수 Y 값을 사용합니다.

점(dot)을 만든 뒤에 속도 변수를 추가합니다:

vel = pygame.Vector2(1, 0)   # 오른쪽으로 시작

이벤트 루프 안에서 화살표 키를 처리합니다:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RIGHT:
        vel = pygame.Vector2(1, 0)
    if event.key == pygame.K_DOWN:
        vel = pygame.Vector2(0, 1)
    if event.key == pygame.K_LEFT:
        vel = pygame.Vector2(-1, 0)
    if event.key == pygame.K_UP:
        vel = pygame.Vector2(0, -1)

마지막으로 매 프레임마다 점의 위치를 업데이트합니다:

dot = dot + vel   # 또는 간단히: dot += vel

이제 프로그램을 실행하면 화살표 키로 사각형을 움직일 수 있습니다.

전체 예시 (Step 1)

import pygame

W = 30
H = 30
S = 20

# pygame setup
pygame.init()
screen = pygame.display.set_mode((W * S, H * S))
clock = pygame.time.Clock()
running = True

dot = pygame.Vector2(W / 2, H / 2)
vel = pygame.Vector2(1, 0)

while running:
    # poll for events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                vel = pygame.Vector2(1, 0)
            if event.key == pygame.K_DOWN:
                vel = pygame.Vector2(0, 1)
            if event.key == pygame.K_LEFT:
                vel = pygame.Vector2(-1, 0)
            if event.key == pygame.K_UP:
                vel = pygame.Vector2(0, -1)

    # clear screen
    screen.fill("white")

    # move and draw the square
    dot += vel
    square = pygame.Rect(dot * S, (S, S))
    screen.fill("black", square)

    # update display
    pygame.display.flip()
    clock.tick(20)

pygame.quit()

딕셔너리를 이용한 리팩터링

반복되는 if 문을 키를 속도 벡터에 매핑하는 딕셔너리로 교체할 수 있습니다:

key_vel = {
    pygame.K_RIGHT: pygame.Vector2(1, 0),
    pygame.K_DOWN:  pygame.Vector2(0, 1),
    pygame.K_LEFT:  pygame.Vector2(-1, 0),
    pygame.K_UP:    pygame.Vector2(0, -1)
}

이 정의를 메인 루프 바로 앞에 두세요. 그러면 KEYDOWN 처리 코드는 다음과 같이 간단해집니다:

if event.type == pygame.KEYDOWN and event.key in key_vel:
    vel = key_vel[event.key]

전체 예시 (리팩터링 버전)

import pygame

W = 30
H = 30
S = 20

# pygame setup
pygame.init()
screen = pygame.display.set_mode((W * S, H * S))
clock = pygame.time.Clock()
running = True

dot = pygame.Vector2(W / 2, H / 2)
vel = pygame.Vector2(1, 0)

# map keys to velocity vectors
key_vel = {
    pygame.K_RIGHT: pygame.Vector2(1, 0),
    pygame.K_DOWN:  pygame.Vector2(0, 1),
    pygame.K_LEFT:  pygame.Vector2(-1, 0),
    pygame.K_UP:    pygame.Vector2(0, -1)
}

while running:
    # poll for events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in key_vel:
            vel = key_vel[event.key]

    # clear screen
    screen.fill("white")

    # move and draw the square
    dot += vel
    square = pygame.Rect(dot * S, (S, S))
    screen.fill("black", square)

    # update display
    pygame.display.flip()
    clock.tick(20)

pygame.quit()

딕셔너리 방식을 사용하면 코드가 더 짧아지고 명확해지며, (예: 추가 제어 입력을 넣는 등) 확장하기도 쉬워집니다.

0 조회
Back to Blog

관련 글

더 보기 »

Pygame Snake, 파트 2

소개 파트 1에서는 1000 × 1000 픽셀 캔버스와 지속적으로 움직이는 50 × 50 픽셀 정사각형을 가진 기본 pygame 창을 설정했습니다. 뱀 게임을 위해 w...

Pygame Snake, 파트 1

소개 Pygame은 Python으로 2D 게임을 만들 수 있게 해주는 모듈입니다. 프로그래밍 개념을 배우기에 좋은 방법이며, 고전 게임인 Snake는 ...