当前位置: 首页 > 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 = 50class 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 = 2def init_game():"""初始化游戏数据"""global player_x, player_y, player_vel_y, obstacles, score, spawn_timerplayer_x = 50player_y = HEIGHT - PLAYER_SIZE  # 玩家初始位置在地面player_vel_y = 0obstacles = []score = 0spawn_timer = 0def 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//2for 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 += 50win.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, scoreclock = pygame.time.Clock()game_state = START_SCREENinit_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 = PLAYINGelif game_state == GAME_OVER:init_game()game_state = PLAYINGelif game_state == PLAYING and player_y >= HEIGHT - PLAYER_SIZE:  # 确保在地面才能跳跃player_vel_y = -JUMP_POWERif game_state == PLAYING:# 物理模拟player_vel_y += GRAVITYplayer_y += player_vel_y# 地面碰撞检测if player_y > HEIGHT - PLAYER_SIZE:player_y = HEIGHT - PLAYER_SIZEplayer_vel_y = 0# 障碍物生成(每SPAWN_RATE帧生成一个)spawn_timer += 1if 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 += 1obstacle.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!


http://www.mrgr.cn/news/93897.html

相关文章:

  • 从0开始的操作系统手搓教程33:挂载我们的文件系统
  • 若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
  • c语言笔记 getchar
  • 关于在electron(Nodejs)中使用 Napi 的简单记录
  • 多模态融合的分类、跨模态对齐的方法
  • 练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关
  • vue3 + xlsx 实现导入导出表格,导出动态获取表头和数据
  • Linux 离线部署Ollama和DeepSeek-r1模型
  • 零基础掌握Linux SCP命令:5分钟实现高效文件传输,小白必看!
  • IO学习---->线程
  • QT系列教程(20) Qt 项目视图便捷类
  • 『PostgreSQL』PGSQL备份与还原实操指南
  • 【测试框架篇】单元测试框架pytest(4):assert断言详解
  • 【Linux内核系列】:深入理解缓冲区
  • 《平面几何强化训练题集》第2章5到9题
  • [GHCTF 2025]SQL??? 【sqlite注入】
  • uniapp+Vue3 开发小程序的下载文件功能
  • 选择排序算法OpenMP并行优化
  • 从新手到专家:嵌入式代码空间优化技巧
  • 【组件安装】Rocky 8.10 安装Local License Server 25.03.0 for Linux