当前位置: 首页 > news >正文

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

目录

13.3.4 重构 create_fleet()

game_functions.py

13.3.5 添加行

game_functions.py

alien_invasion.py

13.4 让外星人群移动

13.4.1 向右移动外星人

settings.py

alien.py

alien_invasion.py

game_functions.py

13.4.2 创建表示外星人移动方向的设置

13.4.3 检查外星人是否撞到了屏幕边缘

alien.py

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

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


13.3.4 重构 create_fleet()

倘若我们创建了外星人群,也许应该让create_fleet()保持原样,但鉴于创建外星人的工作 还未完成,我们稍微清理一下这个函数。下面是create_fleet()和两个新函数,get_number_ aliens_x()和create_alien():

game_functions.py
1 def get_number_aliens_x(ai_settings, alien_width):"""计算每行可容纳多少个外星人"""available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_x
def create_alien(ai_settings, screen, aliens, alien_number):"""创建一个外星人并将其放在当前行"""alien = Alien(ai_settings, screen)
2 alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
def create_fleet(ai_settings, screen, aliens):"""创建外星人群"""# 创建一个外星人,并计算每行可容纳多少个外星人alien = Alien(ai_settings, screen)
3 number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)# 创建第一行外星人for alien_number in range(number_aliens_x):
4 create_alien(ai_settings, screen, aliens, alien_number)

函数get_number_aliens_x()的代码都来自create_fleet(),且未做任何修改(见1)。函数 create_alien()的代码也都来自create_fleet(),且未做任何修改,只是使用刚创建的外星人来 获取外星人宽度(见2)。在3处,我们将计算可用水平空间的代码替换为对get_number_aliens_x() 的调用,并删除了引用alien_width的代码行,因为现在这是在create_alien()中处理的。在4处, 我们调用create_alien()。通过这样的重构,添加新行进而创建整群外星人将更容易。

13.3.5 添加行

要创建外星人群,需要计算屏幕可容纳多少行,并对创建一行外星人的循环重复相应的次数。 为计算可容纳的行数,我们这样计算可用垂直空间:将屏幕高度减去第一行外星人的上边距(外 星人高度)、飞船的高度以及最初外星人群与飞船的距离(外星人高度的两倍):

available_space_y = ai_settings.screen_height – 3 * alien_height – ship_height

这将在飞船上方留出一定的空白区域,给玩家留出射杀外星人的时间。

每行下方都要留出一定的空白区域,并将其设置为外星人的高度。为计算可容纳的行数,我 们将可用垂直空间除以外星人高度的两倍(同样,如果这样的计算不对,我们马上就能发现,继 而将间距调整为合理的值)。

number_rows = available_height_y / (2 * alien_height)

知道可容纳多少行后,便可重复执行创建一行外星人的代码:

game_functions.py
1 def get_number_rows(ai_settings, ship_height, alien_height):"""计算屏幕可容纳多少行外星人"""
2 available_space_y = (ai_settings.screen_height -(3 * alien_height) - ship_height)number_rows = int(available_space_y / (2 * alien_height)) return number_rows
def create_alien(ai_settings, screen, aliens, alien_number, row_number):--snip--alien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.x
3 alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):--snip--number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height,alien.rect.height)# 创建外星人群
4 for row_number in range(number_rows):for alien_number in range(number_aliens_x):create_alien(ai_settings, screen, aliens, alien_number,row_number) 

为计算屏幕可容纳多少行外星人,我们在函数get_number_rows()中实现了前面计算 available_space_y和number_rows的公式(见1),这个函数与get_number_aliens_x()类似。计算 公式用括号括起来了,这样可将代码分成两行,以遵循每行不超过79字符的建议(见2)。这里 使用了int(),因为我们不想创建不完整的外星人行。

