关于“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_speedai_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 = 3self.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博客
往期快速传送门👆(在文章最后):
感谢大家的支持!欢迎订阅收藏!专栏将持续更新!
相关文章:

关于“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 …...

安装nodejs,配置环境变量并将npm设置淘宝镜像源
安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包,所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下:https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…...

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)
为结构体自身时,用.调用成员变量;为结构体指针时,用->调用成员变量 所以存在结构体数组时,调用数组元素里的成员变量,就是要用. 结构体自身只有在new时才会创建出来,而其指针可以随意创建 在用new时&…...

《Python》面试常问:深拷贝、浅拷贝、赋值之间的关系(附可变与不可变)【用图文讲清楚!】
背景 想必大家面试或者平时学习经常遇到问python的深拷贝、浅拷贝和赋值之间的区别了吧?看网上的文章很多写的比较抽象,小白接收的难度有点大,于是乎也想自己整个文章出来供参考 可变与不可变 讲深拷贝和浅拷贝之前想讲讲什么是可变数据类型…...

使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错问题
目录 1、问题说明 2、问题分析思路 3、问题分析过程 3.1、使用Dependency Walker打开软件主程序,查看库与库的依赖关系,查看出问题的库 3.2、使用PE工具查看dll库的时间戳 3.3、解决办法 4、最后 VC常用功能开发汇总(专栏文章列表&…...
Python编程题目答疑「Python一对一辅导考试真题解析」
你好,我是悦创。 待会更新~ 更新计划 答案 题目 记得点赞收藏! 题目 之后更新 Solution Question 1 # 读取输入 a float(input("请输入实数 a: ")) b float(input("请输入实数 b: ")) c float(input("请输…...

Python---搭建Python自带静态Web服务器
1. 静态Web服务器是什么? 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。 …...
在服务器上部署SpringBoot项目jar包
以下是在服务器上部署Spring Boot项目jar包的步骤: 打包项目: 使用IDEA或者命令行工具(如Maven或Gradle)将Spring Boot项目打包为一个可执行的jar文件。如果使用Maven,可以在项目的根目录下运行以下命令来打包项目&…...

[python]python实现对jenkins 的任务触发
目录 关键词平台说明背景一、安装 python-jenkins 库二、code三、运行 Python 脚本四、注意事项 关键词 python、excel、DBC、jenkins 平台说明 项目Valuepython版本3.6 背景 用python实现对jenkins 的任务触发。 一、安装 python-jenkins 库 pip install python-jenkin…...

Python生成圣诞节贺卡-代码案例剖析【第18篇—python圣诞节系列】
文章目录 ❄️Python制作圣诞节贺卡🐬展示效果🌸代码🌴代码剖析 ❄️Python制作圣诞树贺卡🐬展示效果🌸代码🌴代码剖析🌸总结 🎅圣诞节快乐! ❄️Python制作圣诞节贺卡 …...

深度剖析Ajax实现方式(原生框架、JQuery、Axios,Fetch)
Ajax学习 简介: Ajax 代表异步 JavaScript 和 XML(Asynchronous JavaScript and XML)的缩写。它指的是一种在网页开发中使用的技术,通过在后台与服务器进行数据交换,实现页面内容的更新,而无需刷新整个…...

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器
游戏手柄这个概念,最早要追溯到二十年前玩FC游戏的时候,那时候超级玛丽成为了许多人童年里难忘的回忆,虽然长大了才知道超级玛丽是翻译错误,应该是任天堂的超级马里奥,不过这并不影响大家对他的喜爱。 当时FC家用机手柄…...

Flink系列之:Checkpoints 与 Savepoints
Flink系列之:Checkpoints 与 Savepoints 一、概述二、功能和限制 一、概述 从概念上讲,Flink 的 savepoints 与 checkpoints 的不同之处类似于传统数据库系统中的备份与恢复日志之间的差异。 Checkpoints 的主要目的是为意外失败的作业提供恢复机制。 …...

【优质书籍推荐】LoRA微调的技巧和方法
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…...

Linux一行命令配置jdk环境
使用方法: 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点:jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …...
从0开始刷剑指Offer
剑指Offer题解 剑指 Offer 11. 旋转数组的最小数字 思路: 二分O(logn) class Solution {public int stockManagement(int[] stock) {int l 0;int r stock.length - 1;while(l < r && stock[0] stock[r]) r --;if(stock[r] > stock[l]) return stock[0];whi…...

使用Java语言中的算法输出杨辉三角形
一、算法思想 创建一个名为YanghuiTest的类,然后创建二维数组,然后遍历二维数组的第一层,然后初始化第二层数组的大小,然后遍历第二层数组,然后将两侧的数组元素赋为1,然后其它数值通过公式计算,最后可以输…...

人工智能_机器学习071_SVM支持向量机_人脸识别算法_LFW人脸数据加载_与理解---人工智能工作笔记0111
然后我们继续来看 这里有个lfw_home可以看到这个数据是,包含了人脸数据 然后我们继续看,在我们的顶你用户目录下,如果安装了,sklearn就会有这样一个目录, scikit_learn_data目录,这个里面可以看到 可以看到这个文件夹中有个 lfw_home文件夹是对.zip文件夹的解压,这个下载以后…...
Java 8中流Stream API详解
先给个示例,展示Java 8流API的优势 假设我们有以下任务: 给定一个字符串列表,我们需要执行以下操作: 筛选出所有以"A"开头的字符串。 将这些字符串转换为大写。 对这些字符串按照长度进行排序。 最后,将…...
通过 xlsx 解析上传excel的数据
一、前言 在前端开发中,特别是在后台管理系统中,导入数据(上传excel)到后端是是否常见的功能;而一般的实现方式都是通过接口将excel上传到后端,再有后端进行数据解析并做后续操作。 今天,来记录…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...