티스토리 뷰

Part 02 pygame 라이브러리 소개

이 장에서는 Python으로 게임을 만들 때 사용할 수 있는 대표적인 라이브러리인 pygame에 대해 학습한다. 앞부분에서 게임의 기본 구조를 살펴보았다면, 이번 부분에서는 그 구조를 실제 코드로 구현하기 위해 필요한 도구를 알아본다. pygame은 게임 화면을 만들고, 키보드나 마우스 입력을 처리하며, 이미지와 도형을 화면에 출력할 수 있도록 도와주는 라이브러리이다. 일반적인 Python 코드만으로도 간단한 계산 프로그램은 만들 수 있지만, 게임처럼 화면이 계속 바뀌고 사용자의 입력에 실시간으로 반응하는 프로그램을 만들기 위해서는 별도의 기능이 필요하다. 이때 사용하는 도구가 바로 pygame이다.

이 단원에서는 pygame이 무엇인지 이해하고, 설치 방법을 확인한 뒤, 실제로 게임 화면을 만들기 위한 준비 과정을 학습한다.


필요 라이브러리: PyGame

pygame은 Python을 이용하여 게임을 만들 수 있도록 도와주는 오픈소스 라이브러리이다. 라이브러리란 개발자가 자주 사용하는 기능을 미리 만들어 놓은 코드 모음이라고 이해할 수 있다. 즉, 우리가 게임 화면을 처음부터 모두 직접 만들 필요 없이, pygame이 제공하는 기능을 활용하여 게임 창을 만들고, 그림을 출력하고, 키보드 입력을 처리할 수 있다.

pygame은 화면 출력, 이미지 출력, 키보드와 마우스 입력 처리, 애니메이션 구현, 음악이나 효과음 재생과 같은 기능을 제공한다. 따라서 초보자는 복잡한 그래픽 처리 원리를 모두 알지 못하여도, 기본 명령어를 사용하여 간단한 게임 화면을 만들 수 있다.

pygame을 사용하려면 먼저 설치가 필요하다. 설치 명령어는 다음과 같다.

pip install pygame

이 명령어는 터미널에서 입력한다. 이전에 hello.py 파일을 실행했던 터미널을 그대로 사용하면 된다. 설치가 정상적으로 완료되면 Python 코드에서 다음과 같이 pygame을 불러와 사용할 수 있다. 

import pygame
 

설치 확인- 터미널

pip show pygame

설치 확인- edit

import pygame
print(pygame.__version__)

pygame 공식 사이트 확인

pygame 공식 사이트에서는 pygame의 최신 버전, 문서, 예제, 업데이트 정보를 확인할 수 있다.
라이브러리를 사용할 때에는 공식 문서를 참고하는 습관이 중요하다.

https://www.pygame.org/news

 

pygame news

Over the next weeks we have plenty of game jams that people from the pygame communities take part in. The pygames hackathon runs from March 20th, 2023 to April 17th 2023, and is open to people in USA and Canada. For this one there's $12,700 in prizes. "If

www.pygame.org

pygame Turtorial

https://coderslegacy.com/python/python-pygame-tutorial/

 

Python PyGame Tutorial - The Complete Guide - CodersLegacy

The Python Pygame library consists of various modules and functions for graphics, audio, handling mouse input, events, animation and more.

coderslegacy.com


Part03. 게임 기본 뼈대 구현하기

pygame을 사용하여 게임 프로그램의 기본 뼈대를 구현한다. 앞에서 게임은 초기화 → 메인 루프 → 종료의 구조로 이루어진다고 학습하였다. 이제 이 개념을 실제 코드로 작성하면서, 게임 프로그램이 어떤 순서로 실행되는지 확인한다.

게임 기본 뼈대는 아직 완성된 게임은 아니다. 캐릭터 이동, 점수 계산, 충돌 처리와 같은 세부 기능이 들어가기 전, 게임이 실행될 수 있는 최소한의 구조를 만드는 단계이다. 집을 짓기 전에 기초 공사를 먼저 하는 것처럼, 게임을 만들 때에도 먼저 기본 구조를 안정적으로 작성하여야 한다.


Pygame의 핵심 구조

pygame 프로그램은 대부분 일정한 구조를 따른다. 먼저 pygame.init()을 사용하여 pygame 기능을 사용할 준비를 한다. 그다음 게임 화면을 생성하고, 게임이 실행되는 동안 반복될 게임 루프를 만든다. 마지막으로 게임이 끝나면 pygame.quit()과 sys.exit()를 사용하여 프로그램을 종료한다.

