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

目录

13.4.4 向下移动外星人群并改变移动方向

game_functions.py

alien_invasion.py

13.5 射杀外星人

13.5.1 检测子弹与外星人的碰撞

game_functions.py

alien_invasion.py

13.5.2 为测试创建大子弹

13.5.3 生成新的外星人群

game_functions.py

alien_invasion.py

13.5.4 提高子弹的速度

settings.py

13.5.5 重构 update_bullets()

game_functions.py

13.6 结束游戏

13.6.1 检测外星人和飞船碰撞

game_functions.py

alien_invasion.py

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

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


13.4.4 向下移动外星人群并改变移动方向

有外星人到达屏幕边缘时,需要将整群外星人下移,并改变它们的移动方向。我们需要对 game_functions.py做重大修改,因为我们要在这里检查是否有外星人到达了左边缘或右边缘。为此, 我们编写函数check_fleet_edges()和change_fleet_direction(),并对update_aliens()进行修改:

game_functions.py
def check_fleet_edges(ai_settings, aliens):
 """有外星人到达边缘时采取相应的措施"""
1 for alien in aliens.sprites():
 if alien.check_edges():
 change_fleet_direction(ai_settings, aliens)
 break
def change_fleet_direction(ai_settings, aliens):
 """将整群外星人下移,并改变它们的方向"""
 for alien in aliens.sprites():
2 alien.rect.y += ai_settings.fleet_drop_speed
 ai_settings.fleet_direction *= -1
def update_aliens(ai_settings, aliens):
 """
 检查是否有外星人位于屏幕边缘,并更新整群外星人的位置
 """
3 check_fleet_edges(ai_settings, aliens)
 aliens.update() 

在check_fleet_edges()中,我们遍历外星人群,并对其中的每个外星人调用check_edges() (见1)。如果check_edges()返回True,我们就知道相应的外星人位于屏幕边缘,需要改变外星人 群的方向,因此我们调用change_fleet_direction()并退出循环。在change_fleet_direction()中, 我们遍历所有外星人,将每个外星人下移fleet_drop_speed设置的值(见2);然后,将fleet_ direction的值修改为其当前值与1的乘积。

我们修改了函数update_aliens(),在其中通过调用check_fleet_edges()来确定是否有外星人 位于屏幕边缘。现在,函数update_aliens()包含形参ai_settings,因此我们调用它时指定了与 ai_settings对应的实参:

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

如果你现在运行这个游戏,外星人群将在屏幕上来回移动,并在抵达屏幕边缘后向下移动。 现在可以开始射杀外星人,检查是否有外星人撞到飞船,或抵达了屏幕底端。

13.5 射杀外星人

我们创建了飞船和外星人群,但子弹击中外星人时,将穿过外星人,因为我们还没有检查碰 撞。在游戏编程中,碰撞指的是游戏元素重叠在一起。要让子弹能够击落外星人,我们将使用 sprite.groupcollide()检测两个编组的成员之间的碰撞。

13.5.1 检测子弹与外星人的碰撞

子弹击中外星人时,我们要马上知道,以便碰撞发生后让外星人立即消失。为此,我们将在 更新子弹的位置后立即检测碰撞。 方法sprite.groupcollide()将每颗子弹的rect同每个外星人的rect进行比较,并返回一个字 典,其中包含发生了碰撞的子弹和外星人。在这个字典中,每个键都是一颗子弹,而相应的值都 是被击中的外星人(第14章实现记分系统时,也会用到这个字典)。 在函数update_bullets()中,使用下面的代码来检查碰撞:

game_functions.py
def update_bullets(aliens, bullets):
 """更新子弹的位置,并删除已消失的子弹"""
 --snip--
 # 检查是否有子弹击中了外星人
 # 如果是这样,就删除相应的子弹和外星人
 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

新增的这行代码遍历编组bullets中的每颗子弹,再遍历编组aliens中的每个外星人。每当 有子弹和外星人的rect重叠时,groupcollide()就在它返回的字典中添加一个键值对。两个实参True告诉Pygame删除发生碰撞的子弹和外星人。(要模拟能够穿行到屏幕顶端的高能子弹——消 灭它击中的每个外星人,可将第一个布尔实参设置为False,并让第二个布尔实参为True。这样 被击中的外星人将消失,但所有的子弹都始终有效,直到抵达屏幕顶端后消失。) 我们调用update_bullets()时,传递了实参aliens:

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

