소개
이 프로젝트는 Python 과 Pygame 라이브러리를 사용하여 뱀 게임을 만드는 과정을 안내합니다. 게임은 게임 창, 뱀, 파워업, 그리고 점수를 갖게 됩니다. 뱀은 게임 창 안에서 움직이며 파워업을 먹습니다. 뱀이 파워업을 먹으면 뱀의 길이가 1 증가합니다. 점수는 화면에 표시됩니다.
👀 미리보기

🎯 과제
이 프로젝트에서 다음을 배우게 됩니다:
- Pygame 을 사용하여 게임 창을 만드는 방법
- 뱀의 움직임을 제어하기 위해 사용자 입력을 처리하는 방법
- 뱀의 위치를 생성하고 업데이트하는 방법
- 화면에 뱀과 파워업을 그리는 방법
- 뱀과 파워업 간의 충돌을 감지하는 방법
- 점수를 추적하는 방법
- 화면에 점수를 표시하는 방법
🏆 성과
이 프로젝트를 완료하면 다음을 할 수 있습니다:
- Pygame 을 사용하여 그래픽 게임 창을 생성
- 사용자 입력을 처리하여 게임을 제어
- 게임 객체를 생성하고 업데이트
- 게임에서 충돌 감지
- 게임 점수를 표시하고 업데이트
프로젝트 파일 생성
snake_game.py라는 새 파일을 만들고 코드 편집기에서 엽니다.
cd ~/project
touch snake_game.py
sudo pip install pygame
필요한 모듈 가져오기
snake_game.py 파일에서 pygame 및 random 모듈을 가져옵니다:
import pygame
import random
Pygame 초기화
모듈을 가져온 후 Pygame 을 초기화합니다:
pygame.init()
게임 창 설정
게임 창의 너비, 높이 및 초당 프레임 수 (FPS) 를 정의합니다:
WIDTH = 800
HEIGHT = 600
FPS = 10
색상 정의
게임에서 사용되는 색상을 정의합니다:
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
BACKGROUND_COLOR = (50, 50, 50)
게임 창 설정 방법
정의된 너비와 높이로 게임 창을 설정합니다:
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Game")
clock = pygame.time.Clock()
위 코드에서 pygame.display.set_mode()는 지정된 너비와 높이로 디스플레이를 초기화하는 데 사용됩니다. pygame.display.set_caption()은 게임 창의 제목을 설정하는 데 사용됩니다. pygame.time.Clock()은 게임에서 시간을 추적하는 데 사용됩니다.
뱀 게임 뱀 설정하기
뱀의 블록 크기와 속도를 정의합니다:
snake_block_size = 20
snake_speed = 5
블록 크기를 20 으로, 속도를 5 로 설정합니다. 이는 뱀이 한 번에 5 픽셀씩 이동한다는 것을 의미합니다.
게임 변수 설정 방법
점수를 표시하기 위한 글꼴 스타일과 글꼴 크기를 정의합니다:
font_style = pygame.font.SysFont(None, 50)
score_font = pygame.font.SysFont(None, 35)
파워업 설정 방법
파워업의 블록 크기를 정의합니다:
powerup_block_size = 20
함수 정의 방법
다음 함수들을 정의합니다:
draw_snake(snake_block_size, snake_list)
이 함수는 화면에 뱀을 그립니다:
def draw_snake(snake_block_size, snake_list):
for x in snake_list:
pygame.draw.rect(
screen, GREEN, [x[0], x[1], snake_block_size, snake_block_size]
)
위 코드에서 pygame.draw.rect()는 화면에 사각형을 그리는 데 사용됩니다. 첫 번째 매개변수는 화면, 두 번째 매개변수는 색상, 세 번째 매개변수는 사각형의 위치와 크기입니다.
draw_powerup(powerup_x, powerup_y)
이 함수는 화면에 파워업을 그립니다:
def draw_powerup(powerup_x, powerup_y):
pygame.draw.rect(
screen, RED, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
)
위 코드에서 pygame.draw.rect()는 화면에 사각형을 그리는 데 사용됩니다. 첫 번째 매개변수는 화면, 두 번째 매개변수는 색상, 세 번째 매개변수는 사각형의 위치와 크기입니다.
display_score(score)
이 함수는 화면에 점수를 표시합니다:
def display_score(score):
value = score_font.render("Score: " + str(score), True, WHITE)
screen.blit(value, [10, 10])
위 코드에서 score_font.render()는 화면에 점수를 렌더링하는 데 사용됩니다. 첫 번째 매개변수는 표시할 텍스트, 두 번째 매개변수는 안티앨리어싱 (anti-aliasing), 세 번째 매개변수는 텍스트의 색상입니다. screen.blit()는 화면에 텍스트를 그리는 데 사용됩니다. 첫 번째 매개변수는 표시할 텍스트, 두 번째 매개변수는 텍스트의 위치입니다.
game_loop()
이 함수는 메인 게임 루프를 포함합니다:
def game_loop():
## Game loop code goes here
게임 루프 코드 완성하기
game_loop() 함수를 완성하여 while 루프 안에 게임 로직을 추가합니다.
def game_loop():
game_over = False
game_close = False
## 뱀의 시작 위치 설정
x1 = WIDTH / 2
y1 = HEIGHT / 2
x1_change = 0
y1_change = 0
## 뱀의 몸통 설정
snake_list = []
snake_length = 1
## 파워업 설정
powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
powerup_y = round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20
## 게임 루프 설정
while not game_over:
while game_close:
screen.fill(BACKGROUND_COLOR)
message = font_style.render("Press SPACE to play again", True, YELLOW)
screen.blit(message, [WIDTH / 2 - 200, HEIGHT / 2 - 50])
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
game_close = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
game_loop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block_size
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block_size
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block_size
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block_size
x1_change = 0
if x1 >= WIDTH or x1 < 0 or y1 >= HEIGHT or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
screen.fill(BACKGROUND_COLOR)
pygame.draw.rect(
screen, BLUE, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
)
snake_head = []
snake_head.append(x1)
snake_head.append(y1)
snake_list.append(snake_head)
if len(snake_list) > snake_length:
del snake_list[0]
for x in snake_list[:-1]:
if x == snake_head:
game_close = True
draw_snake(snake_block_size, snake_list)
display_score(snake_length - 1)
pygame.display.flip()
if x1 == powerup_x and y1 == powerup_y:
powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
powerup_y = (
round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20
)
snake_length += 1
clock.tick(snake_speed)
pygame.quit()
위 코드에서 pygame.QUIT는 게임을 종료하는 데 사용됩니다. pygame.KEYDOWN은 키가 눌렸는지 확인하는 데 사용됩니다. pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, 및 pygame.K_DOWN은 각각 왼쪽, 오른쪽, 위쪽 및 아래쪽 화살표 키가 눌렸는지 확인하는 데 사용됩니다. pygame.draw.rect()는 화면에 사각형을 그리는 데 사용됩니다. 첫 번째 매개변수는 화면, 두 번째 매개변수는 색상, 세 번째 매개변수는 사각형의 위치와 크기입니다. pygame.display.flip()은 화면을 업데이트하는 데 사용됩니다. pygame.time.Clock()은 게임에서 시간을 추적하는 데 사용됩니다. pygame.time.Clock.tick()은 게임의 FPS 를 설정하는 데 사용됩니다.
게임 실행하기
게임을 실행하기 위해 파일 끝에 다음을 추가합니다:
game_loop()
pygame.quit()
마지막으로, 데스크톱으로 전환하여 다음 명령을 사용하여 프로젝트를 실행합니다:
python snake_game.py

요약
축하합니다! Python 과 Pygame 라이브러리를 사용하여 뱀 게임을 성공적으로 만들었습니다. 이 프로젝트에서 게임 창 설정, 색상 정의, 뱀과 파워업 그리기, 점수 표시, 게임 로직 구현 방법을 배웠습니다. 이제 게임을 실행하고 즐길 수 있습니다.