이 구조에서 가장 중요한 부분은 게임 루프이다. 게임 루프 안에서는 사용자의 입력을 확인하고, 게임 상태를 바꾸고, 변경된 결과를 화면에 다시 출력한다. 이 과정이 계속 반복되기 때문에 게임 화면이 멈추지 않고 실시간으로 반응하는 것처럼 보인다.

초보자는 이 코드를 단순히 외우기보다, 각 코드가 어떤 역할을 하는지 이해하여야 한다.

  1. pygame.init()은 준비 단계이고,
  2. pygame.display.set_mode()는 화면 생성 단계이며,
  3. while running:은 게임을 계속 실행시키는 반복 구조이다.
  4. pygame.quit()과 sys.exit()은 게임을 안전하게 끝내는 종료 단계이다.

초기화와 화면 생성

초기화는 게임을 시작하기 전에 필요한 기능을 사용할 수 있도록 준비하는 과정이다. 코드에서는 pygame.init()이 이 역할을 한다.

pygame.init()

이 코드를 실행하면 pygame 내부의 그래픽, 입력, 사운드와 관련된 기능을 사용할 준비가 된다. 따라서 pygame 프로그램을 시작할 때 가장 먼저 작성하는 코드 중 하나이다. 다음으로 화면을 생성한다. 

screen = pygame.display.set_mode((800, 600))
이 코드는 가로 800픽셀, 세로 600픽셀 크기의 게임 창을 만든다는 의미이다. 여기서 screen은 앞으로 도형이나 이미지를 출력할 화면 공간이다.

또한 다음 코드를 사용하여 게임 창의 제목을 설정할 수 있다.

pygame.display.set_caption("게임 기본 구조")
즉, 초기화와 화면 생성 단계는 게임이 실제로 실행될 공간을 만드는 과정이다. 화면이 만들어져야 그 위에 캐릭터, 배경, 점수, 도형 등을 출력할 수 있다.

게임 루프와 종료

이 화면에서는 pygame 프로그램에서 가장 중요한 부분인 게임 루프종료 처리를 설명한다. 게임 루프는 while running:으로 표현된다.

running = True
while running:
running 값이 True인 동안 게임은 계속 실행된다. 이 반복문 안에서 사용자의 입력을 확인하고, 게임 상태를 업데이트하고, 화면을 다시 그리는 작업이 반복된다. 그래서 게임 루프는 게임의 심장과 같은 역할을 한다.

게임 루프 안에는 다음과 같은 이벤트 처리 코드가 들어간다.

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
이 코드는 사용자가 게임 창의 닫기 버튼을 눌렀는지 확인하는 코드이다. 닫기 버튼을 누르면 pygame.QUIT 이벤트가 발생하고, running = False가 되면서 반복문이 종료된다.

반복문이 끝난 뒤에는 다음 코드가 실행된다.

pygame.quit()
sys.exit()
pygame.quit()은 pygame에서 사용하던 기능을 종료하는 역할을 한다. sys.exit()은 파이썬 프로그램 자체를 완전히 종료하는 역할을 한다. 따라서 게임을 안정적으로 끝내기 위해서는 두 코드를 함께 사용하는 것이 좋다.
# pygame 라이브러리 불러오기
import pygame                
import sys

# pygame 초기화 (게임 시작 준비)
pygame.init()               

#screen display
screen = pygame.display.set_mode((600, 400))  
pygame.display.set_caption('첫 번째 pygame 창!')

# game 실행 상태 변수
running = True    

# game loop start
while running: 
    
    for event in pygame.event.get():  
        # 이벤트 확인 (사용자 입력 감지)
        
        if event.type == pygame.QUIT:  
            # ⑦ 창 닫기 버튼 클릭 시
            
            running = False  
            # ⑧ 게임 루프 종료 (while 탈출)
# game end
pygame.quit()
sys.exit()

게임 기본 뼈대 구현하기 — 주요 핵심 개념

게임은 한 번 실행되고 끝나는 프로그램이 아니다. 사용자의 입력을 계속 확인하고, 입력에 따라 게임 상태를 바꾸며, 바뀐 결과를 화면에 계속 다시 보여준다. 이 반복 구조를 만드는 것이 while 반복문이다. 화면 출력에서는 보통 다음 순서를 따른다.

fill → draw 또는 blit → flip
fill()은 이전 화면을 지우는 역할을 한다. draw 또는 blit은 새로운 도형이나 이미지를 화면에 그리는 역할을 한다. flip()은 새로 그린 화면을 실제 게임 창에 보여주는 역할을 한다.

