使用 Pygame 的赛车游戏

PythonBeginner
立即练习

介绍

在这个项目中,你将学习如何使用 Pygame 库创建一个简单的赛车游戏。该游戏包含一辆玩家汽车和多辆敌方汽车。玩家可以使用箭头键左右移动汽车,而敌方汽车则向下移动屏幕。目标是尽可能长时间地避免与敌方汽车碰撞。当发生碰撞时,游戏将显示游戏结束屏幕,并允许玩家通过按“R”键重新开始游戏。

👀 预览

赛车游戏预览

🎯 任务

在这个项目中,你将学习:

  • 如何设置游戏窗口并导入必要的库
  • 如何定义颜色并加载汽车图像
  • 如何定义玩家汽车
  • 如何定义敌方汽车
  • 如何定义游戏结束变量和字体
  • 如何实现游戏逻辑
  • 如何显示游戏结束屏幕
  • 如何退出游戏

🏆 成果

完成这个项目后,你将能够:

  • 使用 Pygame 库创建游戏窗口
  • 在游戏中加载和显示图像
  • 处理游戏对象之间的碰撞
  • 实现用于持续游戏的游戏循环
  • 处理用户输入以控制游戏对象
  • 使用 Pygame 的字体模块在屏幕上显示文本
这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 中级 级别的实验,完成率为 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 列表中。

✨ 查看解决方案并练习

定义游戏结束变量和字体

## 定义游戏结束变量
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 变量中。

✨ 查看解决方案并练习

游戏循环

## 游戏循环
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:
        ## 游戏逻辑代码写在这里...

        ## 刷新窗口
        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:
        ## 游戏结束画面代码写在这里...

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

在这一步中,我们使用 while 循环设置游戏循环。只要 running 变量为 True,循环就会运行。我们通过检查事件类型和按键来处理诸如退出游戏和重新开始游戏等事件。当游戏未结束时,执行 if not game_over 块内的代码,其中包括游戏逻辑以及在屏幕上绘制玩家汽车和敌方汽车。当游戏结束时,执行 else 块内的代码,显示游戏结束画面。最后,我们更新显示并将帧率设置为每秒 60 帧。

✨ 查看解决方案并练习

游戏逻辑代码

if not game_over:
    ## 移动玩家汽车
    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

    ## 移动敌方汽车
    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)

        ## 检查碰撞
        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:
    ## 游戏结束画面
    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 属性在屏幕上居中显示。

✨ 查看解决方案并练习

退出游戏

## 退出游戏
pygame.quit()

在这最后一步中,当游戏循环退出时,我们退出游戏并关闭 Pygame 窗口。

现在,你可以使用以下命令运行游戏:

python racing_game.py
游戏窗口关闭截图
✨ 查看解决方案并练习

总结

恭喜你!你已经成功使用 Pygame 库创建了一个简单的赛车游戏。该游戏包括一辆可以左右移动的玩家汽车,以及多辆敌方汽车。目标是尽可能长时间地避免与敌方汽车发生碰撞。游戏还具有游戏结束画面,并且可以通过按下“R”键重新开始游戏。继续练习和实验,以提高你的游戏开发技能。