用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!
相关文章:
用python和Pygame库实现“跳过障碍”游戏
用python和Pygame库实现“跳过障碍”游戏 游戏开发 跳过障碍游戏流程说明: 启动游戏后显示开始界面(包含游戏说明) 按空格键进入游戏 游戏过程中躲避障碍物获取分数 碰撞后显示结束界面(包含最终得分) 按空格键…...
C/C++中对字符处理的常用函数
C语言中的 ctype.h 头文件提供了一系列字符分类和转换函数,用于高效处理字符相关操作。这些函数通过接受 int 类型参数(需为 unsigned char 或 EOF (-1)值),返回非零值表示条件正确,返回0表示错…...
SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。
当 SQL Server 数据库被标记为 SUSPECT 状态时,表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤,基于搜索结果中的信息和常见的最佳实践: 恢复步骤 1. 确认数据库状态 将database-n…...
vue3实现虚拟滚动Vue-Virtual-Scroller
前端优化不可不避的一谈之虚拟滚动:众所周知,滚动是直挺挺的往dom树加东西,如果滚太多滚到万级,渲染过多就会卡顿,而vue-virtual-scroll的灵活懒渲染就能解决这个问题 1,下载与配置 npm install --save v…...
DAY33 贪心算法Ⅱ
122. 买卖股票的最佳时机 II - 力扣(LeetCode) 想到把整体利润分解为每天的利润,就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…...
C#核心笔记——(五)框架概述
.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中,并打包为一套程序集,与CLR一起构成了.NET平台。 有些.NET类型是由CLR直接使用的,且对于托管宿主环境而言是必不可少的。这些类型位于一个名为…...
HttpMediaTypeNotAcceptableException报错解决,状态码显示为406
当返回类没有添加 getter 和 setter 方法时出现 HTTP 406 错误(Not Acceptable),主要与 Spring 框架处理响应数据的机制以及消息转换器的工作原理有关 (注意前提,你已经添加了json相关库的依赖) 消息转换器…...
网络DNS怎么更改?
访问速度慢或某些网站无法打开?改变网络DNS设置可能会帮助解决这些问题。本文将详细介绍如何更改网络DNS,包括更改的原因、具体步骤。 一、为什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考虑因素:某些公共DNS服务器的响应速度比…...
【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动
目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错:无法提供服务,非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备,待执行设备…...
子母钟系统,京准电子科技助力高考精准计时
子母钟系统,京准电子科技助力高考精准计时 子母钟系统,京准电子科技助力高考精准计时 【摘要】子母钟系统又叫网络时钟系统是校园网络中一个重要的精准计时系统,随着网络的普及,许多校园都建了自己的校园专网,使用的…...
大模型中的剪枝、蒸馏是什么意思?
环境: 剪枝 蒸馏 问题描述: 大模型中的剪枝、蒸馏是什么意思? 解决方案: 大模型的剪枝(Pruning)和蒸馏(Distillation)是两种常见的模型优化技术,用于减少模型的大小…...
深度解析:主流大模型与智能体框架能力对比及实战指南
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 一、技术演进全景图二、主流大模型能力矩阵1. 闭源模型对比2. 开源模型对比 三、智能体框架深…...
Linux中的基本指令(下)
目录 mv指令 more指令 less指令 head指令 tail 指令 继续理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ‒r指令 grep 指令 关机 扩展命令 zip/unzip 指令 tar指令 关于rzsz 系统间的文件互传 接上! mv指令 m…...
关于矢量数据集图表
ui.Chart.feature.byFeature 函数 ui.Chart.feature.byFeature 是 Google Earth Engine (GEE) 中的一个函数,用于创建图表以可视化 FeatureCollection 中各个特征(features)的属性。它通常生成一个分组柱状图,其中: …...
第十七:go 反射
fmt.printf("%T",obj) // 打印 reflect 的类型 fmt.Printf("%T", obj) // *reflect.rtype //打印的是一个指针类型 reflect包 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和…...
3-002: MySQL 中使用索引一定有效吗?如何排查索引效果?
1. 索引失效的常见原因 虽然索引可以加速查询,但在某些情况下,MySQL 可能不会使用索引,甚至使用索引反而更慢。 以下是一些常见导致索引失效的原因: ① 查询条件使用了 ! 或 <> 原因:索引通常用于范围或等值查…...
【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP(Advanced Message Queuing Protocol)模块实现,提供了便捷的消息队列开发能力。 引…...
Pytorch系列教程:可视化Pytorch模型训练过程
深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解,使我们能够做出合理的决策。训练进度必须可视化的两种方法是:使用Matplotlib和Tensor Board。在本文…...
electron+vue+webview内嵌网页并注入js
vue内嵌网页可以使用iframe实现内嵌网页,但是只能通过postMessage间接通信,在electron环境下,vue可以直接使用webview来内嵌网页,支持 executeJavaScript、postMessage、send 等丰富的通信机制。 使用 webview的优势 性能更佳&…...
利用OpenResty拦截SQL注入
需求 客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql…...
CAD文件转换为STL
AutoCAD与STL格式简介 AutoCAD软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件,可以用于绘制二维制图和基本三维设计,通过它无需懂得编程,即可自动制图,因此它在全球广泛使用&…...
78_Pandasagg()和aggregate()的用法
78_Pandasagg()和aggregate()的用法 通过使用pandas.DataFrame和Series的agg()或aggregate()方法,可以对行或列同时应用多个操作进行聚合。agg()是aggregate()的别名,二者用法相同。 pandas.DataFrame.agg — pandas 2.1.3 文档 pandas.Series.agg —…...
QT:串口上位机
创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…...
C++跨平台开发环境搭建全指南:工具链选型与性能优化实战
C跨平台开发环境搭建全指南:工具链选型与性能优化实战 目录 开发环境搭建工具链选型性能优化实战常见问题排查 开发环境搭建 操作系统环境准备 Windows# 安装Visual Studio Build Tools choco install visualstudio2022buildtools choco install cmake --instal…...
数据批处理(队列方式)
数据批处理(队列方式) public class DataProcessor {private static final int THREAD_COUNT 4;private static final int QUEUE_SIZE 10;private LinkedBlockingQueue<Data> queue new LinkedBlockingQueue<>(QUEUE_SIZE);public DataP…...
win32汇编环境,网络编程入门之二
;运行效果 ;win32汇编环境,网络编程入门之二 ;本教程在前一教程的基础上,研究一下如何得到服务器的返回的信息 ;正常的逻辑是连接上了,然后我发送什么,它返回什么,但是这有一个很尴尬的问题。 ;就是如何表现出来。因为网络可能有延…...
MATLAB—从入门到精通的第二天
在第一天的学习中,我们掌握了 MATLAB 的安装配置、基础语法、变量管理和运算符的使用。本文将深入讲解 控制结构(嵌套 if、switch)、循环类型 和 向量操作,帮助读者进一步掌握 MATLAB 的核心编程技能。 1. 条件语句进阶 1.1 嵌套…...
【认识OpenThread协议】
OpenThread 是一种基于 IPv6 、IEEE 802.15.4 标准的低功耗无线 Mesh 网络协议,主要用于智能家居、物联网设备等场景。它的设计目标是实现设备之间的高效通信、低功耗运行和高可靠性。 OpenThread官方文档 ① 特性 低功耗: 适合电池供电的设备。 Mesh 网络: 支持多…...
驱动开发系列46 - Linux 显卡KMD驱动代码分析(七)- 显存管理
目录 一:概述 二:应用程序和UMD调用栈 三:KMD 显存分配和和映射过程 一:概述 显存管理是图形驱动程序中至关重要的一部分,涉及到从用户空间(UMD,User Mode Driver)到内核空间(KMD,Kernel Mode Driver)的显存分配和管理。本文将首先梳理从一个 OpenGL 应…...
MATLAB代码开发实战:从入门到高效应用
一、MATLAB生态系统的核心优势 (扩展原有内容,增加行业数据) MATLAB在全球工程领域的市场占有率已达67%(2024年IEEE统计),其核心优势体现在: 矩阵运算速度比传统编程快3-5倍包含22个专业工具箱…...
