用python和Pygame库实现“跳过障碍”游戏

用python和Pygame库实现“跳过障碍”游戏

游戏开发

跳过障碍游戏流程说明:

启动游戏后显示开始界面(包含游戏说明)

按空格键进入游戏

游戏过程中躲避障碍物获取分数

碰撞后显示结束界面(包含最终得分)

按空格键可立即开始新一局游戏

运行效果:

游戏体验优化建议(代码中修改):

可通过调节OBSTACLE_SPEED改变游戏难度(当前值5)

修改SPAWN_RATE调整障碍物生成频率(当前60帧/个)

调整JUMP_POWER和GRAVITY改变跳跃手感(当前15和0.5)

源码如下:

import pygame
import sys

# 初始化 Pygame
pygame.init()

# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易跳过障碍")

# 颜色定义
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GROUND_COLOR = (0, 128, 0)
BLACK = (0, 0, 0)

# 玩家设置
PLAYER_SIZE = 50
JUMP_POWER = 15
GRAVITY = 0.5

# 地面设置
GROUND_HEIGHT = 50

class Obstacle:
    """障碍物类,包含碰撞体和计分标记"""
    def __init__(self, x, y, width, height):
        self.rect = pygame.Rect(x, y, width, height)
        self.passed = False  # 是否已经通过玩家并计分

# 障碍物参数设置
OBSTACLE_WIDTH = 40
OBSTACLE_HEIGHT = 120  # 增加高度确保碰撞
OBSTACLE_SPEED = 5
SPAWN_RATE = 60  # 障碍物生成间隔帧数

# 游戏状态常量
START_SCREEN = 0
PLAYING = 1
GAME_OVER = 2

def init_game():
    """初始化游戏数据"""
    global player_x, player_y, player_vel_y, obstacles, score, spawn_timer
    player_x = 50
    player_y = HEIGHT - PLAYER_SIZE  # 玩家初始位置在地面
    player_vel_y = 0
    obstacles = []
    score = 0
    spawn_timer = 0

