关于“Python”的核心知识点整理大全33

目录

12.8.3 将子弹存储到编组中

alien_invasion.py

注意

12.8.4 开火

game_functions.py

12.8.5 删除已消失的子弹

alien_invasion.py

12.8.6 限制子弹数量

settings.py

game_functions.py

12.8.7 创建函数 update_bullets()

game_functions.py

alien_invasion.py

12.8.8 创建函数 fire_bullet()

game_functions.py

12.9 小结

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


12.8.3 将子弹存储到编组中

定义Bullet类和必要的设置后,就可以编写代码了,在玩家每次按空格键时都射出一发子弹。 首先,我们将在alien_invasion.py中创建一个编组(group),用于存储所有有效的子弹,以便能够 管理发射出去的所有子弹。这个编组将是pygame.sprite.Group类的一个实例;pygame.sprite. Group类类似于列表,但提供了有助于开发游戏的额外功能。在主循环中,我们将使用这个编组 在屏幕上绘制子弹,以及更新每颗子弹的位置:

alien_invasion.py
import pygame
from pygame.sprite import Group
--snip--
def run_game():--snip--# 创建一艘飞船ship = Ship(ai_settings, screen)# 创建一个用于存储子弹的编组
1 bullets = Group()# 开始游戏主循环while True:gf.check_events(ai_settings, screen, ship, bullets)ship.update()
2 bullets.update()gf.update_screen(ai_settings, screen, ship, bullets)
run_game()

我们导入了pygame.sprite中的Group类。在1处,我们创建了一个Group实例,并将其命名为 bullets。这个编组是在while循环外面创建的,这样就无需每次运行该循环时都创建一个新的子 弹编组。


注意

如果在循环内部创建这样的编组,游戏运行时将创建数千个子弹编组,导致游戏慢得像 蜗牛。如果游戏停滞不前,请仔细查看主while循环中发生的情况。


我们将bullets传递给了check_events()和update_screen()。在check_events()中,需要在玩 家按空格键时处理bullets;而在update_screen()中,需要更新要绘制到屏幕上的bullets。 当你对编组调用update()时,编组将自动对其中的每个精灵调用update(),因此代码行 bullets.update()将为编组bullets中的每颗子弹调用bullet.update()。

12.8.4 开火

在game_functions.py中,我们需要修改check_keydown_events(),以便在玩家按空格键时发射 一颗子弹。我们无需修改check_keyup_events(),因为玩家松开空格键时什么都不会发生。我们 还需修改update_screen(),确保在调用flip()前在屏幕上重绘每颗子弹。下面是对game_ functions.py所做的相关修改:

game_functions.py
--snip--
from bullet import Bullet
1 def check_keydown_events(event, ai_settings, screen, ship, bullets):--snip--
2 elif event.key == pygame.K_SPACE:# 创建一颗子弹,并将其加入到编组bullets中new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)--snip--
3 def check_events(ai_settings, screen, ship, bullets):"""响应按键和鼠标事件"""for event in pygame.event.get():--snip--elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)--snip--
4 def update_screen(ai_settings, screen, ship, bullets):--snip--# 在飞船和外星人后面重绘所有子弹
5 for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()--snip-- 

编组bulltes传递给了check_keydown_events()(见1)。玩家按空格键时,创建一颗新子弹(一 个名为new_bullet的Bullet实例),并使用方法add()将其加入到编组bullets中(见2);代码 bullets.add(new_bullet)将新子弹存储到编组bullets中。

在check_events()的定义中,我们需要添加形参bullets(见3);调用check_keydown_events() 时,我们也需要将bullets作为实参传递给它。 在 4 处,我们给在屏幕上绘制子弹的 update_screen() 添加了形参 bullets 。方法 bullets.sprites()返回一个列表,其中包含编组bullets中的所有精灵。为在屏幕上绘制发射的 所有子弹,我们遍历编组bullets中的精灵,并对每个精灵都调用draw_bullet()(见5)。 如果此时运行alien_invasion.py,将能够左右移动飞船,并发射任意数量的子弹。子弹在屏 幕上向上穿行,抵达屏幕顶部后消失,如图12-3所示。可在settings.py中修改子弹的尺寸、颜色和 速度。


12.8.5 删除已消失的子弹

当前,子弹抵达屏幕顶端后消失,这仅仅是因为Pygame无法在屏幕外面绘制它们。这些子 弹实际上依然存在,它们的y坐标为负数,且越来越小。这是个问题,因为它们将继续消耗内存 和处理能力。 我们需要将这些已消失的子弹删除,否则游戏所做的无谓工作将越来越多,进而变得越来越 慢。为此,我们需要检测这样的条件,即表示子弹的rect的bottom属性为零,它表明子弹已穿过 屏幕顶端:

alien_invasion.py
# 开始游戏主循环while True:gf.check_events(ai_settings, screen, ship, bullets)ship.update()bullets.update()# 删除已消失的子弹
1 for bullet in bullets.copy():
2 if bullet.rect.bottom <= 0:
3 bullets.remove(bullet)
4 print(len(bullets))gf.update_screen(ai_settings, screen, ship, bullets)

