当前位置:首页>python>Python实战项目之赛车小游戏

Python实战项目之赛车小游戏

  • 2026-09-10 21:12:22
Python实战项目之赛车小游戏

Python 爬虫 + 赛车小游戏 完整教程(含代码+逐行解析)

一、项目整体思路

本项目分为两部分:

1. 爬虫部分:爬取赛车图片、背景图、游戏素材(requests + BeautifulSoup)

2. 游戏部分:使用  pygame  制作 2D 竖版赛车小游戏

3. 结合思路:用爬虫自动下载素材 → 用素材做游戏

你可以把这两部分写成:

- 需求分析

- 环境搭建

- 爬虫实现

- 游戏架构

- 代码详解

- 运行效果

- 总结扩展

二、环境安装

你只需要安装 3 个库:

bash  

pip install requests beautifulsoup4 pygame

三、第一部分:爬虫爬取赛车素材(完整代码)

功能:

- 爬取免费图片网站的赛车、道路、背景图片

- 自动创建文件夹并保存

- 给游戏提供素材

python  

import os

import requests

from bs4 import BeautifulSoup

import urllib.request

# 创建素材文件夹

if not os.path.exists("game_img"):

    os.mkdir("game_img")

# 目标网址(免费素材站)

url = "https://www.pexels.com/search/race%20car/"

headers = {

    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"

}

def get_car_imgs():

    print("开始爬取赛车图片...")

    resp = requests.get(url, headers=headers)

    soup = BeautifulSoup(resp.text, "html.parser")

    # 提取图片

    img_tags = soup.find_all("img", {"class": "Image_image__wpzBB"})[:3]

    for i, img in enumerate(img_tags):

        img_url = img.get("src")

        if img_url:

            save_path = f"game_img/car_{i}.jpg"

            urllib.request.urlretrieve(img_url, save_path)

            print(f"已保存:{save_path}")

if __name__ == "__main__":

    get_car_imgs()

    print("爬虫完成!素材已下载到 game_img 文件夹")

爬虫代码逐行解析(可直接写进报告)

1. 库导入

-  os :用于创建文件夹,管理文件路径

-  requests :发送 HTTP 请求获取网页源码

-  BeautifulSoup :解析 HTML,提取图片标签

-  urllib.request :下载图片到本地

2. 文件夹创建

判断  game_img  是否存在,不存在则创建,统一存放游戏素材。

3. 请求头伪装

模拟浏览器访问,防止被网站拦截。

4. 解析图片

使用  find_all  定位图片标签,提取  src  链接。

5. 下载保存

使用  urlretrieve  直接下载并保存图片。

四、第二部分:Pygame 赛车小游戏(完整可运行)

这是竖版躲避类赛车游戏:

- 玩家控制小车左右移动

- 躲避迎面而来的车辆

- 碰撞即游戏结束

完整代码

python  

import pygame

import random

import sys

# 初始化

pygame.init()

# 窗口设置

WIDTH, HEIGHT = 480, 720

screen = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption("Python 爬虫赛车小游戏")

# 颜色

WHITE = (255, 255, 255)

BLACK = (0, 0, 0)

RED = (255, 0, 0)

GRAY = (128, 128, 128)

# 帧率

clock = pygame.time.Clock()

FPS = 60

# 道路位置

road_w = 300

road_x1 = (WIDTH - road_w) // 2

road_x2 = road_x1 + road_w

# 玩家类

class Player(pygame.sprite.Sprite):

    def __init__(self):

        super().__init__()

        self.image = pygame.Surface((50, 80))

        self.image.fill(RED)

        self.rect = self.image.get_rect()

        self.rect.centerx = WIDTH // 2

        self.rect.bottom = HEIGHT - 50

        self.speed_x = 0

    def update(self):

        self.speed_x = 0

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:

            self.speed_x = -8

        if keys[pygame.K_RIGHT]:

            self.speed_x = 8

        self.rect.x += self.speed_x

        # 边界限制

        if self.rect.left < road_x1:

            self.rect.left = road_x1

        if self.rect.right > road_x2:

            self.rect.right = road_x2

