Pygame 을 사용한 레이싱 게임

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 Pygame 라이브러리를 사용하여 간단한 레이싱 게임을 만드는 방법을 배웁니다. 게임은 플레이어 자동차와 여러 대의 적 자동차로 구성됩니다. 플레이어 자동차는 화살표 키를 사용하여 좌우로 움직일 수 있으며, 적 자동차는 화면 아래로 이동합니다. 목표는 가능한 오랫동안 적 자동차와의 충돌을 피하는 것입니다. 충돌이 발생하면 게임 오버 화면이 표시되고, 플레이어는 "R" 키를 눌러 게임을 다시 시작할 수 있습니다.

👀 미리보기

Racing Game Preview

🎯 과제

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

  • 게임 창을 설정하고 필요한 라이브러리를 가져오는 방법
  • 색상을 정의하고 자동차 이미지를 로드하는 방법
  • 플레이어 자동차를 정의하는 방법
  • 적 자동차를 정의하는 방법
  • 게임 오버 변수와 글꼴을 정의하는 방법
  • 게임 로직을 구현하는 방법
  • 게임 오버 화면을 표시하는 방법
  • 게임을 종료하는 방법

🏆 성과

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

  • Pygame 라이브러리를 사용하여 게임 창을 생성합니다.
  • 게임에서 이미지를 로드하고 표시합니다.
  • 게임 객체 간의 충돌을 처리합니다.
  • 지속적인 게임 플레이를 위한 게임 루프를 구현합니다.
  • 사용자 입력을 처리하여 게임 객체를 제어합니다.
  • Pygame 의 글꼴 모듈을 사용하여 화면에 텍스트를 표시합니다.
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 72%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

프로젝트 파일 생성

  1. racing_game.py라는 새 파일을 생성합니다.
cd ~/project
touch racing_game.py
✨ 솔루션 확인 및 연습

게임 창 설정 및 필요한 라이브러리 가져오기

import pygame
import random

## Pygame 초기화
pygame.init()

## 게임 창 설정
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Racing Game")

이 단계에서는 pygame 라이브러리를 가져와 초기화합니다. 그런 다음, 너비 800 픽셀, 높이 600 픽셀로 게임 창을 설정합니다. 또한 창 제목을 "Racing Game"으로 설정합니다.

터미널에서 다음 명령을 실행하여 pygame 라이브러리를 설치합니다:

sudo pip install pygame
✨ 솔루션 확인 및 연습

색상 정의 및 자동차 이미지 로드

## 색상 정의
background_color = (30, 30, 30)
player_car_color = (255, 255, 255)
enemy_car_color = (255, 0, 0)
text_color = (255, 255, 255)

## 자동차 이미지 로드
player_car_img = pygame.image.load("player_car.png").convert_alpha()
enemy_car_img = pygame.image.load("enemy_car.png").convert_alpha()

이 단계에서는 게임에 사용될 몇 가지 색상을 정의합니다: background_color, player_car_color, enemy_car_color, 그리고 text_color. 또한 pygame.image.load() 함수를 사용하여 플레이어 자동차와 적 자동차의 이미지를 로드합니다.

player_car.pngenemy_car.png 이미지는 ~/project 디렉토리에 포함되어 있습니다.

✨ 솔루션 확인 및 연습

플레이어 자동차 정의

## 플레이어 자동차 정의
player_car_width = player_car_img.get_width()
player_car_height = player_car_img.get_height()
player_car_x = window_width // 2 - player_car_width // 2
player_car_y = window_height - player_car_height - 10
player_car_speed = 5

이 단계에서는 플레이어 자동차의 속성을 정의합니다: player_car_widthplayer_car_height는 플레이어 자동차 이미지의 치수로 설정됩니다. player_car_xplayer_car_y는 화면에서 플레이어 자동차의 초기 위치를 나타냅니다. player_car_speed는 플레이어 자동차가 얼마나 빨리 움직일 수 있는지를 결정합니다.

✨ 솔루션 확인 및 연습

적 자동차 정의

## 적 자동차 정의
enemy_cars = []
num_enemy_cars = 3
enemy_car_width = 80
enemy_car_height = 160
for _ in range(num_enemy_cars):
    enemy_car_x = random.randint(0, window_width - enemy_car_width)
    enemy_car_y = random.randint(-window_height, -enemy_car_height)
    enemy_car_speed = random.randint(2, 5)
    enemy_cars.append({"x": enemy_car_x, "y": enemy_car_y, "speed": enemy_car_speed})

이 단계에서는 적 자동차의 속성을 정의합니다: enemy_cars는 적 자동차 객체를 저장할 리스트입니다. num_enemy_cars는 게임 내 적 자동차의 수를 결정합니다. enemy_car_widthenemy_car_height는 적 자동차 이미지의 치수를 나타냅니다. 각 적 자동차에 대한 임의의 위치와 속도를 생성하고 이를 enemy_cars 리스트에 추가하기 위해 루프를 사용합니다.

✨ 솔루션 확인 및 연습

게임 오버 변수 및 폰트 정의

## Define game over variables
game_over = False
font = pygame.font.Font(None, 50)
game_over_text = font.render("Game Over", True, text_color)
restart_text = font.render("Press R to Restart", True, text_color)

