当前位置: 首页 > news >正文

用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!

相关文章:

  • Spring Boot HikariCP数据库连接池入门
  • 【AI】Stable Diffusion安装
  • 文本处理Bert面试内容整理-BERT的缺点是什么?
  • 【MySQL基础-1】MySQL 用户管理指南:创建用户、修改密码与权限分配
  • 深入理解string:从模拟实现看本质
  • 嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)
  • SpringBoot3整合FastJSON2如何配置configureMessageConverters
  • J6打卡——pytorch实现ResNeXt-50实现猴痘检测
  • 什么是 Perceptual Loss(感知损失)?
  • ForceMimic:以力为中心的模仿学习,采用力运动捕捉系统进行接触丰富的操作
  • webpack和vite的区别
  • pyspark 数据处理的三种方式RDD、DataFrame、Spark SQL案例
  • 大模型中的微调LoRA是什么
  • 多视图几何--对极几何--从0-1理解对极几何
  • 个人记录的一个插件,Unity-RuntimeMonitor
  • static 用法,函数递归与迭代详解
  • Spring Cloud之远程调用OpenFeign参数传递
  • Unity单例模式更新金币数据
  • CI/CD—Jenkins配置Poll SCM触发自动构建
  • DETR详解
  • “宝马女司机驾车拖行虐猫”引关注,海口警方介入调查
  • 马上评|房屋“注胶堵漏”骗局何以屡屡得逞
  • 今晚油价下调,加满一箱油将省9元
  • 小米法务部:犯罪团伙操纵近万账号诋毁小米,该起黑公关案告破
  • 女巫的继承者们
  • AI创业者聊大模型应用趋势:可用性和用户需求是关键