综合章节:游戏功能扩展与深度开发
模块一:外星人管理与碰撞系统
目标:生成动态外星人群,处理移动、触边检测与子弹碰撞。
# alien.py(基础外星人类)
class Alien(Sprite):def __init__(self, game):super().__init__()self.screen = game.screenself.image = pygame.image.load('alien.bmp')self.rect = self.image.get_rect()self.rect.x = self.rect.width # 初始位置self.rect.y = self.rect.heightself.x = float(self.rect.x) # 精确水平位置(浮点数)def update(self):"""水平移动外星人"""self.x += self.settings.alien_speed * self.settings.fleet_directionself.rect.x = self.xdef check_edges(self):"""检测是否触边"""screen_rect = self.screen.get_rect()return self.rect.right >= screen_rect.right or self.rect.left <= 0# alien_invasion.py(外星人群管理)
class AlienInvasion:def _create_fleet(self):"""生成多行多列外星人"""alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - 2 * alien_widthnumber_aliens_x = available_space_x // (2 * alien_width)available_space_y = self.settings.screen_height - 3 * alien_heightnumber_rows = available_space_y // (2 * alien_height)for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _check_fleet_edges(self):"""触边后下移并反向"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""下移并反转方向"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _check_collisions(self):"""子弹与外星人碰撞检测"""collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if collisions:self.stats.score += self.settings.alien_points * sum(len(v) for v in collisions.values())self.sb.prep_score()self._check_high_score()
模块二:计分系统与游戏统计
目标:实时跟踪得分、最高分、剩余生命与关卡进度。
# game_stats.py
class GameStats:def __init__(self, game):self.settings = game.settingsself.reset_stats()self.high_score = 0self._load_high_score() # 从文件加载历史最高分def reset_stats(self):self.ships_left = self.settings.ship_limitself.score = 0self.level = 1def _load_high_score(self):try:with open("high_score.txt", "r") as f:self.high_score = int(f.read())except FileNotFoundError:pass # 首次运行无文件则保持0# scoreboard.py(UI渲染)
class Scoreboard:def __init__(self, game):self.screen = game.screenself.stats = game.statsself.text_color = (255, 255, 255)self.font = pygame.font.SysFont("Consolas", 32)self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""格式化得分并渲染图像"""rounded_score = round(self.stats.score, -1)score_str = f"Score: {rounded_score:,}"self.score_image = self.font.render(score_str, True, self.text_color)self.score_rect = self.score_image.get_rect(right=self.screen_rect.right - 20, top=20)def prep_high_score(self):"""渲染最高分"""high_score_str = f"High Score: {self.stats.high_score:,}"self.high_score_image = self.font.render(high_score_str, True, self.text_color)self.high_score_rect = self.high_score_image.get_rect(centerx=self.screen_rect.centerx, top=20)def prep_ships(self):"""显示剩余生命图标"""self.ships = pygame.sprite.Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.game)ship.rect.x = 10 + ship_number * (ship.rect.width + 5)ship.rect.y = 10self.ships.add(ship)
模块三:菜单、音效与暂停功能
目标:实现主菜单界面、音效播放和游戏暂停逻辑。
# button.py(菜单按钮)
class Button:def __init__(self, game, msg, y_offset=0):self.screen = game.screenself.rect = pygame.Rect(0, 0, 200, 50)self.rect.center = game.screen_rect.centerself.rect.y += y_offsetself._prep_msg(msg)def _prep_msg(self, msg):"""渲染按钮文字"""self.msg_image = pygame.font.SysFont("Consolas", 36).render(msg, True, (255, 255, 255))self.msg_image_rect = self.msg_image.get_rect(center=self.rect.center)def draw(self):"""绘制按钮"""self.screen.fill((0, 135, 0), self.rect) # 绿色背景self.screen.blit(self.msg_image, self.msg_image_rect)# alien_invasion.py(音效与状态管理)
class AlienInvasion:def _load_sounds(self):"""加载所有音效资源"""self.bg_music = pygame.mixer.Sound('sounds/bg_music.mp3')self.shoot_sound = pygame.mixer.Sound('sounds/shoot.wav')self.explosion_sound = pygame.mixer.Sound('sounds/explosion.wav')self.bg_music.set_volume(0.3)self.bg_music.play(-1) # 循环播放背景音乐def _check_events(self):"""处理菜单事件"""for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_p: # 按P键暂停self.paused = not self.pausedelif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos) # 点击Play按钮def _update_screen(self):"""动态绘制界面"""self.screen.fill(self.settings.bg_color)if self.game_active:self.ship.blitme()self.bullets.draw(self.screen)self.aliens.draw(self.screen)self.sb.show_score()else:self.play_button.draw() # 显示主菜单pygame.display.flip()
模块四:多样化敌人与技能系统
目标:扩展敌人类型,实现护盾、炸弹等特殊技能。
# alien.py(扩展敌人)
class ShieldAlien(Alien):def __init__(self, game):super().__init__(game)self.image = pygame.image.load('images/shield_alien.bmp')self.shield = 2 # 护盾层数def hit(self):"""被击中时减少护盾"""self.shield -= 1if self.shield <= 0:self.kill()class ShootingAlien(Alien):def __init__(self, game):super().__init__(game)self.shoot_cooldown = 2000 # 射击间隔(毫秒)self.last_shot = pygame.time.get_ticks()def try_shoot(self):"""尝试发射子弹"""current_time = pygame.time.get_ticks()if current_time - self.last_shot > self.shoot_cooldown:self.last_shot = current_timereturn AlienBullet(self.rect.center) # 返回子弹对象# ship.py(技能实现)
class Ship:def __init__(self, game):# ...原有代码...self.shield_active = Falseself.shield_start_time = 0self.bomb_count = 3 # 初始炸弹数量def activate_shield(self):"""激活护盾(持续5秒)"""if not self.shield_active:self.shield_active = Trueself.shield_start_time = pygame.time.get_ticks()def use_bomb(self):"""使用炸弹清屏"""if self.bomb_count > 0:self.bomb_count -= 1self.game.aliens.empty()self.game.bullets.empty()
系统整合与交互逻辑
1. 初始化流程:
class AlienInvasion:def __init__(self):pygame.init()self.settings = Settings()self.stats = GameStats(self)self.sb = Scoreboard(self)self.ship = Ship(self)self.aliens = pygame.sprite.Group()self.bullets = pygame.sprite.Group()self._create_fleet() # 生成初始外星人群self._load_sounds()self.play_button = Button(self, "Play", y_offset=-50)self.quit_button = Button(self, "Quit", y_offset=50)
2. 主游戏循环:
def run_game(self):while True:self._check_events()if self.game_active and not self.paused:self.ship.update()self._update_bullets()self._update_aliens()self._check_collisions()self._check_aliens_bottom() # 检测外星人触底self._update_screen()
关键设计总结
1. 模块化架构:各功能(外星人、计分、菜单、技能)独立实现,通过主类协调。
2. 事件驱动:统一事件循环处理输入、状态切换与资源更新。
3. 资源管理:集中加载图像、音效,支持动态替换(如护盾外星人图片)。
4. 可扩展性:通过继承(ShieldAlien)和组合(Scoreboard)灵活扩展功能。
调试与优化策略
1. 性能监控:使用 pygame.time.Clock() 控制帧率,避免CPU过载。
2. 碰撞优化:利用 pygame.sprite.Group 的批量检测代替逐元素遍历。
3. 内存管理:及时销毁越界子弹和死亡外星人,减少资源占用。
4. 平衡性调整:在 Settings 类中集中定义速度、生命值等参数,便于快速迭代。
相关文章:
综合章节:游戏功能扩展与深度开发
模块一:外星人管理与碰撞系统 目标:生成动态外星人群,处理移动、触边检测与子弹碰撞。 # alien.py(基础外星人类) class Alien(Sprite):def __init__(self, game):super().__init__()self.screen game.screenself.i…...
【大模型】DeepSeek攻击原理和效果解析
前几天看到群友提到一个现象,在试图询问知识库中某个人信息时,意外触发了DeepSeek的隐私保护机制,使模型拒绝回答该问题。另有群友提到,Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索,对相…...
金融行业 UE/UI 设计:解锁高效体验,重塑行业界面
在数字化浪潮中,金融行业的竞争日益激烈,用户体验(UE)和用户界面(UI)设计成为企业脱颖而出的关键。兰亭妙微凭借丰富的经验和创新的方法,为金融行业打造了一套行之有效的 UE/UI 解决方案&#x…...
在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败
在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败 当信号和槽在不同线程时,默认使用 队列连接(Qt::QueuedConnection),信号会被放入接收线程的事件队列&…...
从报错到成功:Mermaid 流程图语法避坑指南✨
🚀 从报错到成功:Mermaid 流程图语法避坑指南 🚀 🚨 问题背景 在开发文档或技术博客中,我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时,遭遇了以下报错…...
串口通信接口标准 RS232/422/485
串口通信接口标准 RS232、RS422、R485 目录 串口通信接口标准 4 1 RS232 4 1.1 引言 4 1.2 协议原理 4 1.3 电平标准 5 1.4 应用场景 5 1.5 优缺点 6 1.5.1 优点 6 1.5.2 缺点 6 2 RS422 7 2.1 背景介绍 7 2.2 协议原理 7 2.2.1 差分信号传输 7 2.2.2 电平标准…...
开源链动2+1模式与AI智能名片赋能的S2B2C共享经济新生态
摘要:在数字经济浪潮中,共享经济平台正重塑个体服务者的职业生态。本文基于平台经济理论与创新扩散模型,深入探讨"开源链动21模式"对资源共享效率的革命性提升,解析AI智能名片与S2B2C商城小程序源码的技术赋能机制。通过…...
【论文#目标检测】YOLO9000: Better, Faster, Stronger
目录 摘要1.引言2.更好(Better)3.更快(Faster)4.更健壮(Stronger)使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...
The First Indoor Pathloss Radio Map Prediction Challenge
原文:免费下载 挑战:ICASSP 2025 Chanllenge 摘要:为了鼓励进一步的研究并促进在开发基于深度学习的无线电传播模型时进行公平比较,在室内传播环境中定向无线电信号发射的探索较少的情况下,我们发起了 ICASSP 2025 年首次室内路径损耗无线电地图预测挑战赛。本概述论文介…...
Android系统深度定制:内置Google TTS语音引擎并设为默认的终极指南
一、背景与挑战 在Android 12.0的GMS套件定制化开发中,我们发现原生的文本转语音(TTS)功能存在一个关键问题:Google TTS语音包并非预装组件,导致用户需要手动下载安装后才能使用。本文将通过深度系统定制,…...
dify0.15.3升级至dify1.1.2操作步骤
参考官方文档:https://github.com/langgenius/dify/releases/tag/1.0.0 准备工作 停止docker容器后,首先是备份好现有的 docker-compose.yaml其次,解压 dify-1.1.2.zip,默认解压至 dify-1.1.2,sudo cp -r dify-1.1.2…...
Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题
文章目录 一、前言二、后端代码1、pom依赖2、Jaspersoft Studio生成的jasper文件3、main程序测试案例4、解决中文不显示问题5、web接口案例 三、Vue前端代码四、演示效果 一、前言 以前,在流行jdk1.6的时候,作pdf报表,用的软件是iReport。 …...
_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系
第一部分: // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…...
游戏引擎学习第180天
我们将在某个时候替换C标准库函数 今天我们要进行的工作是替换C标准库函数,这是因为目前我们仍然在使用C语言开发,并且在某些情况下会调用C标准库函数,例如一些数学函数和字符串格式化函数,尤其是在调试系统中,我们使…...
在Spring Boot中,可以通过实现一些特定的接口来拓展Starter
在Spring Boot中,开发者可以通过实现一些特定的接口来拓展Starter。这些接口允许开发者自定义Spring Boot应用程序的配置和行为,从而创建功能丰富且易于使用的Starter。以下是一些关键的接口,用于拓展Starter: EnvironmentPostPro…...
C# 属性(Property)详解
在 C# 中,属性(Property) 是类或结构体中的成员,用于封装对私有字段(称为 backing field)的访问,提供更灵活和安全的数据操作方式。属性通过 get 和 set 访问器控制对数据的读写&#x…...
专业级 AI 提示生成工具清单
1. 引言 近年来,随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用,提示(Prompt)工程作为驱动模型输出质量的重要环节,受到了各界的高度关注。精心设计、管理与优化提示,不仅能够大幅提高生成文本的准确…...
Gone v2 配置管理4:连接Apollo配置中心
🚀 发现 gone-io/gone:一个优雅的 Go 依赖注入框架!💻 它让您的代码更简洁、更易测试。🔍 框架轻量却功能强大,完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目,请给我们点个星!&a…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
什么是 Ansible Playbook?
一、Ansible Playbook 是什么? Ansible Playbook 是 Ansible 自动化工具的核心组件之一,它是一个以 YAML 格式编写的文件,用于定义一组自动化任务(tasks)。简单来说,Playbook 就像一个“剧本”或“指令清单…...
System.arraycopy 在音视频处理中的应用
在音视频开发领域,我们经常需要处理大量的数据,例如音频 PCM 数据的传输、视频帧的缓存等。在这些场景下,数据的复制与传输往往直接影响到应用的性能。Java 提供的 System.arraycopy 方法,在音视频处理代码中出现频率非常高。本文…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
java中的常量可以不用在声明的时候初始化,c中的必须在声明的时候初始化,可不可以这么理解?
这种理解不完全正确,下面分别说明 Java 和 C 中常量的初始化情况。 Java 中常量的初始化 在 Java 里,使用 final 关键字定义常量时,常量并非都要在声明时初始化,具体情况如下: 类的静态常量 如果 final 修饰的是类的…...
Dynamics 365 Business Central 财务经常性一般日记帐做帐方法简介
#BC ERP# #Navision# #Recurring General Journal# 在BC ERP中为了方便财务做些经常性的一般日记帐的方法,为了省时省事会用到Recurring General Journal模块是一个好方法。在这里将分别用不同的示例 对经常性日记帐的各种方法做一介绍: 经常性日记帐 …...
数据库误更新操作 如何回滚
1.未提交 直接 rollback 2.已提交 步骤 查询指定时间内修改前数据库数据: -- 查询误操作前的数据(例如 10 分钟前) SELECT * FROM 表名 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 10 MINUTE) WHERE 条件;-- 将数据恢复(需确保有…...
Mybatis注解的基础操作——02
写mybatis代码的方法有两种: 注解xml方式 本篇就介绍注解的方式 mybatis的操作主要有增删改查,下面进行一一讲解。 目录 一、参数传递 二、增(Insert) 三、删(Delete) 四、改(Update&#…...
在 IntelliJIDEA中实现Spring Boot多实例运行:修改配置与批量启动详解
前言 一、通过 修改配置 实现多实例运行二、通过 批量启动 实现多实例运行三、常见问题及解决方案四、最佳实践与扩展五、总结 在微服务开发中,经常需要同时启动多个服务实例进行测试或模拟集群环境。IntelliJ IDEA 作为Java开发者常用工具,…...
WHAM 人体3d重建部署笔记 vitpose
目录 视频结果: docker安装说明: conda环境安装说明: 依赖项: 依赖库: 安装 mmpose,mmcv vitpose-h-multi-coco.pth 下载地址: 算法原理, demo脚本 报错inference_top_down_pose_model: 测试命令: 视频结果: wham_smpl预测结果 git地址: GitHub - yohans…...
23、web前端开发之html5(四)
十二. HTML5实践示例 前面我们详细讲解了HTML5的特点,包括语义化标签、增强的表单功能、多媒体元素(如<video>和<audio>)、Canvas绘图、SVG集成以及离线存储等。以下是一些详细的HTML5实践示例,展示如何使用HTML5的新…...
S7-1200对V90 PN进行位置控制的三种方法
S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…...