따라서 게임 화면은 매 순간 새로 그려진다고 이해하면 된다. 이전 장면을 지우고, 새로운 위치에 캐릭터를 그리고, 그 결과를 화면에 보여주는 과정이 매우 빠르게 반복된다. 

이 구조는 컴퓨팅 사고력의 관점에서도 중요하다. 게임을 만들 때에는 문제를 한꺼번에 해결하지 않는다. 먼저 입력을 확인하고, 그 입력에 따라 값을 바꾸고, 바뀐 결과를 출력하는 단계로 나누어 생각한다. 이것이 게임 프로그래밍에서의 기본적인 문제 분해 방식이다.


게임 기본 뼈대 구현하기 — 가이드라인 입력

guide09.txt
0.00MB

가이드라인에는 몇 가지 중요한 규칙이 포함되어 있다. 첫째, 질문에서 요청한 행동만 수행하도록 제한한다. 이는 불필요한 기능이 갑자기 추가되는 것을 막기 위한 규칙이다. 둘째, 변수명은 영어로 작성하도록 한다. 파이썬에서는 한글 변수명도 사용할 수 있지만, 프로그래밍 수업에서는 코드 가독성과 오류 예방을 위해 영어 변수명을 사용하는 것이 적절하다.

셋째, 게임 기본 구조를 반드시 지키도록 한다. 이 수업에서는 게임을 초기화, 메인 루프, 종료의 구조로 나누고, 메인 루프 안에서는 입력 처리 → 게임 업데이트 → 출력 처리가 반복되도록 구성한다. 이렇게 하면 생성된 코드가 복잡하게 보이더라도 각 코드가 어느 부분에 해당하는지 쉽게 구분할 수 있다.

또한 코드의 가독성을 높이기 위해 게임을 다섯 개의 함수로 나누어 작성하도록 요청한다. 다섯 개의 함수는 init(), handle_input(), update_game(), render(), run_game()이다. 각각 게임 초기화, 입력 처리, 게임 업데이트, 출력 처리, 전체 실행을 담당한다. 함수 이름을 통일하면 학생마다 생성된 코드가 조금씩 다르더라도 수업에서 함께 비교하고 수정하기가 쉬워진다.

심은 AI가 만든 코드를 그대로 사용하는 것이 아니라, 수업에서 정한 구조에 맞추어 생성하고 이해하는 것이다. 생성형 AI는 코드를 빠르게 만들어 주는 도구이지만, 어떤 구조가 좋은 코드인지 판단하는 것은 학습자의 역할이다.

pygame을 사용하여 게임의 기본 골격을 만들고 싶어.
간단한 예시 코드를 제공하여줘.

이 화면은 생성형 AI가 만든 기본 게임 코드의 예시를 보여준다. 코드에는 pygame을 불러오고, 화면을 만들고, 게임 루프를 실행하고, 키보드 입력을 받아 원을 움직이는 내용이 포함되어 있다. 
먼저 다음 코드는 pygame과 시스템 종료 기능을 사용하기 위해 필요한 라이브러리를 불러오는 부분이다.

import pygame
import sys
그다음 pygame.init()을 실행하여 pygame 기능을 사용할 준비를 한다. 이어서 WIDTH, HEIGHT 값을 이용하여 게임 화면의 크기를 정하고, pygame.display.set_mode()를 사용하여 실제 게임 창을 만든다.
pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simple Pygame Example")
이후 clock, FPS, running, x, y, speed와 같은 변수를 준비한다. clock과 FPS는 게임 화면이 너무 빠르게 실행되지 않도록 속도를 조절하는 데 사용된다. x, y는 캐릭터의 위치이고, speed는 캐릭터가 한 번에 이동하는 거리이다.

핵심은 while running:으로 시작하는 게임 루프이다. 이 반복문 안에서 사용자의 입력을 확인하고, 방향키 입력에 따라 x, y 좌표를 변경한다. 예를 들어 왼쪽 방향키가 눌리면 x 값을 줄이고, 오른쪽 방향키가 눌리면 x 값을 증가시킨다. 위쪽 방향키가 눌리면 y 값을 줄이고, 아래쪽 방향키가 눌리면 y 값을 증가시킨다.

if keys[pygame.K_LEFT]:
    x -= speed
if keys[pygame.K_RIGHT]:
    x += speed
if keys[pygame.K_UP]:
    y -= speed
if keys[pygame.K_DOWN]:
    y += speed
그다음 좌표가 화면 밖으로 나가지 않도록 제한한다. 이 부분은 캐릭터가 게임 창 밖으로 사라지지 않게 하는 안전 장치이다.