在for循环中,不应从列表或编组中删除条目,因此必须遍历编组的副本。我们使用了方法 copy()来设置for循环(见1),这让我们能够在循环中修改bullets。我们检查每颗子弹,看看它 是否已从屏幕顶端消失(2)。如果是这样,就将其从bullets中删除(见3)。在4处,我们使 用了一条print语句,以显示当前还有多少颗子弹,从而核实已消失的子弹确实删除了。 如果这些代码没有问题,我们发射子弹后查看终端窗口时,将发现随着子弹一颗颗地在屏幕 顶端消失,子弹数将逐渐降为零。运行这个游戏并确认子弹已被删除后,将这条print语句删除。 如果你留下这条语句,游戏的速度将大大降低,因为将输出写入到终端而花费的时间比将图形绘 制到游戏窗口花费的时间还多。

12.8.6 限制子弹数量

很多射击游戏都对可同时出现在屏幕上的子弹数量进行限制,以鼓励玩家有目标地射击。下 面在游戏《外星人入侵》中作这样的限制。 首先,在settings.py中存储所允许的最大子弹数:

settings.py

这将未消失的子弹数限制为3颗。在game_functions.py的check_keydown_events()中,我们在 创建新子弹前检查未消失的子弹数是否小于该设置:

game_functions.py
def check_keydown_events(event, ai_settings, screen, ship, bullets):--snip--elif event.key == pygame.K_SPACE:# 创建新子弹并将其加入到编组bullets中if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet) 

玩家按空格键时,我们检查bullets的长度。如果len(bullets)小于3,我们就创建一个新子 弹;但如果已有3颗未消失的子弹,则玩家按空格键时什么都不会发生。如果你现在运行这个游 戏,屏幕上最多只能有3颗子弹。

12.8.7 创建函数 update_bullets()

编写并检查子弹管理代码后,可将其移到模块game_functions中,以让主程序文件 alien_invasion.py尽可能简单。我们创建一个名为update_bullets()的新函数,并将其添加到game_functions.py的末尾:

game_functions.py
def update_bullets(bullets):"""更新子弹的位置,并删除已消失的子弹"""# 更新子弹的位置bullets.update()# 删除已消失的子弹for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet) 

update_bullets()的代码是从alien_invasion.py剪切并粘贴而来的,它只需要一个参数,即编 组bullets。 alien_invasion.py中的while循环又变得很简单了:

alien_invasion.py
# 开始游戏主循环while True:
1 gf.check_events(ai_settings, screen, ship, bullets)
2 ship.update()
3 gf.update_bullets(bullets)
4 gf.update_screen(ai_settings, screen, ship, bullets)

我们让主循环包含尽可能少的代码,这样只要看函数名就能迅速知道游戏中发生的情况。主 循环检查玩家的输入(见1),然后更新飞船的位置(见2)和所有未消失的子弹的位置(见3)。 接下来,我们使用更新后的位置来绘制新屏幕(见4)。

12.8.8 创建函数 fire_bullet()

下面将发射子弹的代码移到一个独立的函数中,这样,在check_keydown_events()中只需使 用一行代码来发射子弹,让elif代码块变得非常简单:

game_functions.py
def check_keydown_events(event, ai_settings, screen, ship, bullets):"""响应按键"""--snip--elif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)
def fire_bullet(ai_settings, screen, ship, bullets):"""如果还没有到达限制,就发射一颗子弹"""#创建新子弹,并将其加入到编组bullets中if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet) 

函数fire_bullet()只包含玩家按空格键时用于发射子弹的代码;在check_keydown_events() 中,我们在玩家按空格键时调用fire_bullet()。 请再次运行alien_invasion.py,确认发射子弹时依然没有错误

12.9 小结

在本章中,你学习了:游戏开发计划的制定;使用Pygame编写的游戏的基本结构;如何设 置背景色,以及如何将设置存储在可供游戏的各个部分访问的独立类中;如何在屏幕上绘制图像, 以及如何让玩家控制游戏元素的移动;如何创建自动移动的元素,如在屏幕中向上飞驰的子弹, 以及如何删除不再需要的对象;如何定期重构项目的代码,为后续开发提供便利。 在第13章中,我们将在游戏《外星人入侵》中添加外星人。在第13章结束时,你将能够击落 外星人——但愿是在他们撞到飞船前!

关于“Python”的核心知识点整理大全25-CSDN博客


关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


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

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

相关文章

ssm445基于SSM的学生宿舍管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生宿舍管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

转行小白历险记-2023.12.19 如何解决跨域问题

讨厌突如其来的破坏计划的感觉&#xff0c;真的好烦 一、跨域以及如何解决跨域问题(反向代理) 跨域 同源&#xff1a;协议、端口、域名相同 如何解决跨域问题 jsonp:<script> 不受同源策略限制跨源域资源共享 CORS:允许 Web 应用服务器进行跨源访问控制使不同的源变成同…