为创建多行,我们使用两个嵌套在一起的循环:一个外部循环和一个内部循环(见4)。其 中的内部循环创建一行外星人,而外部循环从零数到要创建的外星人行数。Python将重复执行创 建单行外星人的代码,重复次数为number_rows。 为嵌套循环,我们编写了一个新的for循环,并缩进了要重复执行的代码。(在大多数文本编 辑器中,缩进代码块和取消缩进都很容易,详情请参阅附录B。)我们调用create_alien()时,传 递了一个表示行号的实参,将每行都沿屏幕依次向下放置。 create_alien()的定义需要一个用于存储行号的形参。在create_alien()中,我们修改外星 人的y坐标(见3),并在第一行外星人上方留出与外星人等高的空白区域。相邻外星人行的y坐 标相差外星人高度的两倍,因此我们将外星人高度乘以2,再乘以行号。第一行的行号为0,因此 第一行的垂直位置不变,而其他行都沿屏幕依次向下放置。 在 create_fleet() 的定义中,还新增了一个用于存储 ship 对象的形参,因此在 alien_invasion.py中调用create_fleet()时,需要传递实参ship:

alien_invasion.py
# 创建外星人群
gf.create_fleet(ai_settings, screen, ship, aliens)

如果你现在运行这个游戏,将看到一群外星人,如图13-4所示

在下一节,我们将让外星人群动起来

13.4 让外星人群移动

下面来让外星人群在屏幕上向右移动,撞到屏幕边缘后下移一定的距离,再沿相反的方向移 动。我们将不断地移动所有的外星人,直到所有外星人都被消灭,有外星人撞上飞船,或有外星 人抵达屏幕底端。下面先来让外星人向右移动。

13.4.1 向右移动外星人

为移动外星人,我们将使用alien.py中的方法update(),且对外星人群中的每个外星人都调用 它。首先,添加一个控制外星人速度的设置:

settings.py
 def __init__(self):
--snip--# 外星人设置self.alien_speed_factor = 1

然后,使用这个设置来实现update():

alien.py
 def update(self):"""向右移动外星人"""
1 self.x += self.ai_settings.alien_speed_factor
2 self.rect.x = self.x 

每次更新外星人位置时,都将它向右移动,移动量为alien_speed_factor的值。我们使用属 性self.x跟踪每个外星人的准确位置,这个属性可存储小数值(见Ø)。然后,我们使用self.x 的值来更新外星人的rect的位置(见)。 在主while循环中已调用了更新飞船和子弹的方法,但现在还需更新每个外星人的位置:

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

我们在更新子弹后再更新外星人的位置,因为稍后要检查是否有子弹撞到了外星人。 最后,在文件game_functions.py末尾添加新函数update_aliens():

game_functions.py
def update_aliens(aliens):"""更新外星人群中所有外星人的位置"""aliens.update() 

我们对编组aliens调用方法update(),这将自动对每个外星人调用方法update()。如果你现 在运行这个游戏,会看到外星人群向右移,并逐渐在屏幕右边缘消失。

13.4.2 创建表示外星人移动方向的设置

下面来创建让外星人撞到屏幕右边缘后向下移动、再向左移动的设置。实现这种行为的代码 如下:

settings.py

 # 外星人设置self.alien_speed_factor = 1self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1

设置fleet_drop_speed指定了有外星人撞到屏幕边缘时,外星人群向下移动的速度。将这个 速度与水平速度分开是有好处的,这样你就可以分别调整这两种速度了。 要实现fleet_direction设置,可以将其设置为文本值,如'left'或'right',但这样就必须 编写if-elif语句来检查外星人群的移动方向。鉴于只有两个可能的方向,我们使用值1和1来表 示它们,并在外星人群改变方向时在这两个值之间切换。另外,鉴于向右移动时需要增大每个外 星人的x坐标,而向左移动时需要减小每个外星人的x坐标,使用数字来表示方向更合理。

13.4.3 检查外星人是否撞到了屏幕边缘

现在需要编写一个方法来检查是否有外星人撞到了屏幕边缘,还需修改update(),以让每个 外星人都沿正确的方向移动:

alien.py
 def check_edges(self):"""如果外星人位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()
1 if self.rect.right >= screen_rect.right:return True
2 elif self.rect.left <= 0:return Truedef update(self):"""向左或向右移动外星人"""
3 self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.x

我们可对任何外星人调用新方法check_edges(),看看它是否位于屏幕左边缘或右边缘。如 果外星人的rect的right属性大于或等于屏幕的rect的right属性,就说明外星人位于屏幕右边缘 (见1)。如果外星人的rect的left属性小于或等于0,就说明外星人位于屏幕左边缘(见2)。 我们修改了方法update(),将移动量设置为外星人速度和fleet_direction的乘积,让外星人向左或向右移。如果fleet_direction为1,就将外星人当前的x坐标增大alien_speed_factor,从 而将外星人向右移;如果fleet_direction为1,就将外星人当前的x坐标减去alien_speed_ factor,从而将外星人向左移。


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

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

相关文章:

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

目录 13.3.4 重构 create_fleet() game_functions.py 13.3.5 添加行 game_functions.py alien_invasion.py 13.4 让外星人群移动 13.4.1 向右移动外星人 settings.py alien.py alien_invasion.py game_functions.py 13.4.2 创建表示外星人移动方向的设置 13.4.3 检…...

C++ opencv RGB三通道提升亮度

#include <iostream> #include <iomanip> #include<opencv2//opencv.hpp> using namespace std; using namespace cv; //函数adjustBrightness用于图片增加亮度 void adjustBrightness(cv::Mat& image, int targetBrightness) { // 获取图像的通道数…...

TCAX特效字幕保姆入门教程+效果演示+软件源码自取

目录 介绍 下载链接 初步使用 软件使用 tcc文件介绍 tcc文件版本 模式设置 ​编辑 k值提供方式举例 特效脚本设置 主要设置 ass全局风格设置 额外设置 常见问题 编码使用 使用其他tcax博主的进行编码测试 介绍 TCAX是一款专门用于制作特效字幕的软件。通过TCAX…...

【C语言】自定义类型:结构体深入解析(二)结构体内存对齐宏offsetof计算偏移量结构体传参

文章目录 &#x1f4dd;前言&#x1f320; 结构体内存对齐&#x1f309;内存对齐包含结构体的计算&#x1f320;宏offsetof计算偏移量&#x1f309;为什么存在内存对⻬?&#x1f320; 结构体传参&#x1f6a9;总结 &#x1f4dd;前言 本小节&#xff0c;我们学习结构的内存对…...

活动回顾 (上) | 2023 Meet TVM 系列活动完美收官

作者&#xff1a;xixi 编辑&#xff1a;三羊、李宝珠 2023 Meet TVM 年终聚会于 12 月 16 日在上海圆满落幕&#xff0c;本次 meetup 不仅邀请到了 4 位 AI 编译器专家为大家带来了精彩的分享&#xff0c;还新增了圆桌讨论环节&#xff0c;以更多元的视角和各位共同讨论大模型…...

JMeter常见配置及常见问题修改

一、设置JMeter默认打开字体 1、进入安装目录&#xff1a;apache-jmeter-x.x.x\bin\ 2、找到 jmeter.properties&#xff0c;打开。 3、搜索“ languageen ”&#xff0c;前面带有“#”号.。 4、去除“#”号&#xff0c;并修改为&#xff1a;languagezh_CN 或 直接新增一行&…...

描述一个bug及定义bug的级别

&#xff08;一&#xff09;描述一个bug 描述一个bug&#xff0c;需要以下几个因素&#xff1a; 故障标题、故障发现的版本、故障类别&#xff08;功能/兼容/界面&#xff09;、故障优先级、故障描述&#xff08;测试环境、测试步骤、预期结果、实际结果&#xff09;。 举个例…...

Java项目-瑞吉外卖项目优化Day3

前后端分离开发 Yapi 是一个接口结合了接口测试、接口管理的管理平台&#xff0c;需要配置比较麻烦。看弹幕说用apifox更好用。可以将接口文档导出导入。 Swagger 注意下面的地址前面要有/。 效果&#xff1a; 可以在这里实现接口的测试&#xff0c;也可以导出文档等等。一般…...

测试理论知识四:大型软件的测试技巧——单元测试

1. 模块测试/单元测试 模块测试也被称为单元测试&#xff0c;本文章称单元测试为主。 对于小的程序测试&#xff0c;我们可以在一定时间内完成&#xff0c;如果面对的是大型程序&#xff0c;等程序开发完成之后我们再进行测试&#xff0c;那会大大降低我们的效率。 单元测试…...

安防监控系统/磁盘阵列/视频监控EasyCVR平台微信推送步骤大公开

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…...

算法与数据结构--特殊有序集的线性时间排序算法

一.计数排序算法 基本思想&#xff1a;统计每个输入元素的个数&#xff0c;然后根据这些计数值重构原数组。 使用范围&#xff1a;需要知道元素大小范围&#xff0c;就是最大值是多少。 【排序算法】计数排序_哔哩哔哩_bilibili 二.基数排序 使用场景&#xff1a;只适用于…...

windows 动态库和静态库 介绍

在Windows平台上&#xff0c;动态库和静态库都是用于组织和共享代码的方式。这些库文件的扩展名和用途有一些区别。 1. 静态库和动态库 静态库&#xff08;Static Library&#xff09;&#xff1a; 文件扩展名&#xff1a;.lib在编译链接时&#xff0c;静态库的代码被直接嵌入…...

微软官方镜像下载大全(windows iso 官方镜像)

原本只是想下一个Windows Server 2022中文版的镜像&#xff0c;后面发现要么就是慢得一批的某盘&#xff0c;要么就是磁力&#xff0c;我想直接下载简简单单&#xff0c;找了一圈没有找到。官网下载需要注册、登录乱七八糟&#xff0c;最终终于找到下载方法了&#xff0c;适用于…...

ceph块存储学习

目录 ceph的组件和功能 ceph的数据读写流程 ceph存储池学习 ceph的组件和功能 Ceph OSD&#xff1a;功能是存储数据&#xff0c;处理数据的复制、恢复、平衡数据分布&#xff0c;并将一些相关数据提供给Ceph Monitor,。 Ceph Monitor: 功能是维护整个集群健康状态&…...

开发模型和测试模型

1. 开发模型 1.1 瀑布模型 瀑布模型是其他模型的基础框架 start—>需求分析---->计划----->设计----->编码----->测试----->End&#xff08;其实就是软件开发的生命周期&#xff09; 特点&#xff1a;线性的开发流程 缺陷&#xff1a;测试被后置。①风险往…...

Kubectl 部署简单应用

创建新服务 kubectl create deployment kubernetes-bootcamp --imagegcr.io/google-samples/kubernetes-bootcamp:v1 查看 kubectl get deployments 打开新的终端执行 kubectl proxy 此时&#xff0c;切回上一个终端&#xff0c;通过 kubectl get pods 可查看已部署好的pod。并…...

Flink电商实时数仓(三)

DIM层代码流程图 维度层的重点和难点在于实时电商数仓需要的维度信息一般是动态的变化的&#xff0c;并且由于实时数仓一般需要一直运行&#xff0c;无法使用常规的配置文件重启加载方式来修改需要读取的ODS层数据&#xff0c;因此需要通过Flink-cdc实时监控MySql中的维度数据…...

四种消息队列,如何选型

这篇文章&#xff0c;主要讲述 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 这 4 种消息队列的异同&#xff0c;无论是面试&#xff0c;还是用于技术选型&#xff0c;都有非常强的参考价值。 01 消息队列基础 1.1 什么是消息队列&#xff1f; 消息队列是在消息的传输过程中保存消…...

flutter开发windows应用的库

一、window_manager 这个插件允许 Flutter 桌面应用调整窗口的大小和位置 地址&#xff1a;https://github.com/leanflutter/window_manager二、win32 一个包&#xff0c;它使用FFI包装了一些最常见的Win32 API调用&#xff0c;使Dart代码可以访问这些调用&#xff0c;而不需…...

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...