이번 편의 목표: pygame을 설치하고, 닫기 버튼을 누를 때까지 화면을 계속 다시 그리는 빈 창을 띄웁니다.

먼저 Python 버전을 확인합니다. 3.10 이상이면 됩니다. Windows에서는 python 대신 py를 써도 됩니다.

python3 --version

pygame은 pip로 설치합니다. 설치가 끝나면 버전을 출력해 제대로 들어갔는지 봅니다.

python3 -m pip install pygame

python3 -c "import pygame; print(pygame.version.ver)"

2.6.1 같은 버전 숫자가 나오면 준비가 끝났습니다. 작업 폴더를 하나 만들고 그 안에 tetris.py를 만듭니다.

게임 루프

게임 프로그램은 대부분 같은 모양의 반복문을 가집니다. 입력을 확인하고, 상태를 바꾸고, 화면을 그리는 일을 1초에 수십 번 되풀이합니다. 이 반복을 게임 루프라고 부릅니다. 이번 편에서는 상태가 아직 없으니 입력 확인과 그리기만 합니다.

pygame.init()은 pygame의 하위 모듈을 한꺼번에 준비합니다. set_mode는 가로, 세로 픽셀 크기로 창을 만들고, 그 창에 그림을 그릴 수 있는 화면 객체를 돌려줍니다.

clock.tick(FPS)는 반복이 너무 빨리 돌지 않게 붙잡아 둡니다. FPS가 60이면 1초에 많아야 60번 돌도록 기다립니다. 이 함수가 없으면 CPU 하나를 쉬지 않고 씁니다.

pygame.event.get()은 그 사이에 쌓인 입력을 모두 꺼냅니다. 창의 닫기 버튼을 누르면 QUIT 이벤트가 들어오고, 그때 pygame을 정리한 뒤 프로그램을 끝냅니다. 이벤트를 꺼내지 않으면 운영체제가 창이 응답하지 않는다고 판단합니다.

screen.fill로 화면 전체를 배경색으로 칠하고, pygame.display.flip()으로 지금까지 그린 내용을 실제 창에 내보냅니다. 그리는 동안의 중간 모습은 보이지 않고, flip을 부를 때 한 번에 바뀝니다.

색은 빨강, 초록, 파랑을 0부터 255까지의 숫자로 적은 튜플입니다. (18, 18, 24)는 푸른 기가 조금 도는 검정입니다.

전체 코드

Python
import sys

import pygame

WIDTH, HEIGHT = 480, 600
FPS = 60

BACKGROUND = (18, 18, 24)


def main():
    pygame.init()
    pygame.display.set_caption("Tetris")
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    clock = pygame.time.Clock()

    while True:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        screen.fill(BACKGROUND)
        pygame.display.flip()


if __name__ == "__main__":
    main()

python3 tetris.py

어두운 빈 창이 뜨고, 제목 표시줄에 Tetris가 보이면 성공입니다. 닫기 버튼을 누르면 프로그램이 끝납니다.

직접 해 보기

배경을 짙은 남색 (10, 20, 60)으로 바꾸고, 창 제목을 My Tetris로 바꿔 보세요.

해설

BACKGROUND 상수의 값을 (10, 20, 60)으로, set_caption의 인자를 "My Tetris"로 바꾸면 됩니다. 색을 상수로 위에 모아 둔 이유가 여기 있습니다. 쓰는 곳이 여러 군데여도 한 줄만 고치면 됩니다.