출력 처리에서는 먼저 screen.fill((0, 0, 0))으로 화면을 검은색으로 지운다. 이후 pygame.draw.circle()로 현재 좌표에 흰색 원을 그리고, pygame.display.flip()으로 화면을 갱신한다.

screen.fill((0, 0, 0))
pygame.draw.circle(screen, (255, 255, 255), (x, y), 20)
pygame.display.flip()
이 코드는 실행은 가능하지만, 초보자가 보기에는 한 코드 안에 모든 기능이 섞여 있다. 초기화, 입력 처리, 게임 업데이트, 출력 처리, 종료 처리가 구분 없이 작성되어 있기 때문에 나중에 기능을 추가하거나 오류를 수정할 때 어려움이 생길 수 있다.
생성된 코드는 실행될 수 있지만, 기능별 구분이 어렵다.
수업에서는 이 코드를 함수로 나누어 더 읽기 쉬운 구조로 정리한다.
 

☞함수 없이 작성한 기본 코드

import pygame
import sys

# pygame 초기화
pygame.init()

# 화면 크기 설정
WIDTH, HEIGHT = 600, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("기본 게임 코드")

# 프레임 속도 설정
clock = pygame.time.Clock()
FPS = 60

# 사각형 위치와 속도
x = 250
y = 150
speed = 5

# 게임 실행 상태
running = True

# 게임 메인 루프
while running:

    # 1. 입력 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        x -= speed
    if keys[pygame.K_RIGHT]:
        x += speed
    if keys[pygame.K_UP]:
        y -= speed
    if keys[pygame.K_DOWN]:
        y += speed

    # 2. 게임 업데이트
    # 사각형이 화면 밖으로 나가지 않도록 제한
    if x < 0:
        x = 0
    if x > WIDTH - 100:
        x = WIDTH - 100
    if y < 0:
        y = 0
    if y > HEIGHT - 100:
        y = HEIGHT - 100

    # 3. 출력 처리
    screen.fill((0, 0, 0))  # 화면 지우기
    pygame.draw.rect(screen, (255, 0, 0), (x, y, 100, 100))  # 사각형 그리기
    pygame.display.flip()  # 화면 갱신

    # 프레임 속도 제어
    clock.tick(FPS)

# 게임 종료
pygame.quit()
sys.exit()

게임 기본 뼈대 구현하기 — 함수화 추가

생성형 AI를 활용하여 만든 게임 기본 코드를 함수 중심 구조로 다시 정리하는 단계이다. 앞에서 생성한 코드는 실행은 가능하지만, 입력 처리, 좌표 계산, 화면 출력, 종료 코드가 한 곳에 섞여 있어 초보자가 기능별 역할을 구분하기 어렵다.

그래서 이번 단계에서는 게임 코드를 다섯 개의 함수로 나눈다. init()은 게임을 시작하기 위한 준비를 담당하고, handle_input()은 키보드나 마우스 입력을 처리한다. update_game()은 입력 결과를 바탕으로 좌표나 상태 값을 변경한다. render()는 변경된 결과를 화면에 출력한다. 마지막으로 run_game()은 전체 게임 흐름을 반복 실행한다.

함수로 나누면 코드가 길어져도 각 부분의 역할을 쉽게 찾을 수 있다. 예를 들어 캐릭터 이동이 이상하면 handle_input()이나 update_game()을 확인하면 되고, 화면에 그림이 보이지 않으면 render()를 확인하면 된다. 즉, 함수화는 단순히 코드를 보기 좋게 만드는 것이 아니라, 수정과 오류 해결을 쉽게 만드는 방법이다.

함수화된 코드 예시

함수화된 pygame 코드 전체 예시를 보여준다. 코드가 길어 보일 수 있지만, 중요한 것은 코드의 양이 아니라 역할별로 나뉘어 있다는 점이다.

먼저 위쪽에는 전역 변수들이 선언되어 있다. screen, clock, running, x, y, speed는 게임 전체에서 함께 사용하는 값이다. x와 y는 사각형의 위치를 나타내고, speed는 키보드를 눌렀을 때 이동하는 거리를 의미한다.

init() 함수는 게임을 시작하기 위한 준비를 담당한다. 이 함수 안에서 pygame.init()을 실행하고, 게임 창을 만들며, 창 제목과 시간 제어 객체를 설정한다.

handle_input() 함수는 사용자의 입력을 처리한다. 방향키가 눌렸는지 확인하고, 그에 따라 x, y 값을 변경한다. 또한 창 닫기 이벤트가 발생하면 running 값을 False로 바꾸어 게임 루프가 종료되도록 한다.