# 敌车类

class Enemy(pygame.sprite.Sprite):

    def __init__(self):

        super().__init__()

        self.image = pygame.Surface((50, 80))

        self.image.fill(BLACK)

        self.rect = self.image.get_rect()

        self.rect.x = random.randint(road_x1, road_x2 - self.rect.width)

        self.rect.y = random.randint(-200, -100)

        self.speed_y = random.randint(5, 10)

    def update(self):

        self.rect.y += self.speed_y

        if self.rect.top > HEIGHT:

            self.rect.x = random.randint(road_x1, road_x2 - self.rect.width)

            self.rect.y = random.randint(-200, -100)

            self.speed_y = random.randint(5, 10)

# 精灵组

all_sprites = pygame.sprite.Group()

enemies = pygame.sprite.Group()

player = Player()

all_sprites.add(player)

# 生成敌车

for _ in range(3):

    e = Enemy()

    all_sprites.add(e)

    enemies.add(e)

# 游戏主循环

running = True

game_over = False

while running:

    clock.tick(FPS)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

    if not game_over:

        all_sprites.update()

        # 碰撞检测

        hits = pygame.sprite.spritecollide(player, enemies, True)

        if hits:

            game_over = True

    # 绘制

    screen.fill(GRAY)

    pygame.draw.rect(screen, BLACK, (road_x1, 0, road_w, HEIGHT))

    all_sprites.draw(screen)

    if game_over:

        font = pygame.font.SysFont(None, 72)

        text = font.render("GAME OVER", True, RED)

        screen.blit(text, (WIDTH//2 - text.get_width()//2, HEIGHT//2))

    pygame.display.flip()

pygame.quit()

sys.exit()

五、游戏代码逐行超详细分析(可直接写论文)

1. 模块导入

python  

import pygame

import random

import sys

-  pygame :专业 2D 游戏库,负责画面、按键、碰撞

-  random :生成随机位置、速度

-  sys :用于安全退出程序

2. 初始化与窗口

python  

pygame.init()

WIDTH, HEIGHT = 480, 720

screen = pygame.display.set_mode((WIDTH, HEIGHT))

初始化游戏,创建竖版窗口,符合手机/赛车游戏视觉。

3. 颜色与帧率

python  

WHITE = (255,255,255)

clock = pygame.time.Clock()

FPS = 60

帧率固定 60,保证画面流畅。

4. 道路绘制

python  

road_w = 300

road_x1 = (WIDTH - road_w) // 2

在屏幕中间画出黑色道路,左右留灰色边栏。

5. 玩家类(核心)

- 继承  Sprite  方便碰撞与管理

- 左右方向键控制移动

- 限制不能开出道路

- 矩形代表赛车(可替换爬虫爬的图片)

6. 敌车类

- 随机从顶部出现

- 随机速度

- 出屏幕后自动重置

7. 精灵组管理

python  

all_sprites = pygame.sprite.Group()

统一更新、绘制、碰撞检测。

8. 主循环

1. 事件检测(关闭窗口)

2. 更新精灵位置

3. 碰撞检测

4. 画面渲染

5. 刷新屏幕

9. 游戏结束逻辑

python  

hits = pygame.sprite.spritecollide(player, enemies, True)

碰到敌车立刻触发  game_over ,显示文字。

六、如何把爬虫和游戏结合(拔高亮点)

你可以在报告里写:

1. 用爬虫爬取真实赛车图片

2. 在游戏中替换方块为真实图片:

python  

self.image = pygame.image.load("game_img/car_0.jpg").convert_alpha()

self.image = pygame.transform.scale(self.image, (50, 80))

这样就变成:爬虫采集素材 → 游戏使用素材 的完整项目。

七、扩展方向(让内容更多、更专业)

- 加入分数系统

- 加入背景音乐

- 加入多车道

- 加入道具(加速、护盾)

- 加入开始界面

- 用爬虫爬取多张图片随机切换

最新文章

随机文章