Python 과 Pygame 을 사용한 뱀 게임

PythonBeginner
지금 연습하기

소개

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

👀 미리보기

Snake game preview screenshot

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • Pygame 을 사용하여 게임 창을 만드는 방법
  • 뱀의 움직임을 제어하기 위해 사용자 입력을 처리하는 방법
  • 뱀의 위치를 생성하고 업데이트하는 방법
  • 화면에 뱀과 파워업을 그리는 방법
  • 뱀과 파워업 간의 충돌을 감지하는 방법
  • 점수를 추적하는 방법
  • 화면에 점수를 표시하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 할 수 있습니다:

  • Pygame 을 사용하여 그래픽 게임 창을 생성
  • 사용자 입력을 처리하여 게임을 제어
  • 게임 객체를 생성하고 업데이트
  • 게임에서 충돌 감지
  • 게임 점수를 표시하고 업데이트

프로젝트 파일 생성

snake_game.py라는 새 파일을 만들고 코드 편집기에서 엽니다.

cd ~/project
touch snake_game.py
sudo pip install pygame

필요한 모듈 가져오기

snake_game.py 파일에서 pygamerandom 모듈을 가져옵니다:

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

Snake game running command

요약

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

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습