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

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

4309353b7b89a7aad50f02be6105f991_608a5012fcc24ab9b0bb06839236c25b.png

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_width
 number_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_number
 alien.rect.x = alien.x
3 alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
 aliens.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所示

2c4431d692a7c0b41b851bf0c263aeab_ec3f2d64eefe411fbb5ed9b9b46e0430.png

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

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 = 1
 self.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 True
 def 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,从而将外星人向左移。

目录
相关文章
|
1月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
|
3月前
|
Python
python知识点
【8月更文挑战第27天】python知识点
3398 2
|
21天前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
24 1
[Python]知识点
WK
|
3月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
34 0
|
1月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
1月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
1月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
1月前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
1月前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
1月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
下一篇
无影云桌面