Inkscape SVG 编辑器 导入 Gazebo

概述 本教程描述了拉伸 SVG 文件的过程&#xff0c;这些文件是 2D 的 图像&#xff0c;用于在 Gazebo 中为您的模型创建 3D 网格。有时是 更容易在 Inkscape 或 Illustrator 等程序中设计模型的一部分。 在开始之前&#xff0c;请确保您熟悉模型编辑器。 本教程将向您展示如…

在灾难推文分析场景上比较用 LoRA 微调 Roberta、Llama 2 和 Mistral 的过程及表现

引言 自然语言处理 (NLP) 领域的进展日新月异&#xff0c;你方唱罢我登场。因此&#xff0c;在实际场景中&#xff0c;针对特定的任务&#xff0c;我们经常需要对不同的语言模型进行比较&#xff0c;以寻找最适合的模型。本文主要比较 3 个模型: RoBERTa、Mistral-7B 及 Llama-…

二叉树..

文章目录 1. 对称二叉树-力扣 101 题2. 二叉树最大深度-力扣 104 题 前中后序非递归实现通用代码&#xff1a; LinkedList<TreeNode> stack new LinkedList<>();TreeNode curr root; // 代表当前节点 TreeNode pop null; // 最近一次弹栈的元素 while (curr ! …

【CSS @property】CSS自定义属性说明与demo

CSS property property - CSS: Cascading Style Sheets | MDN At 规则 - CSS&#xff1a;层叠样式表 | MDN Custom properties (–*): CSS variables - CSS: Cascading Style Sheets | MDN CSS Houdini - Developer guides | MDN &#x1f4da; 什么是property? property CSS…

2023年度佳作:AIGC、AGI、GhatGPT 与人工智能大模型的创新与前景展望

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

TCP 核心工作机制

TCP 的核心知识&#xff1a;如何保证传输可靠 如何提高传输效率 如何保证传输可靠&#xff1a;确认应答机制 超时重传机制 如何提高传输效率&#xff1a;滑动窗口机制、流量控制机制、延时应答机制、捎带确认机制、拥塞控制机制 可靠机制 TCP的可靠性主要是通过 确认应答 …

【轻量化篇】YOLOv8改进实战 | 更换主干网络 Backbone 之 RepGhostnet,重参数化实现硬件高效的Ghost模块

YOLOv8专栏导航:点击此处跳转 前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标&#xff1a;在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表&#xff0c;并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

CentOS 宣布停更3年后,服务器操作系统何去何从?

“CentOS 要停止更新了&#xff1f;” 盯着电脑&#xff0c;某大型企业数字化部门的负责人彭素素看到这个消息&#xff0c;不仅在心里发出了一声惊呼。 2020年&#xff0c;CentOS 停止更新的消息&#xff0c;不仅彭素素所在的企业&#xff0c;对于不少正在使用 CentOS 的厂商…

Python多个列表连接实例代码解析

概要 在Python中&#xff0c;连接多个列表是一种常见的操作&#xff0c;用于将多个列表合并为一个。这个过程可以应用于各种数据处理和编程任务中。本文将介绍多种连接多个列表的方法&#xff0c;并提供详细的示例代码来帮助大家更好地理解。 使用 运算符 最简单的方法是使用…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

JS模块化规范之CMD

JS模块化规范之CMD 模块化规范CMD&#xff08;Common Module Definition&#xff09;概念基本语法CMD实现 模块化规范 CMD&#xff08;Common Module Definition&#xff09; 概念 CommonJS module definition CMD规范专门用于浏览器端&#xff0c;模块的加载时异步的&#x…

应用 Strangler 模式将遗留系统分解为微服务

许多来源在一般情况下提供了微服务的解释&#xff0c;但缺乏特定领域的示例。新来者或不确定从哪里开始的人可能会发现掌握如何将遗留系统过渡到微服务架构具有挑战性。本指南主要面向那些正在努力启动迁移工作的个人&#xff0c;它提供了特定于业务的示例来帮助理解该过程。 …

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

C++ 模拟实现string

目录 一.类的声明 二.确定成员变量 三.成员函数 1.带参的构造函数&#xff0c;析构函数&#xff0c;拷贝构造 2.size()与capacity() 3.运算符重载 重载数组下标访问[] 重载 重载比较运算符&#xff08;<&#xff0c; < &#xff0c; > &#xff0c; > …

改变传媒格局的新趋势

在如今信息高速发展的时代&#xff0c;人们早已进入了一个以手机为中心的智能化时代。随着科技的迅猛发展&#xff0c;手机无人直播成为了一种新兴的传媒形态&#xff0c;正逐渐改变着传媒格局。本文将从手机无人直播的定义、发展背景和影响等方面进行探讨。 首先&#xff0c;…

数字孪生开发技术分析

数字孪生的开发涉及多个技术领域&#xff0c;包括计算机科学、数据科学、人工智能和工程等。以下是数字孪生开发中常用的一些关键技术&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.建模和仿真&am…