综合章节:游戏功能扩展与深度开发

news2025/3/26 13:19:06

模块一:外星人管理与碰撞系统

目标:生成动态外星人群,处理移动、触边检测与子弹碰撞。

# alien.py(基础外星人类)
class Alien(Sprite):
    def __init__(self, game):
        super().__init__()
        self.screen = game.screen
        self.image = pygame.image.load('alien.bmp')
        self.rect = self.image.get_rect()
        self.rect.x = self.rect.width  # 初始位置
        self.rect.y = self.rect.height
        self.x = float(self.rect.x)    # 精确水平位置(浮点数)

    def update(self):
        """水平移动外星人"""
        self.x += self.settings.alien_speed * self.settings.fleet_direction
        self.rect.x = self.x

    def 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.size
        available_space_x = self.settings.screen_width - 2 * alien_width
        number_aliens_x = available_space_x // (2 * alien_width)
        available_space_y = self.settings.screen_height - 3 * alien_height
        number_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()
                break

    def _change_fleet_direction(self):
        """下移并反转方向"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _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.settings
        self.reset_stats()
        self.high_score = 0
        self._load_high_score()  # 从文件加载历史最高分

    def reset_stats(self):
        self.ships_left = self.settings.ship_limit
        self.score = 0
        self.level = 1

    def _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.screen
        self.stats = game.stats
        self.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 = 10
            self.ships.add(ship)

模块三:菜单、音效与暂停功能

目标:实现主菜单界面、音效播放和游戏暂停逻辑。

# button.py(菜单按钮)
class Button:
    def __init__(self, game, msg, y_offset=0):
        self.screen = game.screen
        self.rect = pygame.Rect(0, 0, 200, 50)
        self.rect.center = game.screen_rect.center
        self.rect.y += y_offset
        self._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.paused
            elif 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 -= 1
        if 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_time
            return AlienBullet(self.rect.center)  # 返回子弹对象

# ship.py(技能实现)
class Ship:
    def __init__(self, game):
        # ...原有代码...
        self.shield_active = False
        self.shield_start_time = 0
        self.bomb_count = 3  # 初始炸弹数量

    def activate_shield(self):
        """激活护盾(持续5秒)"""
        if not self.shield_active:
            self.shield_active = True
            self.shield_start_time = pygame.time.get_ticks()

    def use_bomb(self):
        """使用炸弹清屏"""
        if self.bomb_count > 0:
            self.bomb_count -= 1
            self.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 类中集中定义速度、生命值等参数,便于快速迭代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型】DeepSeek攻击原理和效果解析

前几天看到群友提到一个现象&#xff0c;在试图询问知识库中某个人信息时&#xff0c;意外触发了DeepSeek的隐私保护机制&#xff0c;使模型拒绝回答该问题。另有群友提到&#xff0c;Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索&#xff0c;对相…

金融行业 UE/UI 设计:解锁高效体验,重塑行业界面

在数字化浪潮中&#xff0c;金融行业的竞争日益激烈&#xff0c;用户体验&#xff08;UE&#xff09;和用户界面&#xff08;UI&#xff09;设计成为企业脱颖而出的关键。兰亭妙微凭借丰富的经验和创新的方法&#xff0c;为金融行业打造了一套行之有效的 UE/UI 解决方案&#x…

从报错到成功:Mermaid 流程图语法避坑指南✨

&#x1f680; 从报错到成功&#xff1a;Mermaid 流程图语法避坑指南 &#x1f680; &#x1f6a8; 问题背景 在开发文档或技术博客中&#xff0c;我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时&#xff0c;遭遇了以下报错…

串口通信接口标准 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共享经济新生态

摘要&#xff1a;在数字经济浪潮中&#xff0c;共享经济平台正重塑个体服务者的职业生态。本文基于平台经济理论与创新扩散模型&#xff0c;深入探讨"开源链动21模式"对资源共享效率的革命性提升&#xff0c;解析AI智能名片与S2B2C商城小程序源码的技术赋能机制。通过…

【论文#目标检测】YOLO9000: Better, Faster, Stronger

目录 摘要1.引言2.更好&#xff08;Better&#xff09;3.更快&#xff08;Faster&#xff09;4.更健壮&#xff08;Stronger&#xff09;使用 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 年首次室内路径损耗无线电地图预测挑战赛。本概述论文介…

dify0.15.3升级至dify1.1.2操作步骤

参考官方文档&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.0 准备工作 停止docker容器后&#xff0c;首先是备份好现有的 docker-compose.yaml其次&#xff0c;解压 dify-1.1.2.zip&#xff0c;默认解压至 dify-1.1.2&#xff0c;sudo cp -r dify-1.1.2…

Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题

文章目录 一、前言二、后端代码1、pom依赖2、Jaspersoft Studio生成的jasper文件3、main程序测试案例4、解决中文不显示问题5、web接口案例 三、Vue前端代码四、演示效果 一、前言 以前&#xff0c;在流行jdk1.6的时候&#xff0c;作pdf报表&#xff0c;用的软件是iReport。 …

游戏引擎学习第180天

我们将在某个时候替换C标准库函数 今天我们要进行的工作是替换C标准库函数&#xff0c;这是因为目前我们仍然在使用C语言开发&#xff0c;并且在某些情况下会调用C标准库函数&#xff0c;例如一些数学函数和字符串格式化函数&#xff0c;尤其是在调试系统中&#xff0c;我们使…

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV5模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…

什么是 Ansible Playbook?

一、Ansible Playbook 是什么&#xff1f; Ansible Playbook 是 Ansible 自动化工具的核心组件之一&#xff0c;它是一个以 YAML 格式编写的文件&#xff0c;用于定义一组自动化任务&#xff08;tasks&#xff09;。简单来说&#xff0c;Playbook 就像一个“剧本”或“指令清单…

Dynamics 365 Business Central 财务经常性一般日记帐做帐方法简介

#BC ERP# #Navision# #Recurring General Journal# 在BC ERP中为了方便财务做些经常性的一般日记帐的方法&#xff0c;为了省时省事会用到Recurring General Journal模块是一个好方法。在这里将分别用不同的示例 对经常性日记帐的各种方法做一介绍&#xff1a; 经常性日记帐 …

Mybatis注解的基础操作——02

写mybatis代码的方法有两种&#xff1a; 注解xml方式 本篇就介绍注解的方式 mybatis的操作主要有增删改查&#xff0c;下面进行一一讲解。 目录 一、参数传递 二、增&#xff08;Insert&#xff09; 三、删&#xff08;Delete&#xff09; 四、改&#xff08;Update&#…

在 IntelliJIDEA中实现Spring Boot多实例运行:修改配置与批量启动详解

前言 一、通过 ‌修改配置‌ 实现多实例运行二、通过 ‌批量启动‌ 实现多实例运行三、常见问题及解决方案四、最佳实践与扩展五、总结 在微服务开发中&#xff0c;经常需要同时启动多个服务实例进行测试或模拟集群环境。‌IntelliJ IDEA‌ 作为Java开发者常用工具&#xff0c;…

Mongodb分片模式部署

MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片&#xff0c;MongoDB 可以将数据分布在多个服务器上&#xff0c;从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…

ElementPlus 快速入门

目录 前言 为什么要学习 ElementPlus&#xff1f; 正文 步骤 1 创建 一个工程化的vue 项目 ​2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装&#xff0c;选择包管理器 3 运行该命令 demo(案例1 &#xff09; 步骤 …

C++输入输出流第二弹:文件输入输出流and字符串输入输出流

目录 文件输入输出流&#xff08;重点&#xff09; 文件输入流 文件输入流对象的创建 对测试代码进行解读&#xff1a; 1. 代码核心逻辑 2. 读取过程详解 3. 关键特性总结 4. 注意事项 5. 完整流程示例 这里既然提到了 >> 流&#xff0c;那么就对他进行进一步的…

TCP传输---计算机网络

TCP结构 源端口和目标端口&#xff1a;标识通信的应用程序。序列号&#xff1a;标记发送的数据段的顺序序号。确认号 ( ACK)&#xff1a;确认接收到的数据序号。标志位&#xff1a;控制连接状态&#xff0c;包括 SYN&#xff08;同步&#xff09;、ACK&#xff08;确认&#xf…

基于TweenMax和SVG的炫酷弹性进度条动画特效

这是一款效果非常炫酷的基于TweenMax和SVG的炫酷弹性进度条动画特效。该弹性进度条特效在点击触发按钮之后&#xff0c;按钮会变形为进度条&#xff0c;然后一个滑块在它上面滑动&#xff0c;就像重物滑过绳子的感觉&#xff0c;非常有创意。 在线演示 使用方法 该弹性进度条效…