Pygame Snake, 파트 3
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()
딕셔너리 방식을 사용하면 코드가 더 짧아지고 명확해지며, (예: 추가 제어 입력을 넣는 등) 확장하기도 쉬워집니다.