update_game() 함수는 게임 상태를 점검하고 조정한다. 예시 코드에서는 사각형이 화면 밖으로 나가지 않도록 좌표 값을 제한한다. 즉, 캐릭터가 화면을 벗어나지 않게 하는 안전 장치이다.

render() 함수는 화면을 다시 그리는 역할을 한다. 먼저 screen.fill()로 이전 화면을 지우고, pygame.draw.rect()로 현재 좌표에 사각형을 그린 뒤, pygame.display.flip()으로 화면을 갱신한다.

마지막으로 run_game() 함수는 전체 게임을 실행한다. 이 함수 안에서 init()을 한 번 실행하고, while running: 반복문 안에서 handle_input(), update_game(), render()를 계속 호출한다. 이 구조가 바로 게임의 핵심 흐름이다.


함수화 핵심 이해

함수화된 게임 코드에서 반드시 기억하여야 할 구조를 정리한 화면이다. 가장 중요한 순서는 다음과 같다.

init() → 준비
handle_input() → 입력
update_game() → 변화
render() → 출력
run_game() → 반복 실행
이 순서는 게임 프로그램을 이해하는 기본 틀이다. 먼저 init()으로 게임을 준비하고, 이후 run_game() 안의 while running: 반복문에서 입력, 변화, 출력이 계속 반복된다.
while running:
    handle_input()
    update_game()
    render()
이 구조는 “입력을 확인하고, 값을 바꾸고, 화면에 보여준다”는 의미이다. 게임은 이 세 과정이 빠르게 반복되면서 동작한다. 방향키를 누르면 입력이 처리되고, 캐릭터 좌표가 바뀌며, 바뀐 위치가 화면에 다시 출력된다. 이 흐름이 반복되면 사용자는 캐릭터가 움직이는 게임처럼 느끼게 된다.

따라서 이 화면의 핵심 문장은 다음과 같다.

입력 → 값 변경 → 화면 출력이 반복되면 게임이 된다.

함수로 나누어 작성한 코드

import pygame
import sys

# 전역 변수
WIDTH, HEIGHT = 600, 400
FPS = 60

screen = None
clock = None
running = True

x = 250
y = 150
speed = 5


# 1. 게임 초기화 함수
def init():
    global screen, clock

    pygame.init()

    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("함수화된 기본 게임 코드")

    clock = pygame.time.Clock()


# 2. 입력 처리 함수
def handle_input():
    global running, x, y

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:
        x -= speed
    if keys[pygame.K_RIGHT]:
        x += speed
    if keys[pygame.K_UP]:
        y -= speed
    if keys[pygame.K_DOWN]:
        y += speed


# 3. 게임 업데이트 함수
def update_game():
    global x, y

    # 사각형이 화면 밖으로 나가지 않도록 제한
    if x < 0:
        x = 0
    if x > WIDTH - 100:
        x = WIDTH - 100
    if y < 0:
        y = 0
    if y > HEIGHT - 100:
        y = HEIGHT - 100


# 4. 출력 처리 함수
def render():
    screen.fill((0, 0, 0))  # 화면 지우기

    pygame.draw.rect(
        screen,
        (255, 0, 0),
        (x, y, 100, 100)
    )  # 사각형 그리기

    pygame.display.flip()  # 화면 갱신


# 5. 게임 실행 함수
def run_game():
    global running

    init()

    while running:
        handle_input()    # 입력 처리
        update_game()     # 상태 변경
        render()          # 화면 출력

        clock.tick(FPS)   # 프레임 속도 제어

    pygame.quit()
    sys.exit()


# 프로그램 시작
run_game()

 함수 역할 코드에서 하는 일
init() 게임 초기화 pygame.init() 실행, 화면 생성, 창 제목 설정, 시간 제어 객체 생성
handle_input() 입력 처리 키보드 입력, 마우스 입력, 창 닫기 이벤트 확인
update_game() 게임 업데이트 캐릭터 좌표 변경, 충돌 확인, 점수 변경, 화면 밖 이동 제한
render() 출력 처리 화면 지우기, 도형 또는 이미지 그리기, 화면 갱신
run_game() 게임 실행 초기화 실행 후 게임 루프 안에서 입력 처리, 업데이트, 출력 반복
pygame.quit() 게임 종료 pygame에서 사용한 기능을 종료하고 게임 창 닫기
sys.exit() 프로그램 종료 실행 중인 프로그램을 완전히 끝냄

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함