如果你此时运行这个游戏,被击中的外星人将消失。如图13-5所示,其中有一部分外星人被 击落。


13.5.2 为测试创建大子弹

只需通过运行这个游戏就可以测试其很多功能,但有些功能在正常情况下测试起来比较烦 琐。例如,要测试代码能否正确地处理外星人编组为空的情形,需要花很长时间将屏幕上的外星 人都击落。测试有些功能时,可以修改游戏的某些设置,以便专注于游戏的特定方面。例如,可以缩小屏 幕以减少需要击落的外星人数量,也可以提高子弹的速度,以便能够在单位时间内发射大量子弹。

测试这个游戏时,我喜欢做的一项修改是增大子弹的尺寸,使其在击中外星人后依然有效, 如图13-6所示。请尝试将bullet_width设置为300,看看将所有外星人都射杀有多快! 类似这样的修改可提高测试效率,还可能激发出如何赋予玩家更大威力的思想火花。(完成 测试后,别忘了将设置恢复正常。)


13.5.3 生成新的外星人群

这个游戏的一个重要特点是外星人无穷无尽,一个外星人群被消灭后,又会出现一群外星人。 要在外星人群被消灭后又显示一群外星人,首先需要检查编组aliens是否为空。如果为空, 就调用create_fleet()。我们将在update_bullets()中执行这种检查,因为外星人都是在这里被 消灭的:

game_functions.py
def update_bullets(ai_settings, screen, ship, aliens, bullets):
 --snip--
 # 检查是否有子弹击中了外星人
 # 如果是,就删除相应的子弹和外星人
 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
1 if len(aliens) == 0:
 # 删除现有的子弹并新建一群外星人
2 bullets.empty()
 create_fleet(ai_settings, screen, ship, aliens)

在1处,我们检查编组aliens是否为空。如果是,就使用方法empty()删除编组中余下的所 有精灵,从而删除现有的所有子弹。我们还调用了create_fleet(),再次在屏幕上显示一群外 星人。 现在,update_bullets()的定义包含额外的形参ai_settings、screen和ship,因此我们需要 更新alien_invasion.py中对update_bullets()的调用:

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

现在,当前外星人群消灭干净后,将立刻出现一个新的外星人群.

13.5.4 提高子弹的速度

如果你现在尝试在这个游戏中射杀外星人,可能发现子弹的速度比以前慢,这是因为在每次 循环中, Pygame 需要做的工作更多了。为提高子弹的速度,可调整 settings.py 中 bullet_speed_factor的值。例如,如果将这个值增大到3,子弹在屏幕上向上穿行的速度将变得 相当快:

settings.py
 # 子弹设置
 self.bullet_speed_factor = 3
 self.bullet_width = 3
 --snip-- 

这项设置的最佳值取决于你的系统速度,请找出适合你的值吧。

13.5.5 重构 update_bullets()

下面来重构update_bullets(),使其不再完成那么多任务。我们将把处理子弹和外星人碰撞 的代码移到一个独立的函数中:

game_functions.py
def update_bullets(ai_settings, screen, ship, aliens, bullets):
 --snip
 # 删除已消失的子弹
 for bullet in bullets.copy():
 if bullet.rect.bottom <= 0:
 bullets.remove(bullet)
 check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets)
def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
 """响应子弹和外星人的碰撞"""
 # 删除发生碰撞的子弹和外星人
 collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
 if len(aliens) == 0:
 # 删除现有的所有子弹,并创建一个新的外星人群
 bullets.empty()
 create_fleet(ai_settings, screen, ship, aliens)

我们创建了一个新函数——check_bullet_alien_collisions(),以检测子弹和外星人之间的 碰撞,以及在整群外星人都被消灭干净时采取相应的措施。这避免了update_bullets()太长,简 化了后续的开发工作。

13.6 结束游戏

如果玩家根本不会输,游戏还有什么趣味和挑战性可言?如果玩家没能在足够短的时间内将 整群外星人都消灭干净,且有外星人撞到了飞船,飞船将被摧毁。与此同时,我们还限制了可供 玩家使用的飞船数,而有外星人抵达屏幕底端时,飞船也将被摧毁。玩家用光了飞船后,游戏便 结束。