이 단계에서는 게임 오버 화면과 관련된 변수를 정의합니다: game_over는 게임이 종료되었는지 여부를 나타내는 부울 변수입니다. font는 크기가 50 인 Pygame 폰트 객체입니다. 폰트를 사용하여 "Game Over" 텍스트와 "Press R to Restart" 텍스트를 렌더링하고 이를 game_over_textrestart_text 변수에 저장합니다.

✨ 솔루션 확인 및 연습

게임 루프

## Game loop
running = True
clock = pygame.time.Clock()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r and game_over:
                game_over = False
                player_car_x = window_width // 2 - player_car_width // 2
                player_car_y = window_height - player_car_height - 10
                for enemy_car in enemy_cars:
                    enemy_car["x"] = random.randint(0, window_width - enemy_car_width)
                    enemy_car["y"] = random.randint(-window_height, -enemy_car_height)

    if not game_over:
        ## Game logic code goes here...

        ## Refresh the window
        window.fill(background_color)
        window.blit(player_car_img, (player_car_x, player_car_y))
        for enemy_car in enemy_cars:
            window.blit(enemy_car_img, (enemy_car["x"], enemy_car["y"]))
    else:
        ## Game over screen code goes here...

    pygame.display.update()
    clock.tick(60)

이 단계에서는 while 루프를 사용하여 게임 루프를 설정합니다. 루프는 running 변수가 True인 동안 실행됩니다. 게임 종료 및 게임 재시작과 같은 이벤트를 이벤트 유형과 키를 확인하여 처리합니다. 게임이 끝나지 않은 경우, if not game_over 블록 내부의 코드가 실행되며, 여기에는 게임 로직과 플레이어 자동차 및 적 자동차를 화면에 그리는 작업이 포함됩니다. 게임이 종료되면 else 블록 내부의 코드가 실행되어 게임 오버 화면을 표시합니다. 마지막으로, 디스플레이를 업데이트하고 프레임 속도를 초당 60 프레임으로 설정합니다.

✨ 솔루션 확인 및 연습

게임 로직 코드

if not game_over:
    ## Move the player car
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and player_car_x > player_car_speed:
        player_car_x -= player_car_speed
    if (
        keys[pygame.K_RIGHT]
        and player_car_x < window_width - player_car_width - player_car_speed
    ):
        player_car_x += player_car_speed

    ## Move the enemy cars
    for enemy_car in enemy_cars:
        enemy_car["y"] += enemy_car["speed"]
        if enemy_car["y"] > window_height:
            enemy_car["x"] = random.randint(0, window_width - enemy_car_width)
            enemy_car["y"] = random.randint(-window_height, -enemy_car_height)
            enemy_car["speed"] = random.randint(2, 5)

        ## Check for collision
        if player_car_y < enemy_car["y"] + enemy_car_height:
            if (
                player_car_x < enemy_car["x"] + enemy_car_width
                and player_car_x + player_car_width > enemy_car["x"]
            ):
                game_over = True

이 단계에서는 게임 루프 내에서 게임 로직 코드를 구현합니다. 플레이어 자동차를 좌우로 이동시키기 위해 사용자 입력을 확인합니다. 적 자동차의 위치를 업데이트하고 플레이어 자동차와 적 자동차 사이에 충돌이 발생했는지 확인합니다. 충돌이 발생하면 game_over 변수를 True로 설정합니다.

✨ 솔루션 확인 및 연습

게임 오버 화면 코드

else:
    ## Game over screen
    window.fill(background_color)
    game_over_rect = game_over_text.get_rect(
        center=(window_width // 2, window_height // 2 - 50)
    )
    restart_rect = restart_text.get_rect(
        center=(window_width // 2, window_height // 2 + 50)
    )
    window.blit(game_over_text, game_over_rect)
    window.blit(restart_text, restart_rect)

이 단계에서는 게임 루프 내에서 게임 오버 화면 코드를 구현합니다. window.blit() 함수를 사용하여 게임 오버 텍스트와 재시작 텍스트를 화면에 표시합니다. 텍스트는 get_rect()center 속성을 사용하여 화면 중앙에 배치됩니다.

✨ 솔루션 확인 및 연습

게임 종료

## Quit the game
pygame.quit()

이 마지막 단계에서는 게임 루프가 종료될 때 게임을 종료하고 Pygame 창을 닫습니다.

이제 다음 명령을 사용하여 게임을 실행할 수 있습니다.

python racing_game.py
Game window closing screenshot
✨ 솔루션 확인 및 연습

요약

축하합니다! Pygame 라이브러리를 사용하여 간단한 레이싱 게임을 성공적으로 만들었습니다. 이 게임에는 좌우로 움직일 수 있는 플레이어 자동차와 여러 대의 적 자동차가 포함되어 있습니다. 목표는 가능한 한 오랫동안 적 자동차와의 충돌을 피하는 것입니다. 또한 게임 오버 화면과 "R" 키를 눌러 게임을 다시 시작하는 기능도 갖추고 있습니다. 게임 개발 기술을 향상시키기 위해 계속 연습하고 실험해 보세요.