Гоночная игра с использованием Pygame

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь создавать простую гоночную игру с использованием библиотеки Pygame. В игре участвует игрока в автомобиле и несколько автомобилей противника. Игровой автомобиль можно перемещать влево и вправо с помощью стрелок клавиатуры, в то время как автомобили противника движутся вниз по экрану. Задача - как можно дольше избегать столкновений с автомобилями противника. Игра будет отображать экран "Игра окончена", когда происходит столкновение, и позволять игроку перезапустить игру, нажав клавишу "R".

👀 Предварительный просмотр

Предварительный просмотр гоночной игры

🎯 Задачи

В этом проекте вы научитесь:

  • настраивать игровое окно и импортировать необходимые библиотеки;
  • определять цвета и загружать изображения автомобилей;
  • определять игровой автомобиль игрока;
  • определять автомобили противника;
  • определять переменные и шрифт для экрана "Игра окончена";
  • реализовывать игровую логику;
  • отображать экран "Игра окончена";
  • выходить из игры.

🏆 Достижения

После завершения этого проекта вы сможете:

  • использовать библиотеку Pygame для создания игрового окна;
  • загружать и отображать изображения в игре;
  • обрабатывать столкновения между игровыми объектами;
  • реализовывать игровой цикл для непрерывной игры;
  • обрабатывать ввод пользователя для управления игровыми объектами;
  • отображать текст на экране с использованием модуля шрифтов Pygame.

Создайте файлы проекта

  1. Создайте новый файл с именем racing_game.py.
cd ~/project
touch racing_game.py
✨ Проверить решение и практиковаться

Настройте игровое окно и импортируйте необходимые библиотеки

import pygame
import random

## Initialize Pygame
pygame.init()

## Set up the game window
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
✨ Проверить решение и практиковаться

Определите цвета и загрузите изображения автомобилей

## Define colors
background_color = (30, 30, 30)
player_car_color = (255, 255, 255)
enemy_car_color = (255, 0, 0)
text_color = (255, 255, 255)

## Load car images
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.png и enemy_car.png находятся в каталоге ~/project.

✨ Проверить решение и практиковаться

Определите игровой автомобиль игрока

## Define the player car
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_width и player_car_height задаются размером изображения игрового автомобиля игрока. player_car_x и player_car_y представляют начальную позицию игрового автомобиля игрока на экране. player_car_speed определяет, насколько быстро может двигаться игровой автомобиль игрока.

✨ Проверить решение и практиковаться

Определите автомобили противника

## Define the enemy cars
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_width и enemy_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 - это объект шрифта Pygame размером 50. Мы выводим текст "Game Over" и "Press R to Restart" с использованием шрифта и сохраняем их в переменных game_over_text и restart_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". Продолжайте практиковаться и экспериментировать, чтобы улучшить свои навыки в разработке игр.