def draw_start_screen():
    """绘制包含游戏说明的开始界面"""
    win.fill(WHITE)
    
    # 标题文字
    title_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 64)
    title_text = title_font.render("跳过障碍", True, BLUE)
    title_rect = title_text.get_rect(center=(WIDTH//2, HEIGHT//3))
    
    # 游戏说明
    instr_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
    instructions = [
        "游戏规则:",
        "按 空格键 跳跃躲避障碍",
        "坚持越久得分越高",
        "碰到红色障碍物游戏结束",
        "按 空格键 开始游戏"
    ]
    
    y_offset = HEIGHT//2
    for text in instructions:
        surf = instr_font.render(text, True, BLACK)
        rect = surf.get_rect(center=(WIDTH//2, y_offset))
        win.blit(surf, rect)
        y_offset += 50
    
    win.blit(title_text, title_rect)
    pygame.display.update()

def draw_game_over_screen(final_score):
    """绘制游戏结束界面"""
    win.fill(WHITE)
    
    over_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 64)
    over_text = over_font.render("游戏结束", True, RED)
    over_rect = over_text.get_rect(center=(WIDTH//2, HEIGHT//3))
    
    score_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 48)
    score_text = score_font.render(f"最终得分: {final_score}", True, BLACK)
    score_rect = score_text.get_rect(center=(WIDTH//2, HEIGHT//2))
    
    instr_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
    restart_text = instr_font.render("按 空格键 重新开始", True, BLACK)
    restart_rect = restart_text.get_rect(center=(WIDTH//2, HEIGHT*2//3))
    
    win.blit(over_text, over_rect)
    win.blit(score_text, score_rect)
    win.blit(restart_text, restart_rect)
    pygame.display.update()

def game_loop():
    """游戏主逻辑循环"""
    global player_y, player_vel_y, spawn_timer, score
    
    clock = pygame.time.Clock()
    game_state = START_SCREEN
    init_game()
    font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)

    while True:
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if game_state == START_SCREEN:
                        game_state = PLAYING
                    elif game_state == GAME_OVER:
                        init_game()
                        game_state = PLAYING
                    elif game_state == PLAYING and player_y >= HEIGHT - PLAYER_SIZE:  # 确保在地面才能跳跃
                        player_vel_y = -JUMP_POWER

        if game_state == PLAYING:
            # 物理模拟
            player_vel_y += GRAVITY
            player_y += player_vel_y

            # 地面碰撞检测
            if player_y > HEIGHT - PLAYER_SIZE:
                player_y = HEIGHT - PLAYER_SIZE
                player_vel_y = 0

            # 障碍物生成(每SPAWN_RATE帧生成一个)
            spawn_timer += 1
            if spawn_timer >= SPAWN_RATE:
                # 生成位置调整:底部与地面接触
                new_obstacle = Obstacle(
                    WIDTH,  # 初始在屏幕右外侧
                    HEIGHT - OBSTACLE_HEIGHT,  # 直接接触地面
                    OBSTACLE_WIDTH,
                    OBSTACLE_HEIGHT
                )
                obstacles.append(new_obstacle)
                spawn_timer = 0

            # 移动障碍物并检测通过
            player_rect = pygame.Rect(player_x, player_y, PLAYER_SIZE, PLAYER_SIZE)
            for obstacle in obstacles[:]:
                # 移动障碍物
                obstacle.rect.x -= OBSTACLE_SPEED
                
                # 计分检测:障碍物完全通过玩家且未被标记
                if obstacle.rect.right < player_rect.left and not obstacle.passed:
                    score += 1
                    obstacle.passed = True  # 标记为已计分
                
                # 移除移出屏幕的障碍物
                if obstacle.rect.right < 0:
                    obstacles.remove(obstacle)
                
                # 碰撞检测(使用像素完美碰撞检测)
                if player_rect.colliderect(obstacle.rect):
                    game_state = GAME_OVER

            # 绘制游戏画面
            win.fill(WHITE)
            # 绘制地面
            pygame.draw.rect(win, GROUND_COLOR, (0, HEIGHT - GROUND_HEIGHT, WIDTH, GROUND_HEIGHT))
            # 绘制玩家
            pygame.draw.rect(win, BLUE, player_rect)
            # 绘制障碍物
            for obstacle in obstacles:
                pygame.draw.rect(win, RED, obstacle.rect)
            # 显示得分
            score_text = font.render(f"得分: {score}", True, BLACK)
            win.blit(score_text, (10, 10))
            pygame.display.update()

        elif game_state == START_SCREEN:
            draw_start_screen()
        elif game_state == GAME_OVER:
            draw_game_over_screen(score)

        clock.tick(60)

if __name__ == "__main__":
    game_loop()

打包发布

PyInstaller 是一个流行的 Python 打包工具,可以将 Python 应用程序及其依赖项打包成单个可执行文件(如 Windows 上的.exe 文件)。PyInstaller 的核心功能是将 Python 脚本及其依赖的模块和资源文件打包成一个独立的可执行文件。

对于非技术用户来说,运行一个独立的可执行文件比安装 Python 环境和依赖库要简单得多。

对于开发者来说,可以将程序打包成一个文件或一个目录,方便分发和部署。

PyInstaller针对Windows、macOS和Linux进行了测试。但是,它不是交叉编译器;要制作Windows应用程序,您可以在Windows上运行PyInstaller,要制作Linux应用程序,您可以在Linux上运行它等。

官方文档 https://pyinstaller.org/en/stable/

关于pyinsatller安装使用可参见:

使用pyinsatller将python程序项目发布为可执行文件(修订版)

https://blog.csdn.net/cnds123/article/details/115254418

我这里将本游戏命名为: 跳过障碍.py ,将之复制到文件夹 “D:\跳过障碍游戏”中。

打开命令行(终端)窗口,并导航到. py文件所在的目录,然后使用以下命令构建您的应用程序:

cd /d D:\跳过障碍游戏

pyinstaller -F -w 跳过障碍.py

-F或--onefile:将 Python 脚本及其所有依赖项打包成一个单独的可执行文件(例如 .exe 文件)。

使用 -w 或 --windowed 选项,你可以确保打包后的程序在运行时不显示控制台窗口,从而提供更干净的用户体验。

OK!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值