13.6.1 检测外星人和飞船碰撞

我们首先检查外星人和飞船之间的碰撞,以便外星人撞上飞船时我们能够作出合适的响应。 我们在更新每个外星人的位置后立即检测外星人和飞船之间的碰撞。

game_functions.py
def update_aliens(ai_settings, ship, aliens):
 """ 
检查是否有外星人到达屏幕边缘
 然后更新所有外星人的位置
 """
 check_fleet_edges(ai_settings, aliens)
 aliens.update()
 # 检测外星人和飞船之间的碰撞
1 if pygame.sprite.spritecollideany(ship, aliens):
2 print("Ship hit!!!") 

方法spritecollideany()接受两个实参:一个精灵和一个编组。它检查编组是否有成员与精 灵发生了碰撞,并在找到与精灵发生了碰撞的成员后就停止遍历编组。在这里,它遍历编组 aliens,并返回它找到的第一个与飞船发生了碰撞的外星人。 如果没有发生碰撞,spritecollideany()将返回None,因此Ø处的if代码块不会执行。如果 找到了与飞船发生碰撞的外星人,它就返回这个外星人,因此if代码块将执行:打印“Ship hit!!!” (见)。(有外星人撞到飞船时,需要执行的任务很多:需要删除余下的所有外星人和子弹,让 飞船重新居中,以及创建一群新的外星人。编写完成这些任务的代码前,需要确定检测外星人和 飞船碰撞的方法是否可行。而为确定这一点,最简单的方式是编写一条print语句。) 现在,我们需要将ship传递给update_aliens():

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

现在如果你运行这个游戏,则每当有外星人撞到飞船时,终端窗口都将显示“Ship hit!!!”。 测试这项功能时,请将alien_drop_speed设置为较大的值,如50或100,这样外星人将更快地撞到 飞船。


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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【github】github设置项目为私有

点击setting change to private 无脑下一步

为什么c++的开源库那么少?

为什么c的开源库那么少&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「c的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

热部署 和 热加载

本文主要讲热部署和热加载的区别、原理&#xff0c;以及常用的热部署的方式实践心得&#xff0c;其中包括HotSwap、Spring-loaded、Spring-boot-devtools、HotCode2和JRebel&#xff0c;诸多方式任你选择&#xff0c;希望能为你的开发进一步提效 1 热部署和热加载 开篇先说下热…

在Linux系统中安装MySQL数据库

目录 一、MySQL简介 二、MySQL安装步骤 1、下载MySQL的YUM仓库文件 2、安装MySQL源 3、解决密钥异常问题 4、安装MySQL服务器 5、开启MySQL服务 6、查看MySQL服务器中root用户的初始密码 7、使用初始密码登录MySQL服务器 8、修改root用户登录MySQL服务器的密码 三、…

使用Java语言判断一个年度是不是闰年

一、 代码说明 引入Scanner函数&#xff0c;将类命名为Judge类&#xff0c;使用try语句和catch语句将整体代码包围起来&#xff0c;使用if语句来判断是否为闰年&#xff0c;输入年份&#xff0c;然后得到相应的结论。 二、代码 import java.util.Scanner; public class Judg…

ElementUI中修改el-table的滚动条样式

注意&#xff1a;本文仅基于webkit引擎浏览器&#xff1b; 如果是火狐浏览器&#xff0c;则是-moz-&#xff1b; 部分webkit引擎浏览器&#xff1a;Google Chrome谷歌浏览器、Safari浏览器、搜狗高速浏览器、QQ浏览器、360极速浏览器等… 当内容超出容器时会出现滚动条&#…

HarmonyOS4.0系统性深入开发01应用模型的构成要素

应用模型的构成要素 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。 HarmonyOS应用模型的构成要…

Spring基础-IOC-DI-AOP

第一部分:Spring基础 文章目录 第一部分:Spring基础一、核心概念1.什么是Spring?2.Spring架构3.Spring优势 二、控制反转1.为什么要控制反转?2.组件化方式编程案例(Test01_di)3.采用组件化思维,装配打印机(Test01_di) 三、面向切面编程(AOP)方面编程1.什么是AOP?2.如何实现A…

AI时代Python量化交易实战:ChatGPT引领新时代

文章目录 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅膀》关键点内容简介作者简介购买链接 《AI时代架构师修炼之道&#xff1a;ChatGPT让架构师插上翅膀》关键点内容简介作者简介 赠书活动 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅…

MATLAB - 读取双摆杆上的 IMU 数据

系列文章目录 前言 本示例展示了如何从安装在双摆杆上的两个 IMU 传感器生成惯性测量单元 (IMU) 读数。双摆使用 Simscape Multibody™ 进行建模。有关使用 Simscape Multibody™ 构建简易摆的分步示例&#xff0c;请参阅简易摆建模&#xff08;Simscape Multibody&#xff09…

设计模式(4)--对象行为(2)--命令

1. 意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请 求日志&#xff0c;以及支持可撤销的操作。 2. 四种角色 接收者(Receiver)、抽象命令(Command)、具体命令(Concrete Command)、请求者(Invoker) 3. 优点…

【NI-RIO入门】使用其他文本语言开发CompactRIO

1.FPGA 接口Python API Getting Started — FPGA Interface Python API 19.0.0 documentation 2.FPGA接口C API FPGA 接口 C API 是用于 NI 可重配置 I/O (RIO) 硬件&#xff08;例如 NI CompactRIO、NI Single-Board RIO、NI 以太网 RIO、NI FlexRIO、NI R 系列多功能 RIO 和…

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】

文章目录 ❄️Python制作圣诞节贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析 ❄️Python制作圣诞树贺卡&#x1f42c;展示效果&#x1f338;代码&#x1f334;代码剖析&#x1f338;总结 &#x1f385;圣诞节快乐&#xff01; ❄️Python制作圣诞节贺卡 …

【数字通信原理】复习笔记

哈喽&#xff89;hi~ 小伙伴们许久没有更新啦~ 花花经历了漫长的考试周~ 要被累成花干啦。今天来更新《数字通信原理》手写笔记给需要的小伙伴~ &#xff08;注:这是两套笔记&#xff0c;是需要结合来看的哦~&#xff09; 第一套的笔记请结合bilibili:张锦皓的复习课程来哦。 第…

sql_lab之sqli中的报错注入,less13

报错注入&#xff08;less-13&#xff09; 正常报错注入&#xff1a; 1.输入用户名和密码123 123显示登录错误 2.输入用户名和密码123’ 123显示登录错误 123后面有’)说明是’)注入 3.查询数据库名 1) and updatexml(<a><b></b></a>,concat(1111…

二维码智慧门牌管理系统升级:强化用户管理合规性

文章目录 前言一、功能优化和多层级管理二、强大的合规性与权限配置三、提升管理效率与系统安全性 前言 随着科技迅速发展&#xff0c;二维码智慧门牌管理系统已经成为各组织机构首选的入口&#xff0c;提高了信息管理效率并确保了数据安全。然而&#xff0c;用户需求变化和法…

<HarmonyOS第一课>运行Hello World

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

OC学习笔记--基础篇

本文简要介绍了一些oc的基础类型&#xff0c;包括数组、字典、字符串、消息传递、类、对象、方法、属性、协议和转发&#xff0c;希望对你有帮助。 OC数据类型 打印—类似print NSlog("hello word");数组 NSMutableArray &#xff08;可变数组&#xff09;和 NSAr…

音画欣赏|《同杯万古尘》

《同杯万古尘》 尺寸&#xff1a;69x35cm 陈可之2023年绘 《拟古十二首-其九》 李白 生者为过客&#xff0c;死者为归人。 天地一逆旅&#xff0c;同悲万古尘。 月兔空捣药&#xff0c;扶桑已成薪。 白骨寂无言&#xff0c;青松岂知春。 前后更叹息&#xff0c;浮荣安足珍&am…

【SpringMVC】REST(Representation State Transfer)ful开发

REST全称Representation State Transfer&#xff0c;表现形式状态转换 文章目录 1. 为什么提出了REST&#xff1f;2. RESTful入门案例案例代码修改请求方式修改成RESTful风格&#xff0c;并以POST方式提交 RESTful格式下传参RESTful入门案例总结RequestBody&#xff0